一个光标绘制问题的解决过程

在开发一个Sql文本编辑器时很意外的在光标显示问题上卡了一下。其解决的过程和之前发布的问题解决篇中的内容很吻合,是对比法解决问题的一个非常好的例子。所以下来分享一下。

背景:
1.由于产品需要,公司决定自行开发一个文本剪辑器,以满足功能的要求。
2.我们是在读懂一个开源的编辑器的基础上,完全自行开发的。
3.之前在GDI+方面的经验非常少,仅限于基本的图形绘制

问题:
在显示编辑器中的光标时,需要在某些场合自行绘制光标。我发现光标的定位有问题,总是偏离正确位置两个像素左右的偏移。也就是说光标在当前行的位置,往上多偏移了两个像素左右的位置。这是通过观察显示器的输出得到的结论。当然差这一点距离,不是说就不行,只是与其它编辑器比较会觉得很不舒服。所以我还是打算解决这个问题。

下面介绍一下解决步骤和过程。第一步是尝试调整显示光标的位置。既然光标位置偏高,那么显示光标时把位置调低不就可以了么。不幸的是实践发现,显示位置调低以后,光标图形的上面是不高了,但是下面却偏低了。无论如何调整都不能两全。通过比较开源的代码也没有发现问题。然后上网找例子,但是若干例子尝试以后,也没有解决问题。由于画光标只是一个简单绘制直线的操作,所以真的不清楚还会出什么问题。于是到这里就陷入困境了。

考虑一下过后,开始考察自行绘制的光标和用Win32 API点亮的光标之间的差异。我发现点亮的光标显示是正常的,而点亮的光标的位置和自行绘制贯标的位置是相同的。这说明位置是正确的,问题出在别的地方。好,到这里这在困境中多少理出了一条新线索。于是想到一个方法,点亮的光标位置和绘制的光标位置使用不同的坐标,在绘制光标时将坐标往下移两个像素。这个方法是可行的,但是显然不太完美,至少开源代码中没有这样。尝试后发现位置貌似对了,但是绘制的光标和点亮的光标在形状上存在一点点差异。由于整个光标的高度也就是10个像素左右,所以这一点点差异从比例上讲还是不小的,用户会有明显的察觉。所以问题还是没有完全解决。

到这里基本上觉得很头疼了。由于之前没有接触过光标的绘制,所以还一度开始怀疑是不是在某些不知道的地方出现了问题。在多次google和比较开源代码之后还是没有发现导致问题的原因。但是可以肯定一点是我写下的代码本身出问题的可能也很低。因为都是非常简单的代码。于是把注意力放宽,关注整个绘制流程,也就是OnDraw方法中的全部代码。通过反复和仔细的比较,发现了一个可疑的地方。那就是我在绘制文本时绘制方法的参数指定使用高质量,反锯齿的效果,而在开源码中是没有这样做的。一个事实说清楚的,如果使用反锯齿高质量的参数来绘制直线的话,那么直线是会有一点虚化部分,用于光滑锯齿。那么这个会不会就是导致问题的原因呢?

在尝试修改之前来回答这个问题的话,我一定说不会。因为反锯齿的效果只会在线条不是垂直和水平的情况下出现,这个经验我在用VC的时候是有的。而我现在绘制的光标就是一个10几像素高的垂直直线。但是眼下的情况不同,因为这么一个简单的绘制直线的小问题,在反复多次检查都没有能查出问题的所在,所以当下这个线索是值得去确认一下。另一个理由是,开源代码没有使用反锯齿,这是通过比较发现的差异,让这个线索变得很可疑。实践证明确实就是这个原因导致。修改代码,在绘制光标时不使用反锯齿效果,于是问题就解决了。

你可能感兴趣的:(编辑器,光标绘制)