我们首先看一个例子:
头文件:
//Ruler.h
//CMyApp类代表应用程序本身,CMyApp::InitInstance通过构造CMainWindow对象创建一个主窗口;
//而CMainWindow的构造函数通过Create创建了在屏幕上显示的窗口;
class CMyApp : public CWinApp
{
public:
virtual BOOL InitInstance ();
};
class CMainWindow : public CFrameWnd
{
public:
CMainWindow ();
protected:
//CMainWindow::OnPaint()处理所有的画图任务
afx_msg void OnPaint ();
DECLARE_MESSAGE_MAP ()
};
源文件:
//Ruler.cpp
#include <afxwin.h>
#include "Ruler.h"
CMyApp myApp;
///////////////////////////////////////////////////////////
// CMyApp member functions
BOOL CMyApp::InitInstance ()
{
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow (m_nCmdShow);
m_pMainWnd->UpdateWindow ();
return TRUE;
}
///////////////////////////////////////////////////////////
// CMainWindow消息映射以及成员函数
BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd)
ON_WM_PAINT ()
END_MESSAGE_MAP ()
CMainWindow::CMainWindow ()
{
Create (NULL, _T ("Ruler"));
}
void CMainWindow::OnPaint ()
{
CPaintDC dc (this);
//初始化设备描述表
//设置映射模式
dc.SetMapMode (MM_LOENGLISH);
//设置设备描述表的属性
dc.SetTextAlign (TA_CENTER | TA_BOTTOM);
//设置背景模式,透明
dc.SetBkMode (TRANSPARENT);
// 画标尺的主体
//黄色的画刷被选为设备描述表
CBrush brush (RGB (255, 255, 0));
CBrush* pOldBrush = dc.SelectObject (&brush);
dc.Rectangle (100, -100, 1300, -200);
dc.SelectObject (pOldBrush);
//
// 画散列的刻度线
//
for (int i=125; i<1300; i+=25) {
dc.MoveTo (i, -192);
dc.LineTo (i, -200);
}
for (int i=150; i<1300; i+=50) {
dc.MoveTo (i, -184);
dc.LineTo (i, -200);
}
for (int i=200; i<1300; i+=100) {
dc.MoveTo (i, -175);
dc.LineTo (i, -200);
//CDC::TextOut画出数字标注
CString string;
string.Format (_T ("%d"), (i / 100) - 1);
dc.TextOut (i, -175, string);
}
}
注:C语言中的%d代表整型
标尺的应用程序没有采用把要传递给TextOut的字符串硬编码的方法,而是调用了CString::Format 生成标尺上的文本,CString是描述文本字符串的MFC类,对于CString对象而言,Format就能完成文本格式化,而不调用其它的外部函数。