上一篇文章中的家庭作业解答

上一篇文章中的家庭作业解答

作者:BlogUpdater |  时间:2019-12-04 |  浏览:2776 |  评论已关闭 条评论

所谓的小Bug
如果你到MSDN上查一下WM_VSCROLL消息的定义,就会发现其中的滚动条位置的定义是一个16位的整数。也就是说,如果窗口中绘制的条目超过65535,则你将无法通过拖动滚动条的滑块来显示最后的条目。

小测试
你可以修改之前程序中的g_cItems的值为100000,然后跑一下程序,看看效果。

修复方法
修复的方法是直接忽略掉消息处理参数中的pos参数,而是从滚动条中直接获取。
下面是一个帮助函数,用来获取滚动条的位置信息。

然后就是修改OnVscroll函数中的两个case语句,如下:

对于SB_THUMBTRACK消息的处理
SB_THUMBTRACK消息一般用来处理用户拖动滚动条的场景,借助此消息,我们可以为用户提供拖动时的反馈。

如果一个应用程序想利用滚动条来滚动窗口的内容,那一定不要忘了使用SetScrollPos来重新设置滚动条的位置。

如果使用了一个非0值来表示滚动条的位置的最小值,则通过SB_THUMBTRACK和SB_THUMBPOSITION消息所获取到的滚动条位置将会是错误的。SB_THUMBPOSITION消息会将滚动条位置的范围映射为:
0 ~ (max – min)。下面的示例代码给出了一个解决此问题的方法,具体来说,就是在消息参数nPos上加上一个最小值。

如同上面所解释的,这里的滚动条位置是16位整数,所以,如果应用程序仅仅依靠WM_VSCROLL (and WM_HSCROLL)消息,就存在位置最大值不能超过65535的限制。

GetScrollInfo支持32位整数来表示滚动条位置信息,所以,也就有了上面的Workaround。

总结
以下函数支持32位滚动条位置表示,特此Mark以下。
> SetScrollInfo
> SetScrollPos
> SetScrollRange
> GetScrollInfo
> GetScrollPos
> GetScrollRange

标签:

评论已关闭。