windows的滚动条使用
背景
在毕业快一年的工作时间中,对windows编程的某些特性并不够熟悉,例如滚动条的使用。在一次需求中需要用到滚动条,在开发过程中走了不少弯路,因此需要做一些笔记总结一下学习到的内容。
先推荐几个写的特别好的博客:
Windows编程之滚动条—滚动条消息
C语言Windows程序设计-> 第八天-> 滚动条
三、Windows编程之滚动条—滚动条信息函数
基本滚动条的使用是非常简单的,无法就那么几个步骤
- 判断是否需要滚动条,并初始化滚动条,比如页面大小等变量。
如: EnableScrollBarCtrl和SetScrollInfo等API, SetScrollInfo用于设置滚动条的相关参数, 包括滚动范围的最大值和最小值, 页面大小, 滑块的位置。
typedef struct tagSCROLLINFO
{
UINT cbSize ; //设置为sizeof (SCROLLINFO), 表示该结构的大小
UINT fMask ; //要设置或获取的值
int nMin ; //滚动条范围的最小值
int nMax ; //滚动条范围的最大值
UINT nPage ; //页面大小
int nPos ; //当前位置
int nTrackPos ; //当前追踪位置
}SCROLLINFO;
fMask中我们常用的是 SIF_ALL(是SIF_RANGE、SIF_POS、SIF_PAGE和SIF_TRACKPOS的组合),
在win32中,滚动条的长度和窗口的长度是成一定比例的。如下公式所控制:

- 对滚动条的消息处理,例如几个典型的消息:
SB_LINEDOWN、SB_LINEUP、SB_THUMBPOSITION、SB_THUMBTRACK; 以及SB_PAGEDOWN等之类的消息。主要逻辑就是在滚动条移动时,要更新子窗口相对于父窗口的位置(如,调用MoveWindow函数等)。
鼠标滑轮的消息,在MFC的CWnd窗口中,捕获滑轮消息,转发滚动条消息:
BOOL CxxxxWnd::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
if (m_bEnableVScroll)
{
if (zDelta > 0)
{
PostMessage(WM_VSCROLL, SB_LINEUP, 0);
}
else
{
PostMessage(WM_VSCROLL, SB_LINEDOWN, 0);
}
}
return __super::OnMouseWheel(nFlags, zDelta, pt);
}
常用的滚动条消息如下:

开发过程中遇到的问题
带滚动条的窗口的窗口结构
之前不太晓得带滚动条的窗口的窗口结构,带滚动条的窗口一定是有子窗口的。滑动的时候,改变子窗口的相对位置。参考一张图:

