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. rn下的弹性布局

    重点: 1]react native 下的弹性布局名字叫:flexDirection 2]flexDirection的默认值是column而不是row,而flex也只能指定一个数字值. 3]使用fle ...

  2. gulp打包工具

    首先安装全局gulp $ npm install --global gulp 下载成功后 新建一个项目或者一个文件夹(做测试) mkdir testgulp 在该文件或者项目下下载gulp工具 $ n ...

  3. js事件的绑定与移除

    事件的绑定分为3类: <div id='clickEvent'>点击事件</div> 在DOM元素中直接绑定 <div onclick="alert('4567 ...

  4. 关于Data URI

    [新增]:http://www.webhek.com/post/data-url.html 引子:在研究FileReader时,有个方法readAsDataURL;然后看到打印出来的东西类似于如下:[ ...

  5. Missing initializer in const declaration

    这是一个 JS 的报错. 如果你要声明一个常量,必须要赋初值.否则就会报错. 比如这样就可以触发这个报错: const foo; 或者 const bar = xxx; 等号右侧由于拼写失误导致的js ...

  6. 安装virtualbox出现2503、2502的错误提示解决方法

    安装virtualbox右键选择以管理员的身份打开即可

  7. 28.TreeSet

    与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的.在前一篇中详细讲解了TreeMap实现机制,如果客官详细看了这篇博文或者对TreeMap有比较详细的了解,那 ...

  8. web专业课学习及往后方向发展

    日常10点起床!!!! web主要是网页设计,目前自我方向是学习web前端开发,熟悉掌握相关的编辑应用已达到能设计出满意的网页,日后继续学习后端等 ,成为全栈工程师.

  9. FFmpeg 学习(二):Mac下安装FFmpeg

    一.安装ffmpeg 分为两种安装方式: 1. 命令行安装 brew install ffmpeg 2. 下载压缩包安装 去 http://evermeet.cx/ffmpeg/ 下载7z压缩包,解压 ...

  10. DOS窗口查看端口占用

    背景:最近用tomcat,一直访问不了,要账号密码登录,最后发现问题原因根本是tomcat的默认端口号8080被占用了,下面介绍如何通过dos窗口找到占用端口的进程. 方法: 打开DOS窗口,输入ne ...