MFC 控件编程之水平滚动条跟垂直滚动条

一点水平滚动条的操作

  首先在操作滚动条的时候.我们要知道滚动条的一些属性. 比如我们要设置 最大值 最小值. 以及每次递增的值是多少.都要设置.

所有就有一个结构.专门存储了滚动条信息. 而我们在对话框一启动就要进行控件初始化.下方看下结构.

  1. typedef struct tagSCROLLINFO {
  2. UINT cbSize; 自身大小
  3. UINT fMask; 滚动条的范围.左边->右边方式.
  4. int nMin; 滚动条最小值
  5. int nMax; 滚动条最大值
  6. UINT nPage; 每次滚动的值
  7. int nPos; 位置
  8. int nTrackPos; 位置
  9. } SCROLLINFO, *LPSCROLLINFO;

然后我们使用封装好的API 进行设置.

  1. BOOL SetScrollInfo( LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE );

滚动条是一个类. MFC给我们封装好的.所以我们直接使用封装好的函数即可.

初始化的时候需要做的.

  1. SCROLLINFO si = { };
  2. si.cbSize = sizeof(SCROLLINFO);
  3. si.fMask = SIF_RANGE | SIF_PAGE; //设置范围.
  4. si.nMin = ; //最小值1
  5. si.nMax = ; //最大值100
  6. si.nPage = ; //每次递增1
  7.  
  8. //设置滚动条信息.
  9. m_hor.SetScrollInfo(&si);

此时我们初始化好了.但是我们要对它的消息进行处理.才可以使用这个滚动条.

二丶指定点击水平滚动条消息  WM_HSCROLL

我们第一个就是要对点击这个滚动条的消息进行处理.

对话框-> 属性 -> 事件 -> 响应消息.

我们在单击水平滚动条里面.判断是哪个消息进行不同的处理即可. 比如 点击左边箭头. 点击右边箭头. 等等. 值递增.

代码如下.当我们响应了单击滚动条信息的时候

  1. void C滚动条Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
  2. {
      参数1 代表的是消息.
  3.  
  4. //处理滚动条的每一个消息.进行处理.
  5. switch (nSBCode)
  6. {
  7. case SB_THUMBTRACK: //判断消息是否是拉动滚动条
  8. break;
  9. case SB_LINELEFT: //箭头向左的消息
  10. break;
  11.  
  12. case SB_LINERIGHT: //箭头向右的消息
  13. break;
  14. case SB_PAGELEFT: // 值递减.也就是向左翻页
  15. break;
  16. case SB_PAGERIGHT: //值递增.也就是向右翻页.
  17. break;
  18. break;
  19.  
  20. default:
  21. break;
  22. }
  23. CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
  24. }

没有具体写代码.当我们写代码的时候.要先获取当前滚动条的状态信息.

1.点击右箭头位置递增

  1. void C滚动条Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
  2. {
  3.  
  4. SCROLLINFO si = { };
  5. si.cbSize = sizeof(SCROLLINFO);
  6. si.fMask = SIF_ALL; //获取所有滚动条消息
  7. pScrollBar->GetScrollInfo(&si); //通过这个函数.获取滚动条信息.
  8.  
  9. //si里面就有所有的信息.
  10. int nNewPos = si.nPos; //获取最新的位置.
  11.  
  12. //处理滚动条的每一个消息.进行处理.
  13. switch (nSBCode)
  14. {
  15. case SB_THUMBTRACK: //判断消息是否是拉动滚动条
  16.  
  17. break;
  18. case SB_LINELEFT: //箭头向左的消息
  19. break;
  20.  
  21. case SB_LINERIGHT: //箭头向右的消息
  22. nNewPos += ; //我们的值加了.所以设置到滚动条里面
  23. break;
  24. case SB_PAGELEFT: // 值递减.也就是向左翻页
  25. break;
  26. case SB_PAGERIGHT: //值递增.也就是向右翻页.
  27. break;
  28. break;
  29.  
  30. default:
  31. break;
  32. }
  33.  
  34. pScrollBar->SetScrollPos(nNewPos);
  35. CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
  36. }

思路:

  1.获取当前滚动条信息. 因为当前滚动条信息里面有滚动条里最新的位置.

  2.保存位置.

  3.设置到滚动条上面.

参数三就是当前滚动条类.所以我们可以使用 封装好的方法.用来获取当前信息.以及设置当前位置到这个滚动条上面.

