当前课程知识点:VC++面向对象与可视化程序设计(下):MFC编程基础 > 第7章 Windows标准控件在可视化编程中的应用 > 7-3 按钮控件及其应用 > 7-3
返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频课程列表
返回《VC++面向对象与可视化程序设计(下):MFC编程基础》慕课在线视频列表
现在我们开始介绍滚动条控件
滚动条控件是一个交互式的、高度可视化的控件
它包含一个滑块、滚动条的两端的按钮等
滚动条控件与属于窗口滚动条是不一样的
滚动条控件是由用户创建、管理和释放的
而属于于窗口的滚动条是由窗口的创建、管理和释放的
滚动条类的结构及其方法
请大家参见这个网址
我们滚动条说可以通过通知代码来创建
也可以用对话框资源模板来创建
滚动条控件CScrollBar类也在CWnd类下面
CScrollBar类的方法主要有这些
一个是EnableScrollBar()使滚动条的一个或两个箭头有效或无效
看这里的参数
GetScrollInfo()获得滚动条的消息
GetScrollLimit()获得滚动条的范围
GetScrollPos()获得滚动条滑块当前的位置
GetScrollRange()是获得指定滚动条的当前最大和最小滚动位置
get和set是成对出现的,一个是获取,一个是设置
常用滚动条动作标识有这些
比如滚动条滚动到最顶端或最低端
SB是ScrollBar的缩写,这是动作标识的前缀
LinUup/LineDown,向上/下滚动一行
Left/Right,滚动到左/右边,这是典型的水平滚动条
向上/下,是垂直滚动条
PageuUp/PageDown,是键盘上按键PageUp/PageDown时滚动的情况
ThumbPosition是可以通过鼠标移动滑块到新位置
ThumbTrack是鼠标拖动滑块的过程位置
EndScroll是滚动到最终位置
这些用的非常多
如何创建与初始化滚动条类?
创建滚动条类是通过创建CScrollBar来进行的
可以用C++关键字new和构造函数CScrollBar::CScrollBar()为一个滚动条对象分配一个实例
这是new CScrollBar分配的一个pMyScroll实例,这个实例实际上返回一个指向对象的指针
还可以初始化CScrollBar对象,因为分配实例后要对实例进行初始化
可以通过Create()方法设置参数和样式
Create()里面有四个参数
第一个滚动条窗口样式,第二个是表示控件的大小和位置
第三个是指向控件所属窗口的指针,第四个是父窗口与滚动条通信的标识
在设置滚动条控件时,要设置它的滚动范围
用SetScrollRange()来完成,比如设置滚动范围为-100到100的垂直滚动条
这个pMyScroll就是创建的一个滚动条对象、返回一个指向该对象的指针
pMyScroll下面的成员函数SetScrollRange有三个参数
第一个参数是滚动条的样式
SB_VERT就是垂直滚动条,SB是ScrollBar
后面是范围-100到100
即垂直滚动条的范围是-100到100
程序运行的时候,滚动条滑块会处于一个初始位置
可以通过SetScrollPos()来设置滑块当前位置
如果滑块的位置在-100到100中间,那么就是0
可以通过SetScrollPos()将它设为0,这就是滑块当前的位置
下面我们通过一个例子来介绍一下滚动条类在编程中的应用
我们看这样一个例子,这个是滚动条滚动的范围,我们设置为0-20
单击滑块和箭头之间的区域,滑块上移或下移三格或三个单位
编辑框中的数字加3或减3
这里是编辑框中的数字
大家看现在滑块在滚动条当中
如果这时候是10,单击这个或这个位置,这里编辑框中的值会加3或减3
这是单击向上或向下的箭头,滑块向上或向下移动一格或一格单位
编辑框中的数字加1或减1
编辑框实际上是显示滑块位当前位置的
如果按住滑块上下拖动,编辑框中的数字随之变化
当前的值是10
如果单击Up按钮滑块会移到最上边,编辑框的数字变为0
如果单击Down按钮,滑块移到最下边,编辑框的数字变为20
如果单击Reset按钮,滑块移到中间,编辑框的数字变为10
Reset回到初始状态
单击退出按钮整个程序就执行结束
这个程序是如何编写,功能都给大家讲清楚了
我们要为应用程序设置这些对象
首先有1个滚动条、有1个编辑框、有4个按钮
滚动条、编辑框、按钮分别是IDC_SCROLLBAR\IDC_EDIT\IDC_UP_BUTTON\IDC_DOWN_BUTTON\IDC_RESET_BUTTON\IDC_EXIT_BUTTON
我们下面和大家一起编写这个程序
我们创建一个工程文件,文件的名字叫7_2,因为这是这一章的第二个例子
同样,我们也创建基于对话框的应用程序
我们把不需要的东西暂时都不要,完成
我们首先要做的事情就是对话框的控件对象的布局
我们把原来系统生成的东西都不要了
我们先做什么?
我们先拉4个按钮过来
这个是Up按钮
我们通过设置属性把这个Capition设置成Up
这个时候我们把它的ID设置成IDC_UP_BUTTON
紧接着我们拉一个Down按钮,我们设置它的Caption属性为Down,同时我们设置它的ID为IDC_DOWN_BUTTON
然后设置一个Reset按钮,ID设置成IDC_RESET_BUTTON
我们再设置一个退出按钮,ID设置成IDC_EXIT_BUTTON
这是时候还缺什么?还缺一个很重要的滚动条
拉一个滚动条过来
滚动条,看它属性就没有Caption属性,因为它上面不显示任何文字,所以就没有
我们直接用ScrollBar,系统会生成ScrollBar1,因为可能会有第二个垂直滚动条、第三个垂直滚动条
那么就是123这样排下去
例子上面只有一个滚动条,我们就把1去掉了
我们还缺一个什么东西?
编辑框
因为我们要显示滚动条滑块当前位置的值
所以我们拉一个编辑框过来
编辑框属性里面也是没有Caption的
我们也是把1去掉IDC_EDIT就可以了
现在我们把基本界面弄好了
弄好了之后做什么事情?
我们要为应用程序编写代码了
我们要给滚动条编辑一个变量
为什么我们要给滚动条编辑一个变量?
因为滚动条滑块运动过程中它是有位置值的
而这个值是要编辑框显示的
所以要为滚动条连接变量
连接变量是这样的:为IDC_SCROLLBAR连接一个control类的变量,叫m_Scrollbar
编辑框因为要显示值,所以也得为编辑框连接一个变量
下面我们要为它们分别连接变量
为滚动条添加变量
滚动条添加变量是control类的,变量类型是CScrollBar,它是控件类的
滚动条的名字取做m_Scrollbar,这样完成就可以了
同样我们要为编辑框添加一个变量
我们给它叫做m_edit,确定
好,那么两个变量都添加完了
添加这两个变量后,我们要通过类向导为这个系统添加一个方法
添加一个什么方法?
我们要添加一个ChangeDisplayInfo()
我们这个方法是在哪里加?
是在编辑框中添加
我们通过类向导里面添加方法
添加方法实际上是在对话框里面添加方法
这里面有一个函数名字,函数名字可以取做ChangeDisplayInfo
它里面有一个pos参数,也就是滑块变化位置时的参数
添加完后参数列表就有一个int pos的参数
它的类型实际上是public类型的
我们单击完成
这个时候我们可以看到这里多了一个ChangeDisplayInfo这个方法
好了,我们确定
那么确定完了,在这里就多了一个函数ChangeDisplayInfo()
这是我们自己加进去的
那么这个时候我们定义了一个ChangeDisplayInfo()
这个代码里面定义了一个字符数组sPos[10]
然后这个itow_s()大家都清楚了,是把数字变成字符
SetSel()是对编辑框进行操作,(0,-1)是把原来的值全部选上
然后ReplaceSel(),(m_edit是对编辑框进行操作),选择编辑框的内容,替换成sPos的内容
那么sPos的内容就是随着滑块位置的变化,滑块位置的值
更新就在编辑框显示相应的数值
就是将与空间绑定的变量内容显示到屏幕上
我们刚才处理了控件的显示
我们还有一个动作要求是初始化滚动条
就是程序一运行,它的滑块应该在当中位置
在MFC编程里面是在OnInitDialog()里面进行设置
我们找到OnInitDialog()这个函数
然后在“//TODO:在此添加额外的初始化代码”这个地方增加(代码)
这三行内容是我们增加进去的
我们增加内容是什么?
对滚动条,我们设置滚动条的滚动范围是0-20
设置滚动条当前位置为10
然后调用ChangeDisplayInfo()这个参数是改变显示的信息
这个函数刚才我们已经编完了
里面的参数是滚动条当前位置
GetScrollPos()的当前位置是什么?
因为前面SetScrollPos()为10了,那么它获取的值一定是10
就把10的值传给ChangeDisplayInfo()这个函数
把10传过来后,这里的值就是10,pos的值是10
_itow_s()把10变成字符串放到这个字符数组里面去
然后显示成字符数组里面的字符串
所以这个时候程序运行,在编辑框里面显示的值就是10
初始化之后我们要对滚动条添加消息响应的代码
我们回到资源管理器上
在这里面,我们把对话框调出来
对滚动条进行添加,在类向导里面
我们选择消息里面的垂直滚动条消息
然后添加处理程序
好了,这个时候出现了这个滚动条
然后确定
那么确定之后,这里就出现了一个OnVScroll()函数
现在我们要为OnVScroll()函数编写相应的咨询代码
我们一步一步来介绍它的代码
代码是这样的
首先我们来定义一个参数,整型参数iNowPos就是当前滑块的位置参数
然后通过switch-case构架我们对消息进行响应
看响应到的是什么消息
如果我们获取了pScrollBar,因为我们定义这个滚动条参数
如果我们在对话框中操作了这个滚动条
那么这个时候指针就是指到这个滚动条地址
如果指针指到这个滚动条地址
我们就对滚动条消息进行处理
这个地方是怎么产生的?
是系统自动产生的一个pScrollBar
我们再复习一下前面的内容就知道了
在这里面创建滚动条内容的时候
系统就返回了一个指向滚动条的指针
这个SB_THUMBTRACK就是拖动滑块
对拖动滑块的消息响应是什么?
这个滚动条我们根据它的滑块设置它的滚动位置并把它的值传给ChangeDisplayInfo()这个函数
如果遇到单击滚动条向下箭头
消息名称就是SB_LINEDOW也是获取当前位置
我们说向下箭头是每向下按一次它的值是往下走一格
那么它的值就是+1
再由于我们滑块里面在OnInitDialog()初始化里面已经定义过SetScrollRange()是0-20
那么就存在+1过程中大于20怎么办?
也就是说如果这个值大于20 就给它控制在20
超过20它的值再按向下箭头就按着不动了
+1过程中不会大于20那么它就一直+1
因为如果等于20再+1的话就变成21那就大于20了,就控制在20
那么+1过程中不是等于20的情况或+1大于20给它控制在20的情况下
都把当前的位置信息都设置成当前的值为当前的位置信息
然后都把当前位置的值也传给ChangDisplayInfo()
那么同样LINEUP的情况下,当前位置就-1
但减的过程中,如果当前位置已经为0了,就是到最顶端位置了
再减1就变成-1就小于0了,给它控制在0
这个Range的范围是0-20
同样设置当前位置的值,然后获取这个值传给ChangDisplayInfo()
那么如果单击滚动条下面的箭头与滚动块之间区域的时候
位置的变化是按3变化
那同样大于20的时候控制在20
单击滚动条上面的箭头与滚动块之间的位置按-3进行处理
同理小于0的时候控制在0
这样对滚动条消息的控制就做完了
但是目前还没有对按钮消息进行处理
我们执行一下,大家看
如果我滚动滑块的时候,编辑框里的值会变化
然后向上箭头以1为步长递减
到0的时候再怎么按都不动了
然后往下再怎么按也不动了
然后按中间的位置以3为步长变化
这个时候Up、Down、Reset都不工作
为什么?因为还没对它进行消息响应
那么我们下面对这几个按钮进行消息响应
那么我们下面就对Up添加时间处理程序
然后就按系统提示的缺省的程序名称来直接处理
好了,那么这是Up
只要在这里加入相应的代码
如果Up按钮就是滑块移到应用程序的最顶端
这个时候它的值就应该设置为0
把编辑框里面的显示的值也进行修改
然后用把SetSel()把编辑框所有内容都选上,(0,-1)表示所有内容都选上
替换成0字符串,就可以了
好,我们编译一下
通过了
然后大家看一下,程序刚运行的时候滑块在当中,这个Up就可以工作了
一下就到顶头了
Down、Reset还没做
我们继续完成
我们对Down进行添加
好了,我们用了缺省的值
然后添加
添加完了,我们Down直接到滚动条底端
所以值就是20
用20的字符串去替代
接着我们增加Reset
好了,我们同样给它添加Reset的代码
Reset是复位,复位到什么地方?初始状态,初始状态滑块的初值是10
所以把当前内容都选上,无论滑块在什么地方,都给它复位到10
那么编辑框显示的值就是10
那么我们下面还有一个退出
退出也给它编写消息响应的代码
退出的代码比较简单
就是OnOK()就可以退出了
那么最后我们全面运行一遍
好了,UP到最高,Reset到当中,Down到下面
这个时候我再Reset,再Up都可以
然后点击这个地方,就是滑块与下箭头之间的区域它就以3位步长递增
这个以3为步长递减
这个向上箭头以1变化
向下箭头以1变化
那么这个时候大家看
这个编辑框里面,大家注意到它不是只读的编辑框,我可以输入数字的
那么怎么办?
能够这个编辑框不被人为的输入值?
我们可以在这个地方
在这个编辑框里面设置一个属性,叫做ReadOnly,叫做只读
运行一下
那么我们在重新编译生成
这时候大家比较一下
注意一下这个地方,这个时候这个框已经变成灰了,无法从键盘输入任何数据了
所以这个编辑框变成只读得了,这个是灰的了
如果我们再把它改回去
如果这个编辑框属性不是灰的
编辑框属性这个ReadOnly改为False,这个地方就不是灰的了
这个时候如果我们重新运行,这个地方就不是灰的,是白的
所以它不是只读的,是可以修改数据的
所以这个地方大家注意一下
如果不允许别人往这里输入,只允许自己显示数据的话
一定把它改成ReadOnly属性为True
给大家提醒一下
那么我们这个例子就给大家介绍到这儿
-讨论实录
--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
-第三次作业及答题链接