当前课程知识点:VC++面向对象与可视化程序设计(上):Windows编程基础 > 第5章 资源在Windows编程中的应用 > 5-3 对话框资源及其应用 > 5-3-1
返回《VC++面向对象与可视化程序设计(上):Windows编程基础》慕课在线视频课程列表
返回《VC++面向对象与可视化程序设计(上):Windows编程基础》慕课在线视频列表
下面我们介绍对话框资源及其使用
对话框大家知道是一个弹出式的窗口
它一般用于用户输入或与用户进行活动的场合
对话框分为模式对话框和非模式对话框
模式对话框不允许用户在关闭对话框之前
切换到应用程序的其他窗口
而非模式允许用户在对话框与应用程序其他窗口之间的切换
非模式对话框是从WinMain函数的消息循环中接收输入的
非模式对话框有时候在有的教科书或有的资料里面
写的是非模态对话框 这是翻译的问题
模式和模态在这个课程里是一样的
非模式对话框与模式对话框相似
但是也有一些区别
非模式对话框通常包含一个标题和一个系统菜单按钮
当建立对话框时,这些是缺省项
而用于非模式对话框的对话框模版的style是这样的
style样式里面多了一个visible
如果省略了visible
那么必须在CreateDialog函数之后执行ShowWindow函数
如果既没有包含visible样式
也没有执行ShowWindow
那么非模式对话框就不会被显示
同时,我们说这个对话框允许使用者使用鼠标或者键盘
将非模式对话框移动到另一个显示区
对于模式对话框,通常用户无须提供标题和系统菜单
因为使用者不能在其下面的窗口中做任何其他事情
也就是说,也没法移动
与模式对话框和消息框的消息不同
非模式对话框的消息要经过程序式的消息队列
要将这些消息传送给对话框窗口消息处理的程序
则必须改变消息队列
方法是这样的:当使用CreateDialog建立非模式对话框时
应该将传回的对话框句柄存储在一个整体变量中
如刚才返回的模式对话框的句柄
并将消息循环改为
如果它等于0,或者DialogMessage是非
两个为真的情况下进行消息循环
也就是说在这里多了一个关于对话框消息的判断
对模式对话框
它的编程方法是这样的
我们定义一个对话框的资源
对话框资源的名字
关键字是DIALOG
这里也有一个载入选项
载入选项确定了对话框的外形
样式大家可以看一下我们下面的列表
对话框的基点和高度、宽度
对话框的控件定义是这样的
对话框里面可以是CheckBox
对话框也可以是一个图标
也可以是一个组合框
列表框、缺省的下压按钮、按钮,这个是单选按钮
以及组框、编辑框、滚动条、静态文本控件等等
这些都可以当作是对话框的控件定义
也就说通过创建对话框资源
我们可以创建很多不同的控件
然后我们调用DialogBox来显示对话框
在DialogBox里面四个参数
第一个参数是当前的实例句柄
第二个是对话框资源的名称
就是对话框资源的名字
第三个是谁拥有这个对话框
拥有对话框的窗口句柄
以及对话框处理函数的地址
这里有一个对话框的消息处理函数
构造对话框消息处理函数
我们用DlgProc
前面是WndProc,这里是DlgProc
在这里也是对消息进行循环
这里也是四个参数跟前面非常相似
这里面有一个switch消息
消息里面初始化对话框
对话框里面对消息进行判断
这是对话框消息处理函数的构架
对话框里面每个对象都有一个ID
取它的ID的字参数的低字节
ID遇到哪一个ID的时候就做switch case构架的判断
这个我们后面会通过具体的例子给大家做介绍
在对话框消息处理函数中,我们主要处理以下两类消息
一个是INITDIALOG
对话框在响应INITDIALOG消息时
完成了对话框的初始化
这个功能与前面主窗口函数的COMMAND消息非常类似
第二个我们在对话框里面要响应COMMAND消息
对话框在响应COMMAND消息时
通过字参数的低字节
与对话框控件上面的ID相比较
以确定是哪一个对象发生了请求
然后我们就转入对哪一个对象请求的响应
最后完成对话框操作之后
要通过EndDialog来关闭对话框
Windows消息框实际上是模式对话框的一种特殊形式
应用程序可以通过调用MessageBox
生成一些简单的但又非常常用的消息框
这个我们在前面讲到键盘操作的时候
曾经用过消息框MessageBox
来指示我们的光标位置
是否已经到头或者已经结束
大家可以复习一下我们前面上一讲的例子
键盘鼠标那一章的例子
那么MessageBox里面
第一个参数是拥有消息框的窗口
第二个就是消息框中要显示的字符
第三个是作为消息框标题的字符串
以及指定的消息框的内容
内容实际上是一些标识
比如说有CANCEL TRY CONTINUE
是Cancel、Try Again和Continue的一个消息框
如果是ICONEXCLAMATION或者是ICONWARNING
那么出现一个含有惊叹号图标的消息框
常用的是MB_OK
是含有一个OK按钮的消息框
这些都可以混用
大家有兴趣的话把这些标识都给测试地用一遍
看看它变成什么样的
我们下面通过一个例子来介绍模式对话框的应用
这个例子是这样的
当程序运行后,单击“文件”下拉菜单时
就出现这个消息框说“文件已经打开”
这里有个“确定”
这个“确定”按钮就是标识里面
dwType标识里面的MB_OK
所以就出现一个确定按钮
如果单击“文件”下拉菜单中的“保存”选项
弹出这个对话框
如果单击“帮助”下拉菜单中的“关于”菜单项的时候
就弹出这个对话框来
我们把程序运行一下
大家看到如果这个打开的时候
其他的菜单都不能操作了
这就是模式对话框的特点
那我们来看一下这个代码怎么实现
我们在这里打开编译环境给大家做介绍
我们首先看cpp文件
cpp文件在这个地方增加了一些内容
因为有菜单就有加速键资源
所以这个跟前面加速键资源里面用的
TranslateAccelator(是一样的) 大家已经了解过了 我就不细讲了
在窗口的消息处理函数里面
我们取它字参数的低字节
低字节是菜单项的ID
这个菜单的ID就是IDM_OPEN
就是打开的菜单项的ID
这里有快捷操作Ctrl+O、Ctrl+S
所以快捷键里面就有TranslateAccelator
就是这么回事
这里面对Open
我们打开后就出现“文件已经打开”
这个代码是MessageBox“文件已经打开”
然后这里出现了一个MB_OK
就是这个确定按钮
这个对话框的出现是这个代码完成的
保存的时候出现文件已经保存成功
这么一个消息框
这个消息框保存的时候
这里出现“文件保存成功”一个确定按钮
实际上是这个代码完成的
退出的时候是SendMessage发送消息给DESTROY
DESTROY是PostQuitMessage
这是退出应用程序
这两个对Open和Save都是通过MessageBox消息框来显示
但是大家注意到按关于的时候好像跟前面的不一样
关于ABOUT的时候是通过DialogBox消息框来处理
这里面是对About
这几个参数根据刚才讲的PPT自己去对一下
在这个窗口里面执行About操作
怎么操作?通过DlgProc对话框消息处理函数来完成
所以对About操作的时候实际上是
通过对话框消息处理函数来完成的
我们找一下对话框消息处理函数
对话框消息处理函数
第一步:进行对话框的初始化
然后 弹出了对话框之后
我们看对话框里面有一个对象是确定按钮
这个确定按钮的ID就是IDOK
所以单击确定按钮的时候
这个对话框关闭
所以case IDOK的时候是EndDialog
关闭这个对话框
CLOSE也是关闭
这个可以CLOSE 也是关闭
那么关闭对话框是这样
我们讲了对话框创建
通过文件打开MessageBox创建的对话框
包括对话框消息处理函数创建的对话框
那这些菜单怎么来的
我们看菜单资源
实际上我们创建了菜单资源
文件里面有一个打开
然后这里有一个分割线
文件打开这里有一个分割线
保存完以后这里还有个分割线
所以“保存”、“分割线”、“退出”
这里面由于设置了加速键
Ctrl+O是显示在这个地方的
\t是跳出一个输出区,为了对齐
&O表示它的加速键
OPEN SAVE EXIT都给他定义了
还有个POP弹出的帮助菜单
里面就是一个菜单项“关于”
这里面就有一个“关于”
还定义了一个加速键O和S
所以这里面就有一个加速键
这里实际上是菜单里面的东西
菜单里面的东西
我们这里通过这个对话框
我们这里通过“帮助”的“关于”这个菜单项
弹出这么一个对话框
这个对话框是怎么创建的
这个不像前面这个
我们通过MessageBox创建
系统创建
这个创建是我们要人工创建
创建完通过这个对话框处理函数
进行初始化对话框来完成
创建对话框我们创建了About对话框
这是基点,这个是宽度和高度
样式是窗口的弹出式样式
而且带了一个caption 叫做关于
所以这个地方就有一个关于
这是caption
这个字大家看到是楷体 这个也是楷体
这个FONT是字号为18的楷体
这个菜单是属于SYSMENU
所以这个菜单不是动态加载的 直接就有了
字体里面18号是楷体
而且是CTEX,说明文本是在对话框的中心
C代表Center
大家看到这个文字都在对话框的中心
而且显示的内容是Windows模态对话框
这里显示了Windows模态对话框
这里面还有一个确定按钮
确定按钮怎么出来的
是缺省Default DEF是缺省的
PUSHBUTTON下压式按钮
ID是IDOK
按钮上面写的是确定两个字
这个是按钮的大小 基点加长宽
这样的话,这个按钮就画上去了
所以这个时候
IDOK是在这里定义的
所以在cpp文件里面
在对话框处理函数里面
它就有一个对IDOK的判断
这个IDOK怎么来的
是在这里给它定义的
那么我们看看头文件里面
头文件里面并没有定义IDOK
只是定义了这三个菜单项加上About菜单项
所以头文件里面定义的是菜单项里面的东西
而对话框里面对象的ID
是在资源里面定义的
不是在头文件里面定义的
当然资源里面
由于用到了这些ID
这些ID是在头文件里面定义的
所以在资源文件里面要include嵌入这个头文件
关于这个例子我们就介绍到这儿
-讨论实录
--0-0
-1-1 Windows应用程序的特点
--1-1
-1-2 可视化编程
--1-2
-1-3 关于API
--1-3-1
--1-3-2
-1-4 Windows应用程序组成及编程步骤
--1-4-1
--1-4-2
-1-5 应用程序举例
--1-5-1
--1-5-2
--1-5-3
-02-1 Windows图形设备接口
-02-2 绘图工具与颜色
-02-3 常用绘图函数
-02-4 例题和作业
-第2章源代码
--外部链接
--外部链接
-3-1 设置文本的设备环境
-3-2 文本的输出过程
-3-3 例题和作业
-第3章源代码
--外部链接
-4-1 Windows 应用程序中的键盘与鼠标
--4-1
-4-2 键盘的操作应用举例
--4-2
-4-3 例题
--4-3
-4-3 鼠标在应用程序中的应用
--4-3
-4-4 例题4-4
--4-4
-第4章源代码
--外部链接
-5-1 菜单和加速键资源及其应用
--5-1
-5-1(例1)
--5-1(例1)
-5-2 位图资源及其应用
--5-2
-5-3 对话框资源及其应用
--5-3-1
--5-3-2
-5-4 图标资源的应用
--5-4
-第5章源代码
--外部链接
-第一次作业
--第一次作业--作业
-第二次作业
--第二次作业--作业
-第三次作业
--第三次作业--作业