/*CMyApp继承了CWinApp类,因此它就是应用程序对象。
CWinApp类提供消息循环和调度。一个MFC应用程序可以有且仅有一个应用程序对象。此对象必须在全局声明内有效。
*/
class CMyApp:public CWinApp
{
public:
virtual BOOL InitInstance();
/* 上面这个函数是从CWinApp覆盖的,CWinApp本身具有这个函数,我们的类在此继承了这个函数 */
};
class CMainWindow: public CFrameWnd
{
public:
CMainWindow();
protected:
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP ();
};
Hello.h ↑
Hello.cpp↓:
#include <afxwin.h>
#include "Hello.h"
CMyApp myApp;//看到了么,结合头文件的注释
/*
myApp就是CMyApp的实例,而这个实例必须是全局范围内有效的,因此我们声明其为全局变量。
*/
BOOL CMyApp::InitInstance()
{
/* 这个函数就是刚才提到的,从CWinApp继承过来的函数的具体实现。虚函数(Virtual function)。
请注意!这个函数是CWinApp自身拥有的,由于继承关系,CMyApp才有了这个函数。这个函数的调用
非常之早,是在应用程序开始之后而窗口被创建之前,可以看到,下面的操作全是窗口操作。
Pdf 16,Page 35/1187
事实上,除非InitInstance创建一个窗口,否则应用程序是不会创建窗口的。这就是为什么就算是最小的
MFC应用程序也必须从CWinApp类派生出一个类并覆盖CWinApp::InitInstance()这个函数。
在CWinApp(不是这里的CMyApp!)中,InitInstance是一个虚函数。只有一句return TRUE。
这个函数的目的是给应用程序一个初始化的机会。由该函数返回的值决定了应用程序框架的下一步动作。
如果该函数返回FALSE,那么应用程序将被关闭。如果初始化正常,那么就返回TRUE,应用程序将继续执行。
这个函数是执行初始化的地方。在这里,这个工作就是创建一个窗口。
*/
m_pMainWnd = new CMainWindow;
/*这里,实例化CMainWindow类来创建一个窗口。
这里创建了一个CMainWindow对象将其地址复制到了应用程序对象的m_pMainWnd数据成员里面。
在窗口创建之后,InitInstance就会通过CMainWindow指针调用ShowWindow和UpdateWindow来显示它。
*/
//m_pMainWnd->ShowWindow(argument lists....);
//m_pMainWnd->UpdateWindow(argument lists....);
/*
ShowWindow和UpdateWindow是所有窗口对象共用的CWnd成员函数。其中就包括了CFrameWnd,而CMainWindow就是从CFrameWnd派生出来的。
这些函数几乎就是对同名API函数的包装。
*/
/*
如果你想在MFC应用程序中调用一个WIN API函数,那么需要在函数名称前面加一个“::”标示符。比如
::UpdateWindow(argument lists...)
这个是保证即便对象有同名的函数,也可以调用API函数。其他代码中的调用都是这么写的。
*/
/*
ShowWindow只接受一个参数,用来表示窗口显示的情况,是最大化,还是最小化还是怎么样。这里直接传递m_nCmdShow是根据Windows App设计协议中的规定
这里的m_nCmdShow通常是SW_SHOWNORMAL
来做的。
*/
m_pMainWnd->ShowWindow(m_nCmdShow);
/*
UpdateWindow是来重绘窗口完成ShowWindow的启动作业的。
*/
m_pMainWnd->UpdateWindow();
/* 完成后,InitInstance返回TRUE让应用程序继续执行。
*/
return TRUE;
}
BEGIN_MESSAGE_MAP (CMainWindow,CFrameWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()
CMainWindow::CMainWindow()
{
/*
在这里,框架窗口创建了一个窗口对象。其方法就是通过调用Create函数。
_T这个函数负责将字符串转化为中性。Create是CFrameWnd继承来的一个CMainWindow成员函数。
在CFrameWnd中,由它自己定义的和从CWnd继承来的函数大约有20个。Create就是其中之一。CFrameWnd::Create的原型参见书中P19。
*/
Create(NULL,_T("The Hello Application"));
};
/*
这个函数负责响应WM_PAINT消息。具体参见P21
*/
void CMainWindow::OnPaint()
{
CPaintDC dc(this);
CRect rect;
GetClientRect(&rect);
dc.DrawText(_T("Hello,MFC"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
}