MFC的 程序框架:
WinMain函数:程序首先到达全局变量theApp,再到达theAPP的构造函数,最后到达WinMain函数处。
问:为何要定义一个全局对象theAPP,让其在WinMain函数之前执行?
答:在win32应用程序中,应用程序的实例是由实例句柄hInstance来标识的,对于MFC程序,通过产生一个应用程序的对象来唯一标识应用程序的实例,每一个MFC程序有且仅有一个从应用程序类CWinAPP派生的类,有且仅有一个从该派生类的实例化对象。
MFC消息映射机制的具体实现方法:在每个能接收和处理消息的类中,定义一个消息和消息函数静态对照表,在消息映射表中,消息与对应的消息处理函数指针式成对出现的。某个类能处理的所有消息及其对应的消息处理函数的地址都列在这个类所对应的静态表中。当有消息需要处理时,程序只要搜索该消息静态表,查看表中是否含有该消息,就可知道该类能否处理此消息,如果能处理该消息,则同样依据静态表能很容易的找到并调用对应的消息处理函数。
模态对话框和非模态对话框的区别:
按工作方式不同,可将对话框分成两类:
1、模态对话框:在关闭模式对话框之前,程序不能进行其他工作(如一般的“打开文件”对话框)
创建模态对话框
CTestDlg dlg;
dlg.DoModal();
2、 非模态对话框:非模态对话框打开后,程序仍然能够进行其他工作(如一般的“查找与替换”对话框)
CTestDlg * dlg = new CTestDlg; dlg->Create(IDD_TEST_DLG); dlg->ShowWindow(SW_SHOW);
因为是用new操作符构建非模态对话框对象,因此必须在对话框关闭后,用delete操作符删除对话框对象。在屏幕上一个窗口被删除后,框架会调用CWnd::PostNcDestroy,这是一个虚拟函数,程序可以在该函数中完成删除窗口对象的工作,具体代码如下:
void CModelessDialog::PostNcDestroy { delete this; //删除对象 CDialog::PosNcDestroy(); }
这样,在删除屏幕上的对话框后,对话框对象将被自动删除。拥有者就不必显式地调用delete来删除对话框对象了。