当前课程知识点:VC++面向对象与可视化程序设计(下):MFC编程基础 > 第7章 Windows标准控件在可视化编程中的应用 > 7-2 按钮控件及其应用 > 128B12447816EEF99C33DC5901307461
返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频课程列表
返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频列表
我们下面介绍按钮控件及其使用
按钮控件分为普通按钮、圆按钮、复选框按钮、组框按钮和自绘按钮
按钮控件的创建过程是这样的
我们可以用CButton类的成员函数Create负责创建按钮控件
Create和前面一样,不再细说
具体可以看MSDN,网址放在这里
按钮控件的样式有这些
比如说,CHECKBOX,AUTOCHECKBOX
这是自动复选按钮
这是自动单选按钮,等等
按钮样式比较丰富
按钮控件的消息,主要的有单击和双击
通过刚才我们简单的创建一个测试按钮
大家已经看到它的消息主要有单击和双击
还有CAMMAND消息
按钮是最常见的控件之一
复选框按钮常用于只有两种完全相反状态的情况
选上,或者不选上
而单选按钮适用于同一组属性相同的数据中选一个数据
下压式按钮适用于消息的发送
分组框按钮没有太多的操作
它只是在窗口中划分区域范围
用来对窗口中的空间进行按功能布局,或者按属性布局等等
它用来画框的,实际上它没有太多的操作
CButton类的成员函数有这么一些
比如说,GetCheck,SetCheck,GetBitmap,设置SetBitmap
也就是按钮上面我们看到的,比如说测试、确定、取消种种文字
实际上
大家玩过游戏都知道
很多按钮下面不设文字
而是位图
所以我们可以设置位图按钮
还有按钮的样式
我们既然可以获取
就可以设置
所以Get和Set在C的系列里面
经常是成对出现的
获取光标
获取图标
获取状态等等
这些大家去看一下Cbutton类
这个类的定义就可以了
那么这个类的定义也可以在微软网站上找到
在知道按钮ID的前提下
还可使用与按钮有关的CWnd成员函数
来设置或者查询按钮状态
MFC还提供了一个CBitmapButton类
允许用户以图标的方式显示按钮
实际上它是CButton下派生的
所以类的层次构架是CButton类下面的CBitmapButton
MFC调用方法DrawItem
方法就是所谓的函数
在按钮上绘制一个位图
实际上这就是自定义的按钮
然后调用LoadBitmaps方法为一个CBitmapButton对象附上位图
把这个位图附上去
通常最多附4个位图
我们下面通过一个例子看看按钮控件的使用
左边这个图
就是程序一执行
它显示的画面
然后我按下第一个按钮
在按钮上的文字就变成“你已按下了按钮”
第二个按钮按下
文字显示为“按钮已被按下”
然后我选择单选、自动单选、复选、自动复选
然后它就变成这样一个界面
这是程序执行之前和执行之后的区别
首先我们创建一个工程文件
工程文件可以在VC++文件夹下面创建
我们选择VC++
选择文件夹
这里的路径就变成VC++
我的工程文件的名字就起成7_1
因为这是这一章第一个例题
选择MFC应用程序
然后“确定”
选择“下一步”
我们选择基于对话框的应用程序
然后我们选择
其它的都是缺省的
我们选择“下一步”
目前没有菜单
把系统菜单去掉
然后现在没有多媒体的内容
暂时还没讲到
我们把ActiveX去掉
因为不去掉的话
系统会给你生成一大堆的文件内容
一大堆的代码
代码实际上我们目前用不到
选择“下一步”
仍然系统这时候由于我们例题的名字叫7_1
所以它就给你生成了CMy7_1App这个类
类的名字就是这一个
它生成两个类
我们就选择它缺省的这个类
然后选择完成就可以了
这个时候我们把这一句提示去掉
把这个“确定”、“取消”,缺省的东西都去掉
这时候大家看到的是一个空的对话框
现在根据这个界面的要求
我们来安下按钮
这个按钮第一个是“这里是一个按钮,按下吧”
这个我们就这个拿过来
Button拿过来
布局上可以放大一点
然后我们选择属性
属性的文字可以修改
修改成我们需要的文字内容
“这里是一个按钮,按下吧”
我们给它改成“这里是一个按钮,按下吧”
好,这一刻这个按钮就生成了
我们先把界面做好
然后一步一步的设置它的相关属性
第二个是“这是缺省按钮,按下看看吧”
我们再安一个按钮
属性里面
“这是缺省按钮,按下看看吧”
好,我们第二个按钮做好了
这时候
我们有一个主框
设置了一个主框
主框刚才给大家说了
它只是用来区域分割
所以没有具体的操作
所以我们就不管它
那么只是把文字属性修改一下
因为我们这个地方要设置单选按钮组
单选按钮组
好,单选按钮
那这个时候我就要放一些单选按钮在这个上面了
单选按钮叫Radio Button
抓一个过来
那么这里面它缺省给你写上Radio
Radio文字我们要改一下
然后我们也是通过属性这个地方去改它
比如说我们改成“单选按钮,你喜欢吗”
我们的文字就改过来了
我们再拉一个单选按钮过来
我们把文字改一下
给它改成“自动单选按钮,看看有何区别”
好,我们把文字改一下
大家看到这里面两个都是按钮
都是单选按钮
所以我这里用一个组框圈起来
叫做单选按钮组
然后我们再安放两个复选按钮
同样我定义一个组框
这个组框叫做复选按钮组
复选按钮组
好,这是组框
这个时候我就要拉出两个复选按钮,叫CheckBox
然后我们再选一个按钮
叫做自动复选按钮
这个时候我们界面就做好了
保存一下
实际上我们把界面做完以后
我们只是改变了它的Caption
实际上它的每个ID
我们是要设置的
我们看这个
看看它属性里面
ID是Button1
这个属性ID是Button2
这个复选系统属性是Radio1
这个是Radio2
这个复选框是Check1
这个是Check2
也就是说这时候
系统为我们定义了每一个控件的ID
但是这些ID你现在可以使用
系统预定义的
当然如果你认为你有更好的定义方式
或者更有利于你识别
或者说其他的需求
你可以改ID
在这个例子里面我们就不去改它的ID了
要注意的一个问题就是
在我们建立了基于对话框的项目或者叫工程文件之后
我们对Radio和Check类型的按钮
如果设置了Auto风格
那么开发者不需要相应按钮的点击消息
按钮会自动响应
如果没有设置这个风格
它就不会自动响应
这个时候我们要把这两个设成自动属性
我们看这个自动属性
那么属性里面什么地方设置自动呢?
这里有Auto
Auto里面这是True
它已经设自动了
那么这个也是给它设成自动
那大家注意这个地方
这个属性就不能给它设成True
那么就不是True
不是自动的
给它设成False
这个复选按钮我们也设成False
那么False意思就是说你要自己去编写它的响应代码
然后我们还有一个地方要注意的就是
这个单选按钮,大家知道
两个单选按钮之间是互斥的
如果三个按钮,四个按钮,五个按钮怎么办呢
那就是说,只要ID是连续的
然后从连续的第一个开始
设置成Group属性
那么这几个ID连续的按钮就产生了互斥的作用
我们设置一下它的Group属性
在属性里面设置一个Group
这里Group属性里面false改成True
那么第一个改成了True
我们仍然保存一下
好了,我们刚才讲到了这两个按钮它们之间要产生互斥作用的话
那两个按钮ID是要连续
ID连续到底是怎么个连续呢?
我们看一下这个文件
resource文件
resource文件里面我们看
Radio1和Radio2
所谓它的ID连续是指这个ID的宏定义的值是连续的
那么这里系统里面由于我们是同时做下来的
正好是连续的
实际上也可能是
你不是同时挨着顺序做下来它不会连续
如果不会连续
你要使若干个Radio单选按钮产生互斥
那么你得把产生互斥的几个单选按钮的值改成连续的
所以这个地方是可以改的
没有关系
大家只要改成连续的就可以了
所以刚才说的ID要连续是指这个地方
resource文件里面的宏定义的整型数要连续
比如这里1002、1003就是连续的
如果这里是1002,这个是1005
这两个不连续
那这样的话,它们两个不起互斥作用
即使你定义了Group
这个组框第一层
把第一个定义成Group
它也不连续
那么也不会互斥
这个问题重点给大家提一下
下面我们就要为这个变量添加消息响应函数
我们要为btn1、btn2、rad1、chk1添加成员变量
用auto风格的控件是不需要添加成员变量的
我们现在要为这个按钮、这个按钮、这个按钮、这个按钮增加成员变量
因为这个是自动的
Auto类型是不需要增加成员变量的
我们看怎么添加成员变量
我们这里单击右键
添加一个变量
这个变量叫m_btn1
我们看一下因为添加这个变量
这个类这个地方有什么变化
我们看一下这个类
就是CMy7_1Dlg里面多了一个这个变量
CButton类的成员m_btn1
我们如法炮制再加一个变量
我们再来观察这个地方的变化
我再增加一个变量
添加变量
这个叫m_btn2,完成
这个时候我们再回过头看一下这个文件
这里又多了一个基于CButton类的m_btn2
同理,我接着增加
我们找到这个单选按钮
我为这个单选按钮添加一个变量
我们为这个单选按钮设置一个变量叫做rad1
我们仍然是设置完成
然后再为复选框设置一个变量
也是添加变量叫m_chk1,完成
这个时候我们再回过头来看一下
我们增加的东西在这个地方
那么大家就弄清楚了
下面我们要做什么呢?
我们要给它映射消息处理函数
为它映射一个消息处理函数
添加事件处理程序
我们现在都是单击
所以我们选的是BN_CLICKED
添加编辑
这个时候我就要编写消息处理的代码
在这里添加直接就上去了
这时候大家看到在这里添加的是SetWindowText“你已经按下按钮”
现在是对哪一个按钮添加这个消息呢?
大家看到我是对Button1
Button1刚才连接了一个变量是m_btn1
好了,我们现在不妨给它测试一下
那这个时候我们回过头来看一下
它生成了m_btn1
然后我们编译一下
我们编译成功了
成功了!我们执行一下
这时候我们按下这个按钮
它显示“你已按下按钮”
但这个时候我如果按这个按钮会有完成吗?
它不会做任何工作
为什么呢?
因为我们还没给它设置消息响应的函数
那我们回过头来看一下
由于我这里添加了一个变量btn1
然后添加了为btn1消息响应的函数
那么在Dlg里面
我们再消息映射的构架里面
就可以看到它对单击的消息针对btn1这个按钮响应的是这个函数OnBnClickedButton1
然后我们在这个地方
在生成的空壳函数里面添加了这么一行代码
m_btn1实际上指的是Button1这个按钮
因为我们为Button1这个按钮添加了这个变量
这个指向的就是Button1的对象
对象里面执行了它的成员函数SetWindowText显示这个字符串
_T这个宏来显示这个字符串
这个字符串就显示在按钮上面了
所以大家看到第一个按钮已经能操作了
我们如法炮制对其它按钮进行消息响应
我们先添加事件处理程序
这时候还是单击
消息类型里面是单击
推荐的函数名是OnBnClickedButton2
我们就不管它了
直接编辑
我们在这里添加响应的代码
好了,我们针对第二个按钮btn2也是给一个提示“按钮已被按下”
同理我们对RadioButton也进行设置消息响应的函数
我们对这个RadioButton添加事件响应程序
缺省的不管了
这时候我给它增加的代码是
m_rad1指向第一个单选按钮
因为单选按钮选上以后有一个黑圈显示它已经选上了
所以是SetCheck(1)
我们不妨执行一下
这时候我们单选按钮就选上了
选上它就变成黑圈了
所以这里SetCheck这个“1”是“真”
真就变成黑圈
然后我们继续为复选按钮添加事件处理函数
大家知道复选按钮选上了再按一下是不选上
所以两者是“真”/“假”关系
也就是说对m_chk1复选按钮选择它的成员函数GetCheck
GetCheck如果大于0
GetCheck就是获取当前状态
如果当前状态处于选上
它的值是大于0的
说明它是“真”
然后就给它变成0
就是变成不选上
else,否则的话
否则也就是说GetCheck是“假”
“假”的话就给它变成“真”就完了
我们再编译运行一下
这时候复选再点上就不复选了
因为这是自动的
我们不要去响应它
它自己会响应
所以不理它了
那么这个应用程序实际上到这儿我们就做完了
做完之后我们再回头来复习一遍
因为第一次给大家讲的细一点
我们对Button2、Radio1、Check1增加的消息响应函数之后
都在这个类里面CMy7_1Dlg都增加了关于响应对象的方法
而这些方法的映射机制同样在这里都可以看到了
也就是说在这里大家看到
这个大家已经熟悉了
对第一个按钮加的是这个函数
第二个按钮加的是这个函数
对第一个单选按钮加的这个函数
对这个复选按钮加的这个函数
两个自动的单选按钮和复选按钮
因为系统完成消息响应的映射
我们就不编写它的映射代码
所以这里就不再生成
所以四个函数分别在后面都编写完了
从第一个是Button1的函数
这是Button2的函数
这是Radio1的函数
这是Check1的函数
我们这个例子就讲到这
-讨论实录
--0-0
-6-1 MFC概述
-6-2 C++的基本知识
--6-2-1 类
--6-2-2 对象
--6-2-6 重载
--6-2-9 指针
-6-3 MFC类的组织结构及主要的类的简介
--6-3-2 根类
-6-4 MFC中全局函数和全局变量
-7-1 概述
--7-1-1
--7-1-2
-7-2 按钮控件及其应用
--128B12447816EEF99C33DC5901307461
-7-3 按钮控件及其应用
--7-3
-7-4 静态控件
--7-4
-7-5 列表框控件
--7-5-1
--7-5-2
-7-6 编辑框控件
--7-6
-7-7 组合框控件
--7-7
-7-8 对话框通用控件
--7-8-1
--7-8-2
-讲义源代码
--html
-8-1&2 资源的应用以及菜单资源的使用
--8-1-1
--8-1-2
-8-3 快捷菜单的创建及其应用
--8-3
-8-4 加速键资源的创建及其使用
--8-4
-8-5 工具条资源的创建及其使用
--8-5
-8-6 字符串资源的使用
--8-6
-8-7 位图资源的创建及其使用
--8-7
-课堂示例源代码
--html
-第一次作业内容及要求
--html
--第一次作业及答题链接--作业
-9-1 概述
--9-1
-9-2 Doc/View框架的主要成员
--Video
-9-3 文档操作中的一些重要概念
--Video
-9-4 SDI编程实例
--Video
-9-5 MDI编程实例
--9-5-1
--9-5-2
-课堂示例源代码
--html
-第二次作业内容及要求
--html
--第二次作业及答题链接--作业
-10-1 利用音频函数实现多媒体程序设计
--10-1-1
--10-1-2
--10-1-3
--10-1-4
-10-2 利用Windows Media Player控件实现多媒体程序设计
--10-2
-课堂示例源代码
--html
-例11-1
--例1
-例11-2
--例11-2
-例11-3
--例11-3
-例11-4
--例11-4
-11-1 ODBC介绍与引用
--11-1
-课堂示例源代码
--html
-第三次作业及答题链接