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

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

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

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

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

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

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

一个光标绘制问题的解决过程相关推荐

  1. 解决双系统中Ubuntu16.04启动页面是黑屏,并只有一个光标在闪的问题

    问题背景 本人为了学习大数据,在自己的dell笔记本电脑上安装了windows 10 和 Ubuntu 16.04系统,本来两个系统运行的挺好的,但是最近一直使用了Windows系统几天,再次进入到U ...

  2. 请用状态转换图描述一个绘制折线的对话过程_CAD画一个元器件电路符号(AD)...

    为了以后能绘制国家标准的电路原理图,我们在教学过程中,不采用系统自带的元件符号库,而是创建自己的元件符号库,在创建自己的元件符号库的过程中,能让你对元件符号更熟悉,之后,你绘制电路原理图时,将变得像小 ...

  3. 一个图文混排问题的解决过程

    需求如所示:左边的是效果图,右边的是完成后的图                 具体需求描述:用户的回复一条就是一个cell,字数不定.当存在某种条件时,需要在文字(可能换行)的最后一个字后面添加一个 ...

  4. deepin efi 启动u盘_用Deepin Linux ISO镜像启动或U盘引导只显示一个光标的解决

    有些电脑比较特殊,只能安装微软的Windows 10,别的操作系统都不能安装,比如Deepin等Linux也测试无法正常安装.本文采用了Deepin 20/UOS这个Linux的镜像启动或已经制作好的 ...

  5. zabbix某一个代理服务器下面多个agent出现5分钟数据采集不到的告警的解决过程...

    zabbix某一个代理服务器下面多个agent出现5分钟数据采集不到的告警的解决过程 首先查看日志如下 18064:20171009:084628.832 [Z3005] query failed: ...

  6. MySQL 遇到的死锁问_一个罕见的MySQL redo死锁问题排查及解决过程

    原标题:一个罕见的MySQL redo死锁问题排查及解决过程 作者:张青林,腾讯云布道师.MySQL架构师,隶属腾讯TEG-基础架构部-CDB内核开发团队,专注于MySQL内核研发&相关架构工 ...

  7. 一个数据录入/查询的应用程序在登录时错误信息解决过程

    一.前情:500强排序软件,需要连接到SQL server 二.安装后,登录不了,错误信息提示: 数据库联接错误 : 错误信息2:在与SQL Server建立连接时出现与网络相关的或特定于实例的错误. ...

  8. gnome黑屏 ubuntu_记Ubuntu开机黑屏及解决过程

    之前遇到一次Ubuntu因为失误卸载了xinit.xserver的原因,导致开机黑屏无法进入系统,实际上当时是第一次遇到这种情况,因此花了点时间自己摸索,事后想来解决方案还是比较简单的,从目前的观点来 ...

  9. 计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决

    计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决. 这句话几乎概括了计算机软件体系结构的设计要点.整个体系从上到下都是按照严格的层级结构设计的. 而这个中间层通过映射来连接上下文. 不仅是 ...

最新文章

  1. 【转】结合ashx来在DataGrid中显示从数据库中读出的图片
  2. 工业机器人应用行业大盘点
  3. Cocos2d-x win7 + vs2010 配置图文详解 .
  4. 苹果8a1660是什么版本_iOS 13频繁“翻车”,果粉们面对苹果将情何以堪
  5. SDN控制器ONOS架构—Vecloud
  6. php俩个字符串合并,php分割合并两个字符串的函数实例
  7. ilistT 与listT 之间的相互转换
  8. OpenShift 与 OpenStack:让云变得更简单
  9. 安全网关之三:IPTables
  10. 多核cpu应用场景_CPU占用100%!PC卡顿原来可以这么解决:多场景多任务也流畅
  11. 拼小圈营销群_深圳弘辽科技电商:拼多多“砍单免费拿”:一场关于人性的较量...
  12. 推荐系统系列教程之十七:简单却有效的Bandit算法
  13. newifi3 高恪魔改_原地升值?newifi 3 路由器刷入高恪固件教程
  14. Apex英雄下载慢的解决方法|Apex英雄离线包分享
  15. Ceph分布式存储系统优化分析
  16. 中文分词_数据分析之中文分词
  17. 机器学习深度学习中反向传播之偏导数链式法则
  18. openstack的osd,up不起来原因【重建osd日志盘软连接方法】
  19. 如何计算俩日期相隔多少年,多少月,多少天或者两时间相差XX年XX月XX日
  20. win+shift+s截图保存在哪_Windows 被冷落的 WIN 键,其实比你想的更好用

热门文章

  1. 百度地图java批量获得经纬度_从百度地图API接口批量获取地点的经纬度
  2. verilog赋多位值_Verilog入门学习笔记——第一弹
  3. 信息化工程监理规范_房建工程监理资料管理存在的问题及应对措施
  4. elasticsearch报错exceptions.RequestError(400, u'mapper_parsing_exception', u'No handler field..
  5. linux安装运行redis
  6. fiddler和F12的区别
  7. 2019如何新建流程图_用Word制作流程图,居然还有这么多小技巧
  8. vc6.0 debug 比 release 快??_全网稀缺的快应用开源项目熊宝儿歌故事QuickApp
  9. Latex表格中内容过长换行方法
  10. python 常量池_聊一聊让我蒙蔽一晚上的各种常量池