2.一个正常使用的垂直滚动条的完整代码.

  1. void C滚动条Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
  2. {
  3.  
  4. SCROLLINFO si = { };
  5. si.cbSize = sizeof(SCROLLINFO);
  6. si.fMask = SIF_ALL; //获取所有滚动条消息
  7. pScrollBar->GetScrollInfo(&si); //通过这个函数.获取滚动条信息.
  8.  
  9. //si里面就有所有的信息.
  10. int nNewPos = si.nPos; //获取最新的位置.
  11.  
  12. //处理滚动条的每一个消息.进行处理.
  13. switch (nSBCode)
  14. {
  15. case SB_THUMBTRACK: //判断消息是否是拉动滚动条
  16. nNewPos = nPos; //如果拖动滑块.那么参数2就是最新位置.
  17. break;
  18. case SB_LINELEFT: //箭头向左的消息
  19. nNewPos -= ; //我们的值加了.所以设置到滚动条里面
  20. break;
  21.  
  22. case SB_LINERIGHT: //箭头向右的消息
  23. nNewPos += ; //我们的值加了.所以设置到滚动条里面
  24. break;
  25. case SB_PAGELEFT: // 值递减.也就是向左翻页 点击滚动条左边空格的时候
  26. nNewPos -= si.nPage;
  27. break;
  28. case SB_PAGERIGHT: //值递增.也就是向右翻页.
  29. nNewPos += si.nPage;
  30. break;
  31. break;
  32.  
  33. default:
  34. break;
  35. }
  36.  
  37. //需要判断位置是否超出.
  38. if (nNewPos > si.nMax)
  39. {
  40. nNewPos = si.nMin;
  41. }
  42. if (nNewPos < si.nMin)
  43. {
  44. nNewPos = si.nMin;
  45. }
  46. pScrollBar->SetScrollPos(nNewPos);
  47. CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
  48. }

三丶总结

  1.首先要设置滚动条的各项属性. 有一个结构体SCROLLINFO .并且使用封装的方法进行初始化 SetScrollInfo(&结构)

  2.要在对话框属性上面.响应滚动条单击的消息.  WM_HSCROLL

  3.此时响应过后的回调函数会有三个参数.

      参数1 : 滚动条信息. 因为我们还要处理其余信息.

      参数2: 当滚动条拖动的时候.保存拖动过后的最新位置.

      参数3: 滚动条信息. 保存了滚动条的当前状态信息.

  4.需要通过第三个参数. 获取滚动条当前状态信息. GetScrollInfo(&结构) 我们的结构的标志要设置为获取全部信息的标志.

  5.创建一个变量.保存当前状态中的垂直滚动条的位置.

  6.通过SWITCH 语句.判断不同的滚动条消息. 进行位置的设置.

  7.判断是否越界.如果越界.设置为滚动条最小值.

  8.使用封装好的函数.设置到当前滚动条中. 也就是设置位置.SetScrollPos(新的位置)

四丶垂直滚动条的使用

垂直滚动条跟水平滚动条是一样的.只不过处理的消息不一样了.下方特贴一份源码.学习源码即可.跟上面一样.

  1. int ChyperlinkDlg::GetScrollPos(int nBar, UINT nSBCode)
  2. {
  3. SCROLLINFO si;
  4. si.cbSize = sizeof(SCROLLINFO);
  5. si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS;
  6. GetScrollInfo(nBar, &si);
  7.  
  8. const int minPos = si.nMin;
  9. const int maxPos = si.nMax - (si.nPage - );
  10.  
  11. int result = -;
  12.  
  13. switch(nSBCode)
  14. {
  15. case SB_LINEUP /*SB_LINELEFT*/: //消息不一样了.
  16. result = max(si.nPos - , minPos);
  17. break;
  18. case SB_LINEDOWN /*SB_LINERIGHT*/:
  19. result = min(si.nPos + , maxPos);
  20. break;
  21. case SB_PAGEUP /*SB_PAGELEFT*/:
  22. result = max(si.nPos - (int)si.nPage, minPos);
  23. break;
  24. case SB_PAGEDOWN /*SB_PAGERIGHT*/:
  25. result = min(si.nPos + (int)si.nPage, maxPos);
  26. break;
  27. case SB_THUMBPOSITION:
  28. // do nothing
  29. break;
  30. case SB_THUMBTRACK:
  31. result = si.nTrackPos;
  32. break;
  33. case SB_TOP /*SB_LEFT*/:
  34. result = minPos;
  35. break;
  36. case SB_BOTTOM /*SB_RIGHT*/:
  37. result = maxPos;
  38. break;
  39. case SB_ENDSCROLL:
  40. // do nothing
  41. break;
  42. }
  43.  
  44. return result;
  45. }

