1、基于MFC的程序框架剖析
MFC程序首先定义了一个全局应用程序对象theApp(该对象就表示了应用程序本身),使它在WinMain()函数之前执行,全局对象theApp的构造函数调用时就会先调用其基类CWinApp的构造函数,在基类的构造函数中完成程序的一些初始化的工作,并将应用程序对象的指针保存起来。然后才进入WinMain()函数,MFC中WinMain()函数是程序编译链接时,由链接器将该函数链接到程序中的。WinMain()函数调用AfxWinMain()函数,在AfxWinMain()函数中注册、创建、显示和更新窗口、进入消息循环,因为设置了默认窗口过程故不必再自定义窗口过程。
MFC程序并不是把所有消息都交给默认窗口过程函数DefWindowProc,而是采用消息映射机制来处理消息(标准消息、命令消息、通告消息)。
2、单文档MFC程序结构
单文档MFC程序自动生成5个类,以Test程序为例:
CTestApp应用程序类:用来定义全局应用程序对象,代表应用程序本身,基类为CWinApp;
CMainFrame框架类:表示整个框架窗口,基类为CFrameWnd;
CTestView视类:表示客户区窗口,显示和修改数据,基类为CView;
CTestDoc文档类:用于存储和加载数据,基类为CDocument;
CAboutDlg对话框类:用来显示关于对话框,基类为CDialog;
MFC提供了一个文档/视类(Document/view)结构,数据的存储和加载由文档类来完成,数据的显示和修改则由视类来完成,从而把数据管理和显示方法分离开来。
框架类窗口是视类窗口的父窗口,视类窗口始终覆盖在框架类窗口之上,故鼠标单击、鼠标移动等消息只能由视类窗口捕获。
可以利用函数GetParent()获得父窗口的指针,返回类型为CWnd*,故使用时应进行类型转换。
3、窗口类对象与窗口的关系
当一个窗口销毁时,它会调用CWnd类的DestroyWindow()函数,该函数销毁窗口后将CWnd成员变量m_hWnd设为NULL,C++窗口类对象的生命周期和窗口的生命周期是不一致的,它们之间唯一的关系式窗口类对象的内部定义了一个窗口句柄变量m_hWnd,保存了与这个窗口类对象相关的那个窗口的句柄。窗口销毁时,与之对应的窗口类对象销毁与否要看其生命周期是否结束,但窗口类对象销毁时,与之相关的窗口也将销毁。
4、CButton按钮类
在窗口中显示一个按钮需要两个步骤:1、定义CButton对象,2、调用CButton::Create()函数创建按钮(按钮类型应指定WS_VISIBLE风格)。
virtual BOOL Create( LPCTSTR lpszCaption, //按钮文本 DWORD dwStyle, //按钮的风格 const RECT& rect, //按钮显示的位置和大小 CWnd* pParentWnd, //指定父窗口 UINT nID //按钮控件ID );
应用下面的窗口风格到按钮控件:
-
WS_CHILD Always
-
WS_VISIBLE Usually
-
WS_DISABLED Rarely
-
WS_GROUP To group controls
-
WS_TABSTOP To include the button in the tabbing order
应用下面的按钮风格到按钮控件:
-
BS_PUSHBUTTON Creates a command button that sends aBN_CLICKED notification to the owner window when the user clicks the button
-
BS_OWNERDRAW Creates an owner-drawn button
-
BS_CENTER Centers text horizontally in the button rectangle
.......
eg:
static CButton myButton;
myButton.Create(_T("按钮1"), WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON, CRect(0,0,100,50), this, 110);
5、WM_CREATE消息
当调用CreateWindow或CreateWindowEx创建窗口的时候系统会发送WM_CREATE消息(对应消息处理函数OnCreate),但是这个消息是在CreateWindow(CreateWindowEx)返回之前发送的。如果一个程序处理这个消息,那么(在OnCreate中)应当返回0以使得窗口的创建过程得以继续。如果对于这个消息程序返回-1,窗口将会被销毁,并且CreateWindowEx或者CreateWindow函数将会返回一个值为NULL的句柄。