首页 > 代码库 > 《深入浅出MFC》第六章 MFC程序的生死因果
《深入浅出MFC》第六章 MFC程序的生死因果
SDK程序设计的第一要务是理解最重要的数个API函数的意义和用法,MFC程序设计的第一要务则是理解几个最重要的类,最基本的两个类为CWin App和CFrameWnd。
开发MFC程序需要的函数库:Windows C Runtime函数库(LIBC.LIB静态链接版本,MSVCRT.LIB,MSVCRTD.LIB)。DLL Import函数库(GDI32.LIB,USER32.LIB,KERNEL32.LIB等)。MFC函数库(AFX函数库)(MFC42.LIB等)。
STDAFX.h是作为预编译头文件的,由开发环境自动生成。
MFC程序的两个主要的类,CFrameWnd代表主装口,CWinApp是一个全局对象,代表整个Application。
在通常的SDK程序中,程序主体在于WinMain和WndProc。在MFC中CWinApp取代WinMain,CFrameWnd取代WndProc。CWinAPP用来处理程序进入点并启动消息循环,CFrameWnd用来处理消息循环与消息映射。CWinApp中保存由CWnd指针,CWnd表示一个窗口,是CFrameWnd的父类。
CWinApp中的成员变量因为theApp这个全局对象而获得配置与初始化,并且该全局对象一定存在并且是唯一的。App初始化完成后,WinMain登场,WinMain的引入点并不需要程序员添加,而是由链接器直接添加到程序代码中。WinMain的引入点在MFC的WINMAIN.cpp程序代码中。
在MFC的WinMain中通过全局函数AfxGetApp获取全局唯一的Application对象。在获取全局Application后调用全局函数AfxWinInit函数进一步初始化Application对象并设置线程相关设置。继续调用全局Application对象的InitApplication函数,这些操作为MFC内部管理。AfxWinMain之后调用Application->InitInstance函数,注意应用程序一定要改写InitInstance虚函数,因为它在父类中是一个空函数,而通常不需要改写InitApplication和Run。在InitInstance中实例化CFrameWnd对象,这会生成一个窗口,在生成窗口之前会执行窗口注册动作。通过调用类的PreCreateWindow函数进行窗口注册,因此不同的类将使用不同的窗口类。而后InitInstance通过调用ShowWindow显示窗口,通过调用UpdateWindow()发送WM_Paint消息。运行Application->Run以后将启动消息循环,在消息循环中把消息送往MFC全局函数AfxWinProc中,在改函数中MFC采用Messagep map机制进行消息映射。通过MFC特定的消息映射宏,程序员可以很方便的进行消息与处理函数的映射。MFC主要把消息分为三大类,标准Windows消息(WM_xxx形式)的消息处理函数使用系统默认的名称,如OnPaint,OnClose等,因此在Message map机制中不需要指定具体的处理函数,只需调用相应的宏如ON_WM_PAINT()。命令消息的一般形式为ON_COMMAND(IDM_ABOUT,OnAbout)。Notification消息,由控件产生,一般形式为ON_BN_CLICKED(<id>,<memberFxn>)。各个消息的处理函数均应以afx_msg void为函数原型。如果某个消息在MessageMap中没有找到对应的映射记录,则消息会向基类流窜,这称为消息路由,如果一直找不到处理程序,消息将由默认函数来处理。MFC中派生自CCmdTarget的类都可以设定自己的Message Map,因为他们都可以接收到消息。
可以通过调用PostQuitMessage函数发出WM_QUIT消息结束程序,消息循环收到WM_QUIT消息后结束循环,然后调用Application->ExitInstance,然后返回到AfxWinMain结束程序。
注意,如果类的成员函数是一个callback函数,必须使用static修饰。凡声明为static的函数或变量,都不和对象结合在一起,他们属于类的一部分而不属于对象。
通过重写CWinApp的OnIdle函数可以处理空闲时间,重写OnIdle时要Return True。
构造CDialog对话框时,传递对话框的模板资源名称和对话框的Master,然后调用CDialog::DoModal即可显示对话框。MFC提供了多种通用对话框,使用这些对话框非常简单,调用DoModal即可显示对话框,根据DoModal的返回结果获取相应的用户操作结果。
《深入浅出MFC》第六章 MFC程序的生死因果