MFC 控件编程之水平滚动条跟垂直滚动条的更多相关文章

  1. MFC控件编程进度条编写

    MFC控件编程进度条编写 一丶进度条编程需要用到的方法 进度条MFC已经帮我们封装好类了. 叫做 CProgressCtrl  进度条编程也很简单. 封装的方法也就那个那几个. GetPos()  获 ...

  2. MFC控件编程之组合框跟列表框

    MFC控件编程之组合框跟列表框 一丶简介 如果要使用组合框跟列表框.那么就要知道.组合框列表框是最核心的东西就是索引. 索引是从0开始的. 二丶组合框列表框常用的方法 AddString(字符串) 添 ...

  3. MFC控件编程之复选框单选框分组框

    MFC控件编程之复选框单选框分组框 一丶分组框 分组框 英文叫做 GroubBox 添加了分组框主要就是分组.好看.不重点介绍 二丶单选框 英文: Raido Button 单选框需要注意的事项 1. ...

  4. MFC控件编程之 按钮编辑框.静态文本的使用,以及访问控件的七种方法.

    MFC控件编程之 按钮编辑框.静态文本的使用以及访问控件的七种方法. 一丶按钮.静态文本的通用属性. 他们都有一个属性.就是可以输入标题内容.以及可以自定义控件ID. 创建一个MFC Dlg对话框. ...

  5. MFC控件编程之鼠标跟键盘消息

    MFC控件编程之鼠标跟键盘消息 在MFC中鼠标消息.键盘消息我们很常用.所以说一下. 鼠标消息分为客户区消息.跟非客户区消息. 一丶客户区消息 我们可以处理消息.来进行我们相应的函数即可. MFC添加 ...

  6. MFC控件GDI编程

    MFC控件GDI编程 一丶学习内容 1.了解常用的GDI函数绘图. 2.使用常用的画笔画刷. 二丶常用的GDI函数绘图 上方则为我们常用的GDI函数了. 画线 矩形. 以及圆 等等. 2.1 画线代码 ...

  7. MFC控件第一讲.DC编程

    MFC控件第一讲.DC编程 一丶简介 什么是DC,DC有什么用. DC成为设备描述符表. DC的作用就是可以进行绘制. 比如我们的窗口都是绘制出来的.  DC可以简单理解为.没一个窗口程序都有一块内存 ...

  8. CheckedListBoxControl 或CheckedListBox 控件中显示水平滚动条 z

    public partial class Form1 : Form { public Form1() { InitializeComponent(); DisplayHScroll(); } /// ...

  9. [MFC] 梳理一个简单的图片处理桌面软件中用到的MFC控件技巧

     前言 前些天应好友之拖,帮忙设计一个简单的图像处理的小软件.朋友把核心算法封装好了,但是是用openCV类似于console的编程环境,要我在此基础上改成MFC桌面程序.下图是做成之后的效果: 我是 ...

随机推荐

  1. kbmmw 5.08 正式发布

    欢迎大家围观. Important notes (changes that may break existing code)         ============================= ...

  2. python 基础———— 字符串常用的调用 (图)

    Python 常用的 字符串调用方法 这里用到了pycharm ( 使用Python  有力的工具) 下载地址https://www.jetbrains.com/pycharm/download/#s ...

  3. ABP的确认框

    使用之前,是需要添加对abp.sweet-alert.js的引用,否则就无法正常使用. 确认框 abp.message.info('some info message', 'some optional ...

  4. 深入理解java虚拟机(三)-----类加载机制

    类加载机制jvm把描述类的数据从class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被jvm直接使用的java类型.在java中,类型的加载.连接和初始化都是在程序运行期间完成的 ...

  5. 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 ...

  6. EmEditor注册码

    Emeditor 是一款非常好用的文本编辑器 Emeditor 注册码 姓 名:ttrar.com 序 列 号:DKAZQ-R9TYP-5SM2A-9Z8KD-3E2RK 姓 名:whyida 序 列 ...

  7. Redis Sentinel 配置文件

    基础参考:https://www.cnblogs.com/wang-li/p/9955303.html 配置文件讲解 1.sentinel monitor # sentinel monitor < ...

  8. js 原型链解密

    1.对象继承 javaScript的继承不是通过class实现的,而是通过“原型对象”(prototype). 1.每一个函数都有一个原型对象 2.每一个实例对象都有一个_proto_属性 2.原型链 ...

  9. 虚拟机找不到/mnt/hgfs挂载目录——debian与 vmware

    如果在安装好 VMware Tools 并在设置里面设定好共享目录之后仍然找不到 /mnt/hgfs 默认挂载目录,那么尝试以下步骤: 1. 确认VMware Tools 和共享目录设定已经完成: 2 ...

  10. Postman导出Api文档

    一.最近离职要把做搞过的接口整理成文档,查了查postman好像不支持导出文档,于是写了个工具类,供大家参考! 前提你要先把postman里的接口导出来 如图: 二.所用到的包(主要Json相关的包) ...