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桌面程序.下图是做成之后的效果: 我是 ...
随机推荐
- rn下的弹性布局
重点: 1]react native 下的弹性布局名字叫:flexDirection 2]flexDirection的默认值是column而不是row,而flex也只能指定一个数字值. 3]使用fle ...
- gulp打包工具
首先安装全局gulp $ npm install --global gulp 下载成功后 新建一个项目或者一个文件夹(做测试) mkdir testgulp 在该文件或者项目下下载gulp工具 $ n ...
- js事件的绑定与移除
事件的绑定分为3类: <div id='clickEvent'>点击事件</div> 在DOM元素中直接绑定 <div onclick="alert('4567 ...
- 关于Data URI
[新增]:http://www.webhek.com/post/data-url.html 引子:在研究FileReader时,有个方法readAsDataURL;然后看到打印出来的东西类似于如下:[ ...
- Missing initializer in const declaration
这是一个 JS 的报错. 如果你要声明一个常量,必须要赋初值.否则就会报错. 比如这样就可以触发这个报错: const foo; 或者 const bar = xxx; 等号右侧由于拼写失误导致的js ...
- 安装virtualbox出现2503、2502的错误提示解决方法
安装virtualbox右键选择以管理员的身份打开即可
- 28.TreeSet
与HashSet是基于HashMap实现一样,TreeSet同样是基于TreeMap实现的.在前一篇中详细讲解了TreeMap实现机制,如果客官详细看了这篇博文或者对TreeMap有比较详细的了解,那 ...
- web专业课学习及往后方向发展
日常10点起床!!!! web主要是网页设计,目前自我方向是学习web前端开发,熟悉掌握相关的编辑应用已达到能设计出满意的网页,日后继续学习后端等 ,成为全栈工程师.
- FFmpeg 学习(二):Mac下安装FFmpeg
一.安装ffmpeg 分为两种安装方式: 1. 命令行安装 brew install ffmpeg 2. 下载压缩包安装 去 http://evermeet.cx/ffmpeg/ 下载7z压缩包,解压 ...
- DOS窗口查看端口占用
背景:最近用tomcat,一直访问不了,要账号密码登录,最后发现问题原因根本是tomcat的默认端口号8080被占用了,下面介绍如何通过dos窗口找到占用端口的进程. 方法: 打开DOS窗口,输入ne ...