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 控件编程之水平滚动条跟垂直滚动条的更多相关文章

  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. 浅谈React数据流管理

    引言:为什么数据流管理如此重要?react的核心思想就是:UI=render(data),data就是我们说的数据流,render是react提供的纯函数,所以用户界面的展示完全取决于数据层.这篇文章 ...

  2. s6-3 通信模型

    传输层的作用范围 通信5元组 一些已分配的知名端口 三元组 协议. 本地端点. 远方端点 五元组 协议. 本地IP地址.本地端口号. 远端IP地址.远端端口号 通信5元组 源IP 源端口 目的I ...

  3. squid 正向代理 简单配置

    linux 正向同步 项目上web服务器不给访问外网,迁移服务器环境又太麻烦,决定给web服务器做正向代理,刚开始使用nginx,但是https代理一直不成功,后面大佬建议使用squid来达到相同目的 ...

  4. [swarthmore cs75] Compiler 5 – Egg-eater

    课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了相关的课堂笔记以及第7次大作业. 抽象语法: 存储方式: 栈中的数据如果最后三位(tag bits)是001表示元 ...

  5. 20145232韩文浩《网络对抗》MSF基础应用

    MS08-067漏洞攻击 攻击机:Kali:192.168.31.132 靶机:win XP SP3(English):192.168.31.180 在VMware中设置两台虚拟机网络为NAT模式,自 ...

  6. 【Spring】入门HelloWorld

    参考:https://www.yiibai.com/spring/spring-tutorial-for-beginners.html 一.创建项目 1.利用IntelliJ创建Maven项目 2.配 ...

  7. hadoop2.7单节点

    $ sudo apt-get install ssh$ sudo apt-get install rsync 修改文件 etc/hadoop/hadoop-env.sh # set to the ro ...

  8. python+pycharm环境搭建

    1.下载python安装包 https://www.python.org/downloads/ 2.下载pycharm安装包. https://www.jetbrains.com/pycharm/do ...

  9. 1.准备工作之Groovy

    Groovy(读做:gu : ru : wei) Groovy是一种运行在jvm上的动态语言,它吸取了Python.Ruby和SmallTalk等语言的优点:在Java的基础之上增加了许多特色功能,相 ...

  10. mysql 取名会涉及到关键字 的问题

    如 comment 如下图错误