MFC 控件编程之水平滚动条跟垂直滚动条
MFC 控件编程之水平滚动条跟垂直滚动条
一点水平滚动条的操作
首先在操作滚动条的时候.我们要知道滚动条的一些属性. 比如我们要设置 最大值 最小值. 以及每次递增的值是多少.都要设置.
所有就有一个结构.专门存储了滚动条信息. 而我们在对话框一启动就要进行控件初始化.下方看下结构.
- typedef struct tagSCROLLINFO {
- UINT cbSize; 自身大小
- UINT fMask; 滚动条的范围.左边->右边方式.
- int nMin; 滚动条最小值
- int nMax; 滚动条最大值
- UINT nPage; 每次滚动的值
- int nPos; 位置
- int nTrackPos; 位置
- } SCROLLINFO, *LPSCROLLINFO;
然后我们使用封装好的API 进行设置.
- BOOL SetScrollInfo( LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE );
滚动条是一个类. MFC给我们封装好的.所以我们直接使用封装好的函数即可.
初始化的时候需要做的.
- SCROLLINFO si = { };
- si.cbSize = sizeof(SCROLLINFO);
- si.fMask = SIF_RANGE | SIF_PAGE; //设置范围.
- si.nMin = ; //最小值1
- si.nMax = ; //最大值100
- si.nPage = ; //每次递增1
- //设置滚动条信息.
- m_hor.SetScrollInfo(&si);
此时我们初始化好了.但是我们要对它的消息进行处理.才可以使用这个滚动条.
二丶指定点击水平滚动条消息 WM_HSCROLL
我们第一个就是要对点击这个滚动条的消息进行处理.
对话框-> 属性 -> 事件 -> 响应消息.
我们在单击水平滚动条里面.判断是哪个消息进行不同的处理即可. 比如 点击左边箭头. 点击右边箭头. 等等. 值递增.
代码如下.当我们响应了单击滚动条信息的时候
- void C滚动条Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
- {
参数1 代表的是消息.- //处理滚动条的每一个消息.进行处理.
- switch (nSBCode)
- {
- case SB_THUMBTRACK: //判断消息是否是拉动滚动条
- break;
- case SB_LINELEFT: //箭头向左的消息
- break;
- case SB_LINERIGHT: //箭头向右的消息
- break;
- case SB_PAGELEFT: // 值递减.也就是向左翻页
- break;
- case SB_PAGERIGHT: //值递增.也就是向右翻页.
- break;
- break;
- default:
- break;
- }
- CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
- }
没有具体写代码.当我们写代码的时候.要先获取当前滚动条的状态信息.
1.点击右箭头位置递增
- void C滚动条Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
- {
- SCROLLINFO si = { };
- si.cbSize = sizeof(SCROLLINFO);
- si.fMask = SIF_ALL; //获取所有滚动条消息
- pScrollBar->GetScrollInfo(&si); //通过这个函数.获取滚动条信息.
- //si里面就有所有的信息.
- int nNewPos = si.nPos; //获取最新的位置.
- //处理滚动条的每一个消息.进行处理.
- switch (nSBCode)
- {
- case SB_THUMBTRACK: //判断消息是否是拉动滚动条
- break;
- case SB_LINELEFT: //箭头向左的消息
- break;
- case SB_LINERIGHT: //箭头向右的消息
- nNewPos += ; //我们的值加了.所以设置到滚动条里面
- break;
- case SB_PAGELEFT: // 值递减.也就是向左翻页
- break;
- case SB_PAGERIGHT: //值递增.也就是向右翻页.
- break;
- break;
- default:
- break;
- }
- pScrollBar->SetScrollPos(nNewPos);
- CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
- }
思路:
1.获取当前滚动条信息. 因为当前滚动条信息里面有滚动条里最新的位置.
2.保存位置.
3.设置到滚动条上面.
参数三就是当前滚动条类.所以我们可以使用 封装好的方法.用来获取当前信息.以及设置当前位置到这个滚动条上面.
2.一个正常使用的垂直滚动条的完整代码.
- void C滚动条Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
- {
- SCROLLINFO si = { };
- si.cbSize = sizeof(SCROLLINFO);
- si.fMask = SIF_ALL; //获取所有滚动条消息
- pScrollBar->GetScrollInfo(&si); //通过这个函数.获取滚动条信息.
- //si里面就有所有的信息.
- int nNewPos = si.nPos; //获取最新的位置.
- //处理滚动条的每一个消息.进行处理.
- switch (nSBCode)
- {
- case SB_THUMBTRACK: //判断消息是否是拉动滚动条
- nNewPos = nPos; //如果拖动滑块.那么参数2就是最新位置.
- break;
- case SB_LINELEFT: //箭头向左的消息
- nNewPos -= ; //我们的值加了.所以设置到滚动条里面
- break;
- case SB_LINERIGHT: //箭头向右的消息
- nNewPos += ; //我们的值加了.所以设置到滚动条里面
- break;
- case SB_PAGELEFT: // 值递减.也就是向左翻页 点击滚动条左边空格的时候
- nNewPos -= si.nPage;
- break;
- case SB_PAGERIGHT: //值递增.也就是向右翻页.
- nNewPos += si.nPage;
- break;
- break;
- default:
- break;
- }
- //需要判断位置是否超出.
- if (nNewPos > si.nMax)
- {
- nNewPos = si.nMin;
- }
- if (nNewPos < si.nMin)
- {
- nNewPos = si.nMin;
- }
- pScrollBar->SetScrollPos(nNewPos);
- CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
- }
三丶总结
1.首先要设置滚动条的各项属性. 有一个结构体SCROLLINFO .并且使用封装的方法进行初始化 SetScrollInfo(&结构)
2.要在对话框属性上面.响应滚动条单击的消息. WM_HSCROLL
3.此时响应过后的回调函数会有三个参数.
参数1 : 滚动条信息. 因为我们还要处理其余信息.
参数2: 当滚动条拖动的时候.保存拖动过后的最新位置.
参数3: 滚动条信息. 保存了滚动条的当前状态信息.
4.需要通过第三个参数. 获取滚动条当前状态信息. GetScrollInfo(&结构) 我们的结构的标志要设置为获取全部信息的标志.
5.创建一个变量.保存当前状态中的垂直滚动条的位置.
6.通过SWITCH 语句.判断不同的滚动条消息. 进行位置的设置.
7.判断是否越界.如果越界.设置为滚动条最小值.
8.使用封装好的函数.设置到当前滚动条中. 也就是设置位置.SetScrollPos(新的位置)
四丶垂直滚动条的使用
垂直滚动条跟水平滚动条是一样的.只不过处理的消息不一样了.下方特贴一份源码.学习源码即可.跟上面一样.
- int ChyperlinkDlg::GetScrollPos(int nBar, UINT nSBCode)
- {
- SCROLLINFO si;
- si.cbSize = sizeof(SCROLLINFO);
- si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS;
- GetScrollInfo(nBar, &si);
- const int minPos = si.nMin;
- const int maxPos = si.nMax - (si.nPage - );
- int result = -;
- switch(nSBCode)
- {
- case SB_LINEUP /*SB_LINELEFT*/: //消息不一样了.
- result = max(si.nPos - , minPos);
- break;
- case SB_LINEDOWN /*SB_LINERIGHT*/:
- result = min(si.nPos + , maxPos);
- break;
- case SB_PAGEUP /*SB_PAGELEFT*/:
- result = max(si.nPos - (int)si.nPage, minPos);
- break;
- case SB_PAGEDOWN /*SB_PAGERIGHT*/:
- result = min(si.nPos + (int)si.nPage, maxPos);
- break;
- case SB_THUMBPOSITION:
- // do nothing
- break;
- case SB_THUMBTRACK:
- result = si.nTrackPos;
- break;
- case SB_TOP /*SB_LEFT*/:
- result = minPos;
- break;
- case SB_BOTTOM /*SB_RIGHT*/:
- result = maxPos;
- break;
- case SB_ENDSCROLL:
- // do nothing
- break;
- }
- return result;
- }
MFC 控件编程之水平滚动条跟垂直滚动条的更多相关文章
- MFC控件编程进度条编写
MFC控件编程进度条编写 一丶进度条编程需要用到的方法 进度条MFC已经帮我们封装好类了. 叫做 CProgressCtrl 进度条编程也很简单. 封装的方法也就那个那几个. GetPos() 获 ...
- MFC控件编程之组合框跟列表框
MFC控件编程之组合框跟列表框 一丶简介 如果要使用组合框跟列表框.那么就要知道.组合框列表框是最核心的东西就是索引. 索引是从0开始的. 二丶组合框列表框常用的方法 AddString(字符串) 添 ...
- MFC控件编程之复选框单选框分组框
MFC控件编程之复选框单选框分组框 一丶分组框 分组框 英文叫做 GroubBox 添加了分组框主要就是分组.好看.不重点介绍 二丶单选框 英文: Raido Button 单选框需要注意的事项 1. ...
- MFC控件编程之 按钮编辑框.静态文本的使用,以及访问控件的七种方法.
MFC控件编程之 按钮编辑框.静态文本的使用以及访问控件的七种方法. 一丶按钮.静态文本的通用属性. 他们都有一个属性.就是可以输入标题内容.以及可以自定义控件ID. 创建一个MFC Dlg对话框. ...
- MFC控件编程之鼠标跟键盘消息
MFC控件编程之鼠标跟键盘消息 在MFC中鼠标消息.键盘消息我们很常用.所以说一下. 鼠标消息分为客户区消息.跟非客户区消息. 一丶客户区消息 我们可以处理消息.来进行我们相应的函数即可. MFC添加 ...
- MFC控件GDI编程
MFC控件GDI编程 一丶学习内容 1.了解常用的GDI函数绘图. 2.使用常用的画笔画刷. 二丶常用的GDI函数绘图 上方则为我们常用的GDI函数了. 画线 矩形. 以及圆 等等. 2.1 画线代码 ...
- MFC控件第一讲.DC编程
MFC控件第一讲.DC编程 一丶简介 什么是DC,DC有什么用. DC成为设备描述符表. DC的作用就是可以进行绘制. 比如我们的窗口都是绘制出来的. DC可以简单理解为.没一个窗口程序都有一块内存 ...
- CheckedListBoxControl 或CheckedListBox 控件中显示水平滚动条 z
public partial class Form1 : Form { public Form1() { InitializeComponent(); DisplayHScroll(); } /// ...
- [MFC] 梳理一个简单的图片处理桌面软件中用到的MFC控件技巧
前言 前些天应好友之拖,帮忙设计一个简单的图像处理的小软件.朋友把核心算法封装好了,但是是用openCV类似于console的编程环境,要我在此基础上改成MFC桌面程序.下图是做成之后的效果: 我是 ...
随机推荐
- kbmmw 5.08 正式发布
欢迎大家围观. Important notes (changes that may break existing code) ============================= ...
- python 基础———— 字符串常用的调用 (图)
Python 常用的 字符串调用方法 这里用到了pycharm ( 使用Python 有力的工具) 下载地址https://www.jetbrains.com/pycharm/download/#s ...
- ABP的确认框
使用之前,是需要添加对abp.sweet-alert.js的引用,否则就无法正常使用. 确认框 abp.message.info('some info message', 'some optional ...
- 深入理解java虚拟机(三)-----类加载机制
类加载机制jvm把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被jvm直接使用的java类型.在java中,类型的加载.连接和初始化都是在程序运行期间完成的 ...
- Problem creating zip: Execution exce ption (and the archive is probably corrupt but I could not delete it): Java heap space -> [Help 1]
今天mvn编译的时候报错: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-assembly-plugin:2.5.5:s ...
- EmEditor注册码
Emeditor 是一款非常好用的文本编辑器 Emeditor 注册码 姓 名:ttrar.com 序 列 号:DKAZQ-R9TYP-5SM2A-9Z8KD-3E2RK 姓 名:whyida 序 列 ...
- Redis Sentinel 配置文件
基础参考:https://www.cnblogs.com/wang-li/p/9955303.html 配置文件讲解 1.sentinel monitor # sentinel monitor < ...
- js 原型链解密
1.对象继承 javaScript的继承不是通过class实现的,而是通过“原型对象”(prototype). 1.每一个函数都有一个原型对象 2.每一个实例对象都有一个_proto_属性 2.原型链 ...
- 虚拟机找不到/mnt/hgfs挂载目录——debian与 vmware
如果在安装好 VMware Tools 并在设置里面设定好共享目录之后仍然找不到 /mnt/hgfs 默认挂载目录,那么尝试以下步骤: 1. 确认VMware Tools 和共享目录设定已经完成: 2 ...
- Postman导出Api文档
一.最近离职要把做搞过的接口整理成文档,查了查postman好像不支持导出文档,于是写了个工具类,供大家参考! 前提你要先把postman里的接口导出来 如图: 二.所用到的包(主要Json相关的包) ...