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多很多,而且很多功能找到之后还是小惊喜,就是挺多好用的地方居然都不正经宣传一下,微软真是搞得悄悄地干活? 今天为大家介绍一下通过官方途径添 ...
随机推荐
- 超链接<a>标签用法
1.a标签点击事件 1>1a href="javascript:js_method();" 这是我们平台上常用的方法,但是这种方法在传递this等参数的时候很容易出问题,而且 ...
- P3623 [APIO2008]免费道路
3624: [Apio2008]免费道路 Time Limit: 2 Sec Memory Limit: 128 MBSec Special Judge Submit: 2143 Solved: 88 ...
- pip问题解决方案
错误信息:usr/bin/pip: No such file or directory 解决办法(一共四步,按照下面的步骤来从1到4,最后你会发现问题都解决了): 1.which pip /usr/l ...
- [原创]关于在VS解决方案下使用文件夹管理多个项目层次关系的说明
由于所创建的应用项目或类库项目较多,于是将这些类库放到一个文件夹下.在VS解决方案下确实能看到一个文件夹下多个类库项目这种层次关系.如下图所示: 但打开“我的电脑”,看到的只有类库,并未看到维护层次关 ...
- [整理记录备忘]oracle数据库相关问题与解决
检查死锁方式 用dba用户执行以下语句,可以查看到被死锁的语句. select sql_text from v$sql where hash_value in (select sql_hash_val ...
- SQLite加密方式 [转]
关于SQLite SQLite是一个轻量的.跨平台的.开源的数据库引擎,它的在读写效率.消耗总量.延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如iOS.Android). ...
- 展开label,利用YYText实现文字显示不完末尾添加全文
效果图: 操作 先github下载<YYText>文件导入, 代码如下: #import "ViewController.h" #import "YYLabe ...
- muduo 网络库学习之路(一)
前提介绍: 本人是一名大三学生,主要使用C++开发,兴趣是高性能的服务器方面. 网络开发离不开网络库,所以今天开始学一个新的网络库,陈老师的muduo库 我参考的书籍就是陈老师自己关于muduo而编著 ...
- mysql获取随机题目、排序
mysql排序问题(对字符串类型数据进行排序)对普通数字字符串字段排序:select * from qq ORDER BY score*1 DESC,time*1 ASC 一.在mysql操作中我们经 ...
- ie中input光标问题
为input 添加 readonly=”readonly” UNSELECTABLE="on" 属性. IE中设置了readonly=”readonly”,点击使用日期选择器 ...