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桌面程序.下图是做成之后的效果: 我是 ...
随机推荐
- Scrapy学习之路(一)————环境配置
一.问题环境安装 首先scrapy这个爬虫框架是基于twisted完成的因此,在安装scrapy之前需要安装twisted.否则直接安装scrapy就会直接出错:Failed building whe ...
- babel简介
1.babel是什么 babel官网正中间一行黄色大字写着“babel is a javascript compiler”,翻译一下就是babel是一个javascript转译器.为什么会有babel ...
- jquery学习总结12-24
一.jquery操作类的相关方法 1.addClass()方法可以为DOM元素添加类,若添加多个类中间可以用空格连接 2.removeClass()方法可以为DOM元素删除类,若删除多个类中间可以用空 ...
- Promise实战AJAX封装
一.利用Promise的知识,对最开始的ajax的例子进行一个简单的封装: var url = 'xxx'; // 封装一个get请求的方法 function request(url){ return ...
- maven 不能使用 snapshot 的解决方式
最近项目需要用到snapshot的包来进行构建过程,但是怎么都下不了构建的snapshot包.查询了相关资料,发现网上的资料不全,特总结下: 我使用的是nexus来作为代理中央库proxy. 检查步骤 ...
- Win10专业版激活
转载来自:http://www.zhuangjiba.com/bios/3432.html 如何激活win10正式版图文解说 打开开始菜单,找到设置,点开“更新和安全”,切换到“激活”选项卡,查看到当 ...
- JavaGC学习笔记
1.简介Java在JVM虚拟机上的垃圾回收(GC)机制,在合适的时间触发垃圾回收,将不需要的内存空间回收释放,避免无限制的内存增长导致的OOM. 1.1 Java堆内存结构Java将堆内存分为3大部分 ...
- 正则表达式校验yyyymmdd
正则表达式为 ([\\d]{4}(((0[13578]|1[02])((0[1-9])|([12][0-9])|(3[01])))|(((0[469])|11)((0[1-9])|([12][1-9] ...
- 【MySql】启动/停止
一.启动 1.查看启动命令所在目录 macdeMacBook-Pro:~ mac$ ps -ef|grep mysql 2.进入命令目录 macdeMacBook-Pro:~ mac$ cd /usr ...
- C语言fprintf, fwrite, fscanf, fread混用问题
int main(int argc, const char * argv[]) { // insert code here... FILE * fp = fopen("test.txt&qu ...