对话框的运行
读完这一章的内容后一共获得以下收获
- 什么是模态(modal)对话框
- 什么是非模态(modeless)对话框
- 对话框时如何运行的
对于什么是模态什么是非模态是根据对话框与其父窗口的关系来确定的
一. 什么是模态对话框
书上的说法: " 屏蔽了父窗口, 直到对话框结束 " 的就是模态对话框, 为了便于记忆我就想象模态就是对话框变成了一个球形的保护膜罩住了父窗口, 如果我们不去弄破这个保护膜就无法使用父窗口<类似屏蔽了呵呵>.
二. 什么是非模态对话框
书上的说法: " 父窗口与对话框同时运行 "
我的看法 : 确实如此
三. 对话框是如何运行的
在了解对话框是如何运行之前, 先来了解对话框是什么以及对话框是如何创建的.
1.对话框包括对话框中的控件其实都是一个个窗口.
2.对话框的创建,从书上得知,以关于About对话框为例.做出一个对话框必须有如下两个东西
① 对话框模板(dialog template), 这是在RC文件中定义的一个对话框外貌, 以各种方式决定对话框的大小,字形,内部有哪些控件,各在什么位置等等.
(思考: RC文件是什么现实中是长什么样子的.)
{验证: 在VS2013中打开一个RC文件会直接跳转到资源视图之中, 可通过全局查找ID的方式来打开文本文件}
IDD_ABOUTBOX DIALOGEX 0, 0, 170, 62
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "关于 对话框的运行"
FONT 9, "MS Shell Dlg", 0, 0, 0x1
BEGIN
ICON IDR_MAINFRAME,IDC_STATIC,14,14,20,20
LTEXT "对话框的运行,1.0 版",IDC_STATIC,42,14,114,8,SS_NOPREFIX
LTEXT "Copyright (C) 2022",IDC_STATIC,42,26,114,8
DEFPUSHBUTTON "确定",IDOK,113,41,50,14,WS_GROUP
PUSHBUTTON "Button1",IDC_BUTTON1,18,41,50,14
END
②对话框函数(dialog Procedure), 其形态非常类似窗口函数, 但是它通常只处理WM_INTIDIALOG, WM_COMMAND两个消息, 对话框中的控件是一个个小窗口, 他们与对话框之前的交互是通过发送WM_COMMAND的方式进行的, 最后通过控件各自的ID号来判断是谁发送的.
(思考: 要是是同一个控件需要两种不同的处理是怎么实现的呢, 假如一个按钮要处理一个单击, 和一个双击)
{验证: 通过查看代码发现在案例中的同一个ID号可以有不同的消息处理函数
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON1, &CAboutDlg::OnBnClickedButton1)
ON_BN_DOUBLECLICKED(IDC_BUTTON1, &CAboutDlg::OnBnDoubleclickedButton1)
END_MESSAGE_MAP()
这就很奇怪了, 按照上一章的描述来看, 一个WM_COMMAND消息中的wParam参数中的ID号只能对应一个消息响应函数, 可是在这里一个ID号却出现了两个消息响应函数是怎么实现的呢?只能通过更加深入的学习来了解了.
}
我们现在再来看对话框的运行
modul对话框的运行和结束(Win32)靠的是DialogBox, EndDialog两个函数来实现的
1.DialogBox
1.1控制权交给 对话框函数
2.消息循环(GetMessage阻塞)
3.结束从对话框函数返回值到DialogBox