滚动条第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

*******************************************************/

总结

程序员朋友,请特别注意:混合无符号和带符号的整数运算时,所可能产生的奇异结果。

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();