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. Win7 VS2017编译Godot3.0.2和2.1.4

    千呼万唤屎出来,Godot终于发布3.0版本的源码了,今天是2018年3月17日,自去年接触过后,一直没事就刷刷Gayhub,看看3.0什么时候更新,刷了一年也没结果. 今天上Youtube无意中搜了 ...

  2. fortran语言调用fortran写的dll

    环境:vs2013+IVF 2011 有时候想把fortran写的常用的函数编译为DLL,以供不同的fortran exe调用,这时候应该怎样做呢?[参考 彭国伦老师 fortran95 程序设计 书 ...

  3. Robust Influence Maximization

    一.   研究背景 在社会和经济网络中,影响最大化问题在过去十年中得到广泛的研究,由于其广泛应用于病毒式营销[1,2],突破检测[3],谣言监测[4]等.例如公司可以通过向初始用户(称为种子)发送免费 ...

  4. outlook VSTO

    https://files.cnblogs.com/files/maooveyu/OutlookPhotoSync.rar

  5. hadoop配置笔记

    接上回,hadoop的配置文件都在下载的压缩包目录中的etc/hadoop/中 hadoop-env.sh有个地方配置java_home 其他常用的设置文件有: core-site.xml yarn- ...

  6. Python之路【第五篇】函数

    4.1 函数的定义 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 4.2 函数的创建 函数名的命名规则: 1.函数名必须以下划线或字母开头,可以包含任 ...

  7. Delphi XE2 新增 System.Zip 单元, 可用一句话压缩整个文件夹了

    内主要就是 TZipFile 类, 最方便使用的是它的类方法: TZipFile.ExtractZipFile() //解压 Zip 文件到指定文件夹 TZipFile.IsValid() //判断指 ...

  8. 微软SSAS 错误 Internal error: Invalid enumeration value. Please call customer support! 不是此元素的有效值。

    错误 118 Internal error: Invalid enumeration value. Please call customer support! 不是此元素的有效值. 错误 119 分析 ...

  9. spring 排除指定的类或者包扫描

    <!-- 排除Controller注解的扫描 --> <context:component-scan base-package="exampleBean"> ...

  10. 调用支付宝支付(C#)

    //支付宝支付 public string AliPay(string OrderID, string Total) //OrderID订单号,Total订单总金额 { // 支付宝网关 string ...