如何使滚动条可以拖拽?
主要是对SB_THUMBPOSITION和SB_THUMBTRACK消息的处理。当把鼠标的光标放在卷动方块上并按住鼠标键时,您就可以移动卷动方块。这样就产生了带有SB_THUMBTRACK和SB_THUMBPOSITION通知码的滚动条消息。在wParam的低字组是SB_THUMBTRACK时,wParam的高字组是使用者在拖动卷动方块时的目前位置。该位置位于卷动列范围的最小值和最大值之间。在wParam的低字组是SB_THUMBPOSITION时,wParam的高字组是使用者释放鼠标键后卷动方块的最终位置。
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
{
bSuccess = GetScrollInfo(SB_VERT, &si);
si.fMask = SIF_POS;
si.nPos = si.nTrackPos;
bSuccess = SetScrollInfo(SB_VERT, &si);
//按照成员变量nPos的消息移动子窗口位置即可....
Invalidate();
}
break;
windows的滚动条使用的更多相关文章
- windows 编程 —— 消息与参数(滚动条、键盘、鼠标)
目录: 滚动条 键盘 鼠标 滚动条ScrollBar 发送消息:WM_VSCROLL和WM_HSCROLL 参数wParam:wParam消息参数被分为一个低字组和一个高字组.wParam的低字组是一 ...
- 《windows程序设计》学习_4:文本输出,加滚动条
//总行数 #define NUMLINES ((int) (sizeof sysmetrics / sizeof sysmetrics [0])) struct { int Index ; TCHA ...
- 学习windows编程 day2 之滚动条使用
相关函数: setscrollrange,setscrollpos,getscrollrange,getscrollpos 使用滚动条时我们需要进行的操作: 1.初始化滚动条范围和位置 在窗口创建时W ...
- 学习windows编程 day3 之滚动条完善
1.不再使用setscrollrange,setscrollpos,getscrollrange,getscrollpos这些函数,这只是有助于理解其中运行原理 2.改用setscrollinfo,g ...
- H5页面的滚动条在windows浏览器下始终看到(灰色的不可用的)
一般这种情况是在某些相关的div上设置了overflow:scroll属性,在mac系统的浏览器下均没有滚动条显示而在windows下的各个浏览器上均可以看到灰色的不可用的滚动条,这种情况我们需要在b ...
- SetWinEventHook 事件钩子(有些windows事件并没有消息对应,譬如弹出菜单,切换窗口,获得焦点,滚动条滚动等)good
相信消息钩子大家听的比较多,消息钩子能够在应用程序处理系统消息之前将其截获,提前处理并可以决定是否继续将消息往下传送,有些windows事件并没有消息对应,譬如弹出菜单,切换窗口,获得焦点,滚动条滚动 ...
- 07 Windows编程——窗口滚动条
两个函数:GetScrolnfo和SetScrollnfo一个结构:SCROLLINFO两个消息:WM_CREATE和WM_SIZE 滚动条结构体 typedef struct tagSCROLLIN ...
- 让 windows 下的命令行程序 cmd.exe 用起来更顺手
在 Windows 下使用 Larave 框架做开发,从 Composer 到 artisan 总是避免不了和 cmd.exe 打交道,系统默认的命令行界面却是不怎么好看,且每行显示的字符数是做了限制 ...
- 如何通过官方渠道为Windows 10 添加具有中国特色的字体
Windows 10的变化细节上个人认为要比Windows 8多很多,而且很多功能找到之后还是小惊喜,就是挺多好用的地方居然都不正经宣传一下,微软真是搞得悄悄地干活? 今天为大家介绍一下通过官方途径添 ...
随机推荐
- IntelliJ IDEA使用技巧一览表
1 .写代码时用 Alt-Insert ( Code|Generate… )可以创建类里面任何字段的 getter 与 setter 方法. 2 .右键点击断点标记(在文本的左边栏里)激活速查菜单,你 ...
- Ansible--01
一.ansible是什么: 类似puppet之类的运维自动化工具 二.为什么选择ansible: 1. ansible是python语言开发的,python语言进入门槛低,方便基于pytnon对ans ...
- 分布式唯一ID的几种生成方案
前言 在互联网的业务系统中,涉及到各种各样的ID,如在支付系统中就会有支付ID.退款ID等.那一般生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们应该采用哪种适合自己的解决方案是十 ...
- python自动化之上传文件的3种方法和图片预览
ajax上传文件的三种方法 第一种xhr提交 function xhrSubmit(){ // $('#fafafa')[0] var file_obj = document.getElementBy ...
- js对LocalDateTime时间的格式化成yyyy-MM-dd HH:mm:ss
formatter: function(value,row,index){ var arr = value; if(arr==null || arr==""){ return &q ...
- 50道Java线程面试题(转载)
1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成 ...
- django之models学习总结
from django.db import models # Create your models here. class Classes(models.Model): ''' 班级表 ''' tit ...
- awk练习笔记
题目数据如下: Mike Harrington:(510) 548-1278:250:100:175 Christian Dobbins:(408) 538-2358:155:90:201Susan ...
- 关于mysql-mybatis批量添加
mybatis怎么实现一次插入多条数据 以后从新浪博客转到博客园这边来记录把. 这篇地址:http://blog.sina.com.cn/s/blog_13e9702640102ysho.ht ...
- #leetcode刷题之路18-四数之和
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满 ...