首页 理论教育VC++MFC视频教程:调用非模式对话框

VC++MFC视频教程:调用非模式对话框

【摘要】:打开本章第1节建立的“Test”工程,本节继续演示非模式对话框的调用过程。1)通过菜单命令或者按快捷键<Ctrl+1>再插入一个对话框,用于测试非模式对话框,如图4-9所示。7)非模式对话框的特点如下。①在关闭模式对话框前,不阻挡对背景窗口的操作。②使用CDialog::Create函数创建非模式对话框,该函数是非阻塞函数。

打开本章第1节建立的“Test”工程,本节继续演示非模式对话框的调用过程。

1)通过菜单命令或者按快捷键<Ctrl+1>再插入一个对话框,用于测试非模式对话框,如图4-9所示。

2)修改对话框的ID属性为IDD_CHATDLG,修改外观并添加一些控件,如图4-10所示。

978-7-111-46378-8-Chapter04-11.jpg

图4-9 插入对话框资源用于测试非模式对话框

978-7-111-46378-8-Chapter04-12.jpg

图4-10 修改对话框外观

3)选中编辑好的对话框资源,执行View→ClassWizard命令,或按快捷键<Ctrl+W>打开类向导。像上节一样,创建一个CDialog派生类“CChatDlg”,如图4-11所示。

4)单击“OK”按钮关闭类向导后,在主对话框中双击“聊天”按钮,建立消息映射函数,如图4-12所示。

978-7-111-46378-8-Chapter04-13.jpg

图4-11 创建与对话框关联的类

978-7-111-46378-8-Chapter04-14.jpg

图4-12 建立按钮消息映射函数

5)编写OnChat函数代码。(www.chuimin.cn)

978-7-111-46378-8-Chapter04-15.jpg

6)编译并运行,测试代码,如图4-13所示。反复单击主对话框中的“聊天”按钮,弹出多个聊天对话框。

7)非模式对话框的特点如下。

①在关闭模式对话框前,不阻挡对背景窗口的操作。

②使用CDialog::Create函数创建非模式对话框,该函数是非阻塞函数。因此,必须在堆空间内(new)申请对话框类对象,不能在栈内申请临时对象。因为临时对象在离开函数体时会自动销毁。

例如,以下代码是错误的,因为申请的dlg就是临时栈内变量

CChatDlg dlg;

dlg.Create(IDD_CHATDLG);

8)模式对话框的特点如下。

①在关闭模式对话框前,无法操作背景窗口,除非自身就是主窗口。

②使用CDialog::DoModal函数弹出模式对话框,该函数执行过程是阻塞函数。因此,在栈内或者堆内申请对话框类的对象都可以,申请栈内变量开发和运行效率高一些。

978-7-111-46378-8-Chapter04-16.jpg

图4-13 查看运行结果