#include MainDialog.h
来代替语句
#include exp1Dlg.h
现在程序已经全部完成了。试着编译它,并运行程序。可以看出,程序的运行完全符合要求。
在代码规整时,我们已经对各个语句和函数的含义分别作了解释。下面我们将结合整个程序的理解来帮助读者进一步理解无模式对话框的编制。
在应用开始时,出现一个空的列表框。你可以单击Add按钮来打开一个无模态的对话框。在这个无模态的对话框打开期间,你可以将焦点带回主对话框。当无模态的对话框打开时,主对话框中的Add按钮被禁止使用,这样用户就不能创建无模式对话框的多于一个的实例。
主对话框类CMainDlg管理一个指向无模式对话框的指针。这样做是为了方便,在无模式的对话框对象被创建后,它完全能够自理而不需要主对话框的管理。
单击主对话框中的Add按钮将会调用Create函数而不是DoModal函数来创建无模式对话框。正是因为调用Create函数才使得产生的对话框为无模式的。当对话框被删除时,调用DestroyWindow函数。因为缺省时基类CDialog的成员函数OnOk 和 OnCancel 将会调用EndDialog 函数,所以你必须确保你的无模式对话框没有调用那些函数。相反的,你应该重载它们来调用DestroyWindow函数。
通常,当你创建有模式对话框时,你将在DoModal 函数返回后手工删除它。在显示你的无模式对话框时,既然你不能等待Create函数返回,就需要用一些其他的机制来删除与窗口相关的C++ 对象。在本例中,我们使用一个十分简单的机制。在消息PostNcDestroy对应的处理函数中删除调用本函数的对象(即当前的无模式对话框),该函数在Destroy函数已经删除了对话框的窗口后被调用。
这个无模式对话框通过两种不同的方式同它的父对话框通讯。首先,当用户按下Done按钮时,无模式对话框的编辑控件中的字符串被加入到有模式对话框的列表框中。其次,当用户通过各种途径关闭窗口时,无模式对话框调用有模式对话框的BoxDone函数。该函数简单地重置指向指向有模式对话框的指针,然后再次使Add按钮有效。
在Windows应用程序中,有很多情况下需要使用类似的对话框,如文件的打开和保存、选择程序使用的字体、选择特定的颜色等等。为了避免程序员在这些问题上耗费不必要的精力,MFC提供了通用对话框类,封装了这些经常使用的对话框。
通用对话框类包括:
n CFileDialog类:封装了文件操作对话框;
n CFontDialog类:封装了字体选择对话框;
n CColorDialog类:封装了颜色选择对话框;