BngThea 发表于 2017-7-16 22:02:30

《Windows SDK》012-014 滚动条总结

本帖最后由 BngThea 于 2017-7-17 09:07 编辑

今天特意将这三节的内容重新学习了一遍,对滚动条的知识进行必要的总结消化

一 前期认识
* 滚动条由Windows和程序员两者负责
Windows负责的有:
1 鼠标消息
2 scroll被点击时的反向显示
3 scroll滑动时在窗口中的显示
4 向有scroll的WndProc发送scroll相关消息
程序员负责的有:
1 初始化和更新scroll范围及位置
2 处理scroll的对应的消息

* 获得客户区尺寸
三种方式:
1 全屏时,用GetSystemMetrics()分别获得SM_CXFULLSCREEN, SM_CXFULLSCREEN即可
2 用GetClientRect()获得当前客户区的尺寸,该方式方便,但效率低下
3 利用WM_SIZE消息设置:该消息的lParam成员的高低16位分别存放客户区的高和宽,二wParam成员表征窗口的变化方式

* 利用LOWORD和HIWORD宏可以分别获取一个32位数据的低和高16位数据
该操作在处理WM_SIZE、WM_VSCROLL等消息时经常用到

二 在窗口中添加滚动条
* 在CreateWindow函数中在第三个参数中加入WS_HSCROLL或WM_VSCROLL即可添加水平或垂直滚动条

三 WM_VSCROLL 和 WM_HSCROLL 的特征
* 两者唯一的区别在于分别指向垂直和水平滚动条
* lParam参数为0表示标准滚动条,否则为scroll控件

* wParam参数的低16位表示鼠标的操作,由许多可选宏构成,大致分为三类
1 Bottom 和 Top : 表示底部和顶部
2 LineDown , LineUp, PageDown, PageUp :表示向下向上滚动一行或一页
3 ThrumbPostion 和 ThrumbTrack :表示拖动滚动条,这两种情况下wParam消息的高16位都存放滚动条位置,区别在于前者存放的是拖动后的最终位置(已松开鼠标),后者位拖动的当前位置(鼠标未松开)


四 老式处理滚动条套路
* 初始化和设置滚动条范围及位置
用Set/Get + Scorll + Range/Pos 的函数实现

* 处理流程
1 定义一个存放scroll 位置的静态变量 static int iVscrollPos
2 计算每种操作下iVscrollPos的值
3 条件判定,保证 iVscrollPos >= 0
4 设置scroll的位置
5 让客户区失效并更新窗口

五 高效处理滚动条套路
* 新函数及结构
1 用Set/Get + ScorllInfo 的函数 和一个 SCROLLINFO 结构实现
2 用ScrollWindow函数来滚动部分客户区

* 处理流程
1 在WM_SIZE消息中初始化一个SCROLLINFO结构si并对感兴趣的值进行设置
2 在处理scroll相关消息时对si中对应值进行更新
3 调用ScrollWindow函数来高效的滚动窗口





页: [1]
查看完整版本: 《Windows SDK》012-014 滚动条总结