手工写MFC应用程序

来源:互联网 发布:linux tomcat 日志 编辑:程序博客网 时间:2024/04/29 17:18
//Hello.h
class CmyApp : public CwinApp
{
public:
virtual BOOL InitInstance();
};
class CMainWindow : public CFrameWnd
{
public:
CMainWindow();
protected:
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP()
};

//Hello.cpp
#include <afxwin.h>
#include "Hello.h"

CMyApp myApp;

// CMyApp member functions

BOOL CMyApp::InitInstance()
{
m_pMainWnd = new CMainWindow;
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}
// CMainWindow message map and member functions

BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()

CMainWindow::CMainWindow()
{
Create(NULL, _T("The Hello Application"));
}
void CMainWindow::OnPaint()
{
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
dc.DrawText(_T("Hello,World"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}

应用程序对象
CWinApp:你可以从CWinApp类派生出自己的应用程序类,然后声明该类的全局应用程序对象,以便在应用程序开始时该对象便在内存中被实例化。应用程序对象提供了成员函数以初始化并运行你的应用程序。一般在从CwinApp派生出自己的应用程序类时,只需要覆盖InitInstance()成员函数即可。

InitInstance()函数
CwinApp::InitInstance()是一个虚函数。
可以覆盖该成员函数来初始化你的应用程序。在该函数中,你一般要创建你的应用程序的主窗口(构造一个窗口对象),并让CwinThread::m_pMainWnd指向它。在该程序中是用如下语句实现的:
m_pMainWnd = new CMainWindow;
但是光创建一个窗口并不会在屏幕上显示它,你仍然要调用窗口对象的ShowWindow()和UpdateWindow()成员函数。ShowWindow()成员函数使窗口可见,UpdateWindow()成员函数发送一条WM_PAINT消息来更新窗口的客户区。

框架窗口对象
CFrameWnd类派生出来的CMainWindow类构成了该应用程序的框架窗口类。该类的声明中包含一个构造函数和一个处理WM_PAINT消息用来绘制窗口的函数OnPaint(),另用DECLARE_MESSAGE_MAP()语句声明了一个消息映射。该类的构造函数生成了在屏幕上看到的窗口:
Create (NULL, _T ("The Hello Application"));
参数中NULL表示使用默认的窗口类,后面的一个参数标识了窗口的标题名。

绘制窗口
应用程序不能随心所欲地在屏幕上进行给制,它必须通过响应来自Windows的WM_PAINT消息进行绘制,此消息通知它该更新窗口。

消息映射
CMainWindow类的声明中DECLARE_MESSAGE_MAP()语句声明一个消息映射。
消息映射是一个将消息和成员函数相互关联的表。当应用程序框架窗口接收到一个消息时,MFC将搜索该窗口的消息映射,如果存在一个处理该消息的处理程序就调用它。
消息映射是避免使用冗长虚表的一种方式。