`
xuela_net
  • 浏览: 495896 次
文章分类
社区版块
存档分类
最新评论

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

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

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

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

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

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

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

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

相关推荐

    Android虚拟导航栏遮挡底部的输入框的解决方法

    第一个属性: 如果为true,将调整系统窗口布局以适应你自定义的布局。 第二个属性: 控件的绘制区域是否在padding里面,值为true时那么绘制的区域就不包括padding区域,默认滚动是在padding(区域)下进行的.然而如果...

    excel的使用

    通常应用等差数列输入法,先输入前二个值,定出自变量中数与数之间的步长,然后选中A2和A3两个单元格,使这二项变成一个带黑色边框的矩形,再用鼠标指向这黑色矩形的右下角的小方块“■”,当光标变成"+"后,按住...

    java源码包---java 源码 大量 实例

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    .net技术资料大全(语言规范 源码教程 学习笔记 技术资料 .net代码生成器)

    同一解决方案中一个项目的xml注释在另一个项目中不能智能提示显示这些注释的解决方法.txt 图像读取.txt 无标题窗口的拖放.txt 下面的5行代码完成了从局域网中找出所有的机器.txt 显示DataGrid序号的一个适用的...

    JAVA上百实例源码以及开源项目

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    ASP升级.net资料大全(c#入门 语言规范 源码教程 学习笔记 技术资料 面试题 asp与.net代码生成器)

    同一解决方案中一个项目的xml注释在另一个项目中不能智能提示显示这些注释的解决方法.txt 图像读取.txt 无标题窗口的拖放.txt 下面的5行代码完成了从局域网中找出所有的机器.txt 显示DataGrid序号的一个适用的...

    JAVA上百实例源码以及开源项目源代码

    Y坐标、得到X坐标,Y坐标值、绘制火焰效果Image…… Java加密解密工具集 JCT v1.0源码包 5个目标文件 内容索引:JAVA源码,综合应用,JCT,加密解密 WDSsoft的一款免费源代码 JCT 1.0,它是一个Java加密解密常用工具包。...

    java源码包2

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    java源码包3

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    java源码包4

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    Y坐标、得到X坐标,Y坐标值、绘制火焰效果Image…… Java加密解密工具集 JCT v1.0源码包 5个目标文件 内容索引:JAVA源码,综合应用,JCT,加密解密 WDSsoft的一款免费源代码 JCT 1.0,它是一个Java加密解密常用工具包。...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    Y坐标、得到X坐标,Y坐标值、绘制火焰效果Image…… Java加密解密工具集 JCT v1.0源码包 5个目标文件 内容索引:JAVA源码,综合应用,JCT,加密解密 WDSsoft的一款免费源代码 JCT 1.0,它是一个Java加密解密常用工具包。...

    windows 程序设计中文版

    6.3.3 控制字符的处理 6.3.4 死字符消息 6.4 键盘消息和字符集 6.4.1 KEYVIEW1程序 6.4.2 非英语键盘问题 6.4.3 字符集和字体 6.4.4 Unicode解决方案 6.4.5 TrueType字体和大字体 6.5 插入符号(不是光标) ...

    protel2004封装

    3、在用手工绘制封装元件和用向导绘制封装元件时,首先要知道元件的外形尺寸和引脚间尺寸以及外形和引脚间的尺寸,这些尺寸在元件供应商的网站或供应商提供的资料中可以查到,如果没有这些资料,那只有用千分尺一个...

    ghostcat源码(附带实例)

    -丰富的文本缓动,部分文字Filter,渐变色文字,字符差异对比,ANSI转码,URL解码,中文数字,拼音码,这是一个单独的底层包 -完全由FLASH实现的拼音输入法,需要加载200K的词库,光标跟随并可词语输入(感觉和智能...

Global site tag (gtag.js) - Google Analytics