关于上一篇文章中提到的家庭作业
作者:BlogUpdater |
时间:2019-12-02 |
浏览:1550 |
评论已关闭 条评论
今天来回答在上一篇文章中提到的”家庭作业”。
关于iMin的计算
iMin表示绘制区域的最小索引,所以简单的使用简单的截断除法就可以计算出来。
关于iMax的计算
关于iMax的计算,可以有两种不同的方法。
第一种方法
计算第一个不可见行(注意这里的”不”字)的向上进位值(Roundup)。还记得吗?一个矩形的坐标定义中,是不包含终结点(endpoint)的,所以,rcPaint.bottom实际上位于绘制矩形之外的第一个不可见行。因为我们需要得到第一个完全位于绘制矩形之外的行索引,所以这里使用了向上进位。
第二种方法
在第二种方法中,我们使用了看上去完全等效的算法。
在第一步中,以下公式可以得到最后一个可见行的索引,通过添加一个像素单位,我们得到了第一个不可见行的索引。
在上面两个方法中,我们都考虑到了计算结果超出总行数的可能性,所以,通过比较算法(min/max)来确保我们不会绘制一个实际上不存在的东西。
对于下一个问题
虽然以上两个计算公式看起来是等效的,但是,当rcPaint.bottom小于等于0时,公式中的整数除法将会得到0,这将会导致错误的计算结果(iMax将会计算得到1,而不是预期中的0)。当整数除法得到负无穷时,计算公式才是正确的。
为什么这又不是一个大问题
如果使用了错误的公式,只是会导致我们绘制了不需要绘制的行,这在我们的示例中,不是一个大问题,因为绘制过程会非常快,但是如果绘制一个条目需要耗时很久,则避免绘制不需要绘制的条目,将会很大程度上提升程序性能。
我们将在第4章节演示使用错误的公式带来的效果:它将绘制出比较奇怪的东西。拭目以待!
如需转载,请注明来自:Topomel Box
- 下一篇: 滚动条第四章节: 添加一个自动比例滚动条
- 上一篇: 为什么XP中新开始菜单不使用”个性化菜单”
相关推荐
- 一个进程只能最多创建2000个线程吗?
- Posted on 12月16日
- 实战经验:通过类成员函数指针实现类方法调用
- Posted on 04月06日
- 为什么任务栏时钟不显示秒钟?
- Posted on 06月02日
- 为什么传递SPIF_SENDCHANGE标志SystemParametersInfo会挂起?
- Posted on 06月26日
评论已关闭。