6.3 非模态对话框
本节将介绍另一类型的对话框,即非模态对话框的使用。这类对话框在没有关闭前,也能允许其他应用程序继续运行,并可以在应用程序间互相切换窗口。因此此类对话框的生存周期较长,也就是说非模态对话框的对象生存周期需要存在于父窗口类对象的整个生存周期。因此需要在父窗口类添加指向非模态对话框类对象的指针成员变量。【实例6-2】 创建非模态对话框
光盘路径 /06/dialog_2/
实例目的 创建非模态对话框
1.创建工程
在IDE中依次选择“File”→“New”菜单命令,或直接按快捷键“Ctrl+N”,打开“New” 对话框。
在“New”对话框中单击“Projects”选项卡,在列表框中选择“MFC AppWizard(.exe)”项,在“Project name”文本框中输入“dialog_2”,其他使用默认值,单击“OK”按钮,弹出“MFC AppWizard-Step1”对话框。
在“MFC AppWizard-Step1”对话框中,选中“Multiple Document”单选按钮,其他使用默认值,然后单击“Finish”按钮,在弹出的“New Project Information”对话框中单击“OK”按钮,就可以完成工程的创建。
2.创建弹出非模态对话框的菜单
在上面创建的对话框中添加一个菜单项下挂一个菜单,菜单命令的消息响应函数用来弹出一个非模态对话框。
下面首先在菜单资源中添加菜单项和下拉菜单。
在工作区的Resource View标签中,双击“dialog_2 resource”→“Menu”→“IDR_dialog_2 TYPE”条目,打开菜单资源。
选中菜单资源中的“查看”菜单,弹出下拉的菜单,选中下面的一个空白菜单项。
单击鼠标右键,选中弹出菜单的Properties菜单命令,弹出属性对话框,单击其中的“Keep Visible”按钮,使属性对话框始终显示在前端。
选中General标签中的“Separator”复选框,在菜单资源中添加一个分隔条,同时在最下面又自动产生一个空白菜单。
选中空白菜单,在属性对话框的General中输入ID_VIEW_MODALLESSDIALOG,在Caption中输入“非模态对话框(&E)…”,同时下面又会自动增加一个空白的菜单。
此时如果编辑、链接和运行程序,可以看到新增加的菜单项是灰色的。下面为刚刚创建的菜单项增加消息响应函数。
通过菜单“View”→“ClassWizard”打开MFC ClassWizard对话框,在Class name项中选择CDialog_2View,在Object IDs中选择ID_VIEW_MODALLESSDIALOG,在Message中选择消息COMMAND,单击“Add Function”按钮添加菜单命令的消息响应函数。函数名取默认值。
下面我们在资源中增加一个非模态的对话框,将标识号设置为IDD_MODALLESS_ DIALOG,其中的控件先保留默认值,然后创建相关类,类名为CDialogModalless,头文件和源文件将会自动设置为CDialogModalless.h和Cdialog Modalless.cpp。具体步骤如下。
在资源编辑器中为dialog_2创建一个新的对话框资源。将鼠标光标移动到对话框编辑器中需要编辑的对话框上,然后单击鼠标右键打开弹出式菜单,选择“Properties”属性,打开“Dialog Properties”对话框,在“ID”输入框中输入“IDD_MODALLESS_DIALOG”。在“Caption”输入框中输入“非模态对话框”。
在对话框中添加一个静态文本。在如图6-2所示的客户区右侧浮动的Control工具栏中的“Static Text”控件按钮上单击,然后在对话框资源中按下鼠标左键拖动,出现一个矩形框,松开鼠标左键,则在对话框资源中出现了一个“Static Text”控件。将鼠标光标移动到此控件按钮上,然后单击鼠标右键打开弹出式菜单,选择“Properties”属性,打开“Dialog Properties”对话框,在“Caption”输入框中输入“弹出非模态对话框”。删除“OK”和“CANCLE”按钮。
用ClassWizard创建与其相关联的对话框类,类名为CDialogModalless,头文件和源文件分别为DialogModalless.h和DialogModalless.cpp。
通过工作区中的ClassView标签,在CDialog_2类中添加一个CDialogModalless类指针:右键单击 “dialog_2 classes”→“CDialog_2View”条目,选中“Add Member Variable”菜单命令,在弹出的对话框中往Variable Type项中输入“CDialogModalless*”,在Variable Name项中输入m_pModallessDlg,单击“OK”按钮。
在dialog_2View.h的头部添加包含语句:
在CDialog_2View类的构造函数中初始化指针m_pModallessDlg:定位到函数CDialog_2View::CDialog_2View。可以通过双击工作区中的ClassView标签中的“Dialog_2 classes”→“CDialog_2View”→“CDialog_2View()”条目实现定位,也可以通过ClassWizard定位。在此函数中加入如下代码:
在CDialog_2View类的析构函数中释放指针m_pModallessDlg分配的空间,定位到函数CDialog_2View::~CDialog_2View(),在此函数中加入如下代码:
编辑、链接和运行程序,测试非模态对话框的效果,在弹出的菜单中单击“查看”→“非模态对话框”,则弹出刚刚创建的新对话框,如图6-23所示。

图6-23 弹出非模态对话框
【责任编辑:
杨硕 TEL:(010)68476636-8001】