《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消息:

 

posted @ 2016-07-13 18:01  _No.47  阅读(910)  评论(0编辑  收藏  举报