《Windows编程循序渐进》——对话框应用程序
- 使用MFC创建模态对话框
模态对话框分为两种,一种是使用API实现的模态对话框,一种是使用MFC实现的模态对话框。
举个例子:
这是因为,模态对话框的产生会屏蔽其他窗体的消息。
我们新建一个项目。再创建一个对话框:
我们的目的是点击第一个对话框中的按钮,而弹出第二个对话框。双击按钮:
注意,这里的成员函数的名称是根据Button的ID号进行重命名的。
然后还要给新添加的对话框添加类,我们可以右键添加类或者双击添加类。
回到解决方案,就可以看到MyModalDialog的cpp和h文件就出现了:
随后我们在第一个Dialog的Button中添加代码。添加代码时,先添加头文件:
利用DoModal:
Alt+B再按R,重新编译,并运行。单击按钮打开ModalDialog后,点击其他地方,不会有相应:
- 使用Win32API创建模态对话框
相关的API有DialogBox、DialogBoxParam。
因为是使用Win32 API插入,所以不需要给新的对话框创建一个类。
给下面的按钮添加消息响应:
其中回调函数DialogProc代码如下:
NT_PTR CALLBACK DialogProc(HWND hWndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam){ switch (uMsg){ case WM_INITDIALOG://处理对话框初始化消息 return TRUE; case WM_COMMAND: { switch (LOWORD(wParam)){ case IDCANCEL://响应对话框结束消息 ::EndDialog(hWndDlg, 0); return TRUE; } } break; } return FALSE; }
运行试验下:
如果点击取消,就会执行DialogProc中的
这段代码。
注意,每次重新给空间的ID命名之后,双击这个空间进入到消息响应函数都会是新的:
所以,你必须重新写内容。
- MFC实现非模态对话框
运行效果如下:
- Win32API实现非模态对话框
运行效果如下
基于对话框的应用程序的整体架构是这样的:
- 多页面切换程序
新建一个工程之后,添加资源:
展开Dialog:
我们这里添加SMALL。
在解决方案中右键添加类PropSheet:
将刚刚建立的三个PropPage关联到类PropPage:
Sheet框架中要用到三个Page,需要在MySheet头文件中包含这几个Page头文件:
随后在它的头文件中添加三个Page成员:
再在MySheet的cpp文件中添加Page:
接下来来到应用程序对应的cpp文件中(MFCMultiPage对应的是这个应用程序,而MFCMultiPageDlg对应的是那个对话框):
添加代码:
这里注释掉了Dialog的显示,所以运行后不会有Dialog的生成:
运行后,显示:
我们来梳理一下编写MultiPage的流程,Sheet是用来容纳那些Page的:
- 向导对话框
与上面不同,只是这里添加了这些代码:
此时如果运行的话,我们无法调到第三步:
我们发现原来是在MyPage3.h文件中这里没有改过来:
现在我们来重写OnSetActive来定义每个Page之间的动作:
首先打开类视图:
双击目标类:
选择这里:
添加OnSetActive:
我们在第一个Page中添加代码:
这样,第一个Page只能往后跳。
在第二个Page中添加代码:
这样,第二个页面可以往后跳也可以往回跳。
再在第三个Page中添加代码:
这个Page只能往回跳或者结束。
三者分别如图所示:
- 控件对齐与排列
添加GroupBox:
添加Text:
添加编辑框:
参考线需要拖动上边的标尺,来实现控件的对齐:
后续的一些操作可以在“格式”中进行其它进一步设置:
Ctrl+D显示逻辑顺序:
我们按下Ctrl+D后,然后鼠标单击来调整顺序:
- 打开和另存为对话框
布局如下:
给第一个编辑框添加成员变量:
给Button添加代码:
运行点击Button之后成功打开对话框:
但是问题来了,为什么我们选中一个文件时,并没有在编辑框中显示它的路径?
还是空白:
原因在于我们没有更新对话框,需要添加代码:
此时再去选中某个文件,就可以显示了:
保存按钮的相关消息响应代码类似:
- 文件过滤+多选
添加列表框并右键添加变量:
代码如下:
点击最下面的Button运行:
弹出筛选+多选框,多选中几个文件:
点击Open,响应IDOK消息: