首页 理论教育VC++MFC视频教程:对话框程序的关闭

VC++MFC视频教程:对话框程序的关闭

【摘要】:当用户单击对话框标题栏上的关闭按钮后,可能顺次发生的回调包括WM_SYSCOMMAND消息、WM_CLOSE消息、CDialog::OnCancel虚函数和WM_DESTROY消息等。打开第1节建立的“Test”工程,本节继续演示对话框关闭过程的回调函数。当单击系统关闭菜单或按钮,或者按<Alt+F4>组合键都不能关闭对话框,对话框不是真正地关闭而只是最小化了。所有以上其他回调函数都发生在对话框消失之前,并且可以取消继续关闭对话框窗口。图4-26 关闭对话框消息的流程

当用户单击对话框标题栏上的关闭按钮后,可能顺次发生的回调包括WM_SYSCOMMAND消息、WM_CLOSE消息、CDialog::OnCancel虚函数和WM_DESTROY消息等。

当用户单击一个系统菜单项,或者单击最大化按钮、最小化按钮、还原按钮或关闭按钮时,窗口将会接收到系统命令消息WM_SYSCOMMAND。在WM_SYSCOMMAND消息或者CWnd::OnSysCommand函数的MSDN说明中,可以了解到所有系统命令更详细的信息。

单击标题栏上的关闭按钮或系统菜单的“关闭”菜单项,或者按快捷键<Alt+F4>等事件,窗口首先接收到WM_SYSCOMMAND消息。在WM_SYSCOMMAND消息映射函数中编写代码,可以实现当单击系统关闭按钮时最小化或者隐藏窗口的功能。

打开第1节建立的“Test”工程,本节继续演示对话框关闭过程的回调函数。

1)在类视图中的主对话框类上单击鼠标右键,在弹出的快捷菜单中,选择“Add Windows Message Handler”命令,如图4-19所示。

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

图4-19 添加WM_SYSCOMMAND消息映射函数

在右下角的消息筛选器“Filter for message available to”中,选择“Window”代表显示所有窗口类支持的消息。在左边列表中选中WM_SYSCOMMAND消息,再单击“Add Handler”按钮或者直接双击该列表项,添加对应的消息映射函数OnSysCommand。

2)单击“Edit Existing”按钮,编辑系统命令消息映射函数代码。

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

3)编译并运行,测试程序。

当单击系统关闭菜单或按钮,或者按<Alt+F4>组合键都不能关闭对话框,对话框不是真正地关闭而只是最小化了。在掌握托盘图标技术以后,通过修改以上回调函数代码,还可以将窗口隐藏为一个托盘图标。

4)WM_CLOSE消息。

WM_CLOSE消息就是WM_SYSCOMMAND消息在接收SC_CLOSE时的分支消息,或者说WM_CLOSE消息是专门用于接收系统命令中的关闭命令的消息。使用WM_CLOSE消息代替WM_SYSCOMMAND消息,处理单击系统关闭按钮时最小化或者隐藏窗口就更容易了。

5)在类视图中的主对话框类上单击鼠标右键,在弹出的快捷菜单中,选择“Add Windows Message Handler”命令,如图4-20所示。

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

图4-20 添加WM_CLOSE消息映射函数

在左边列表中选中WM_CLOSE消息再单击“Add Handler”按钮,或者直接双击WM_CLOSE添加对应的消息映射函数OnClose。

6)单击“Edit Existing”按钮,编辑消息函数代码。

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

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

7)编译并运行,测试程序。

使用OnClose代替OnSysCommand函数,实现关闭时最小化窗口的功能更容易。

8)OnOK和OnCancel函数。

这两个函数一般只在对话框窗口中回调,回调的原因是单击IDOK和IDCANCEL按钮时发出了WM_COMMAND消息。除此以外,在对话框窗口中按<Esc>键时OnCancel函数会发生回调;当焦点在非按钮类型的控件上时,在对话框窗口中按<Enter>键时OnOK函数会发生回调。

9)在对话框资源中双击IDOK或IDCANCEL按钮,可以建立消息映射函数,如图4-21所示。

10)在类视图中的一个对话框类上单击鼠标右键,在弹出的快捷菜单中,选择“Add Member Function”命令,建立普通类成员函数,如图4-22所示。(www.chuimin.cn)

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

图4-21 添加OnOK或OnCancel回调函数

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

图4-22 添加OnOK或OnCancel成员函数

11)在函数类型中填写void,在函数声明中填写函数名OnOK,不带参数,如图4-23所示。

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

图4-23 添加普通类成员函数

12)单击“OK”按钮生成按钮的消息映射函数。

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

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

13)编译运行并测试代码。

分别按<Esc>键,按快捷键<Alt+F4>,单击系统关闭按钮,单击“OK”或“Cancel”按钮进行测试。

14)WM_DESTROY消息。

WM_DESTROY的消息映射函数是OnDestroy函数,这个函数对比以上所有回调函数,是最晚接收到的回调函数。所有以上其他回调函数都发生在对话框消失之前,并且可以取消继续关闭对话框窗口。当窗口已经从视野消失后,OnDestroy回调函数才到达,而且此时已经不再可以取消窗口的关闭过程了。

15)在对话框模板上单击鼠标右键,在弹出的快捷菜单中,选择“Events”命令,弹出简易消息管理器,如图4-24所示。

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

图4-24 打开消息映射管理器

16)选中WM_DESTROY,单击“Add Handler”按钮,或者直接双击该消息,如图4-25所示。

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

图4-25 添加WM_DESTROY消息映射函数

17)单击“Edit Existing”按钮,编辑消息映射函数代码。

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

18)编译运行并测试代码。当对话框已经消失后,OnDestroy函数代码才被执行。

总结以上内容,关闭对话框消息的流程如图4-26所示。

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

图4-26 关闭对话框消息的流程