Hello MFC 之疯狂注释版

回想刚刚学习MFC编程的时候,打开《MFC windows程序设计》这本书,书中给的第一段代码就是一个Hello MFC的小程序。看得我头大,书中讲解的很详细,几乎每行代码都给了解释。但解释归解释,我一行一行的琢磨这些代码,还是不知道它们是什么意思。于是我把代码一行一行的敲到了编译器里,并找着书上的讲解,给每行代码都标上了长长的、详细的注释。尽管有的注释写上去后我还是不懂,但总算完成了这个HelloMFC 之疯狂注释版。今天翻出来,贴上来纪念一下。

可以发现,Hello MFC的代码比Hello Win32的代码少了很多。不得不说MFC确实让我们开发Win32程序更方便。MFC的魅力在于对API的封装思想。现在很多SDK开发包尤其是系统SDK,大部分都是基于C语言的类似windows API的形式。如果我们能学习MFC,把这些API以面向对象的形似封装成类库,使用起来会大大方便!面向对象就是好,MFC的亲兄弟ATL里和COM相关的智能类、STL里的迭代器的实现,都是值得我们学习的!


#include <afxwin.h>

class CMyApp:public CWinApp				//定义一个CMyApp类,用于创建程序本身,继承自CWinApp类	
{
	virtual BOOL InitInstance();		//声明InitInstance函数为虚函数
};

class CMyWnd:public CFrameWnd			//定义一个CMyWnd类,用于创建窗口,继承自CFrameWnd类
{
public:
	CMyWnd();							//声明构造函数
protected:
	afx_msg void OnPaint();				//声明OnPaint函数,用于接到消息后重绘客户区
	DECLARE_MESSAGE_MAP();				//声明消息映射
};

CMyApp myapp;										//创建一个CMyApp类的对象myapp,在全局区实例化应用程序对象,一个程序至少有一个应用程序对象

BOOL CMyApp::InitInstance()							//定义InitInstance函数,用于创建并显示窗口
{
	m_pMainWnd=new CMyWnd;							//创建一个CMyWnd对象并把地址赋给CMyApp类的成员指针变量m_pMainWnd
	m_pMainWnd->ShowWindow(m_nCmdShow);				//通过该成员指针调用ShowWindow函数来显示它,参数为WinMain函数穿过来的参数,决定窗口初始为最小化、最大化或正常化
	m_pMainWnd->UpdateWindow();						//刷新窗口,同win32程序设计
	return true;									//初始化程序窗口正常,返回true使程序继续进行如果返回false则程序立即退出
}													//一下三个函数为标识消息的宏
BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd)					//开始消息映射,第一个参数为消息映射所属的类,第二个参数为该类的基类,有了基类名,MFC框架可以再必要时查找基类的消息映射
ON_WM_PAINT()										//接收处理WM_PAINT类型的消息,该消息在拖动窗口边框,改变窗口大小,移动窗口等行为时触发
END_MESSAGE_MAP()									//结束消息映射

CMyWnd::CMyWnd()									//定义CMyWnd类的构造函数
{
	Create(NULL,_T("The Hello Application"));		//创建CMyWnd类对象时执行该构造函数,第一个参数指定了窗口基于WNDCLASS类的名称,这里将其设定为NULL将创建一个基于由主结构注册的WNDCLASS类的默认框架窗口,第二个参数为在窗口标题栏出现的文本
}

void CMyWnd::OnPaint()								//定义CMyWnd类的OnPaint函数,用于重绘客户区
{
	CPaintDC dc (this);								//构造一个名为dc的CPaintDC对象,即设备环境对象,所有的图形输出都通过该类的对象来执行
	CRect rect;										//构造一个代表矩形的CRect对象rect
	GetClientRect(&rect);							//调用winAPI函数GetClientRect以使用窗口的客户区坐标来初始化rect这个矩形
	dc.DrawText(_T("Hello,MFC!"),-1,&rect,			//调用CDC类的DrawText函数来在客户区中间显示"Hello,MFC!"字符串,第一个参数为要显示的字符串,第二个参数为要显示的字符串中的字符数,这里是-1意味着不限定,该字符串是以NULL字符终止的。第三个参数为刚刚新建的CRect类的对象rect的地址,这里也可以是一个指定格式矩形的一个RECT结构
		DT_SINGLELINE|DT_CENTER|DT_VCENTER);		//第四个参数为输出选项,DT_SINGLELINE代表单行文本,DT_CENTER和DT_VCENTER代表在格式矩形中水平居中和垂直居中
}


你可能感兴趣的:(Hello MFC 之疯狂注释版)