滚动条第7章节: 取整的问题
一个小问题
当你尝试调整一个窗口的大小时,你会发现在屏幕的底部会出现一条很小的线。通常这不是个大问题,但是当你在一个列表里滚动内容到列表的最后一行时,例如,你按下了End按键。这个时候,你会注意到有一块黑色的空白区域出现在底部。当这个黑色区域十分靠近上面所说的线时,用户会觉得十分奇怪,而当用户也是一位程序员时,他会觉着:是不是绘制代码里少加(减)了个1?
解决方法
我们可以通过将窗口大小强行设置为列表行的整数倍来解决此问题。就像添加滚动条一样,这只是一个基本的思路,完全实现它还是需要花一些功夫的。
进一步的,我们的想法是控制窗口的Resize代码使其能够在调整大小时取整。
为了实现这个想法,我们需要修改的代码位置是:WM_WINDOWPOSCHANGING消息处理函数。
这个函数可以在窗口实际移动之前进行前期调整。另外,这还可以避免窗口闪烁的问题。
接下来,我们会实现一个帮助函数,如下所示(这个函数十分有用):
在WM_WINDOWPOSCHANGNG消息处理中,它会检查窗口大小是否正在发生改变,我们会在这个消息处理代码中添加以下逻辑:
调整窗口的大小使其可以取得客户区域的整数值。
WM_WINDOWPOSCHANGNG消息处理代码
关于第6章节里提出的问题
在上一章节我提到过两个问题,很抱歉,第一个问题我的表述错误,我不应该问为什么需要对dLines进行整型转换,而是应该问:为什么要对g_iWheelCarryover进行整型转换?
以上问题的答案是:这个整型转换主要是确保整个计算过程是以带符号整数来进行。如果不进行整型转换,则计算将会变成无符号整数计算(当一个表达式中混合了带符号和无符号时,系统将进行无符号计算)。dLines是一个带符号整数,让我们假设它是-1。dLines乘以WHEEL_DELTA将得到-120。
此时,如果将这个-120转换为无符号整数,你将会得到一个十分巨大的值(超过40亿)。然后再除以uScroll(典型值为3),则会得到一个超过10亿的数字,这显然是不正确的。
针对第二个问题:如果你手头没有一个高精度滚轮鼠标,你会如何测试半滚动时代码是否能正常工作?
答案很简单:你只需要在OnMouseWheel函数的开头添加如下代码即可。
/*******************************************************
zDelta /= 4
*******************************************************/
总结
程序员朋友,请特别注意:混合无符号和带符号的整数运算时,所可能产生的奇异结果。
相关推荐
- 使用WMI来获取系统信息
- Posted on 12月06日
- 用上Visual Studio后,我的世界游戏的构建时间减少了一半
- Posted on 02月16日
- 傻傻分不清楚:WINVER,_WIN32_WINNT等
- Posted on 02月28日
- 有时候,应用程序就是想崩溃
- Posted on 09月03日
评论已关闭。