我正在使用普通 Win32 API 在 C++ 中实现一个文本编辑器,并且我正在尝试找到实现语法突出显示的最佳方法。我知道有像 scintilla 这样的现有控件,但我这样做是为了好玩,所以我想自己完成大部分工作。我还希望它又快又轻。
从我到目前为止所了解到的情况来看,在 GDI 中绘制文本的最低级选项似乎是TextOut
功能。但是,如果我需要不断更改字体颜色,那么这意味着我需要多次调用TextOut
为了绘制具有混合格式的文本正文。这效率低吗?当实现语法高亮和富文本控件时,他们可能会使用TextOut
在幕后还是有其他方式?在 GDI 中绘制文本的所有其他方法都只是更高级别的包装吗TextOut
?
DrawText 和 TextOut 都是 ExtTextOut 的包装器,因此 ExtTextOut 是低级 API。根据我的经验,ExtTextOut 速度相当快,因此我怀疑您是否会发现 ExtTextOut 本身存在任何性能问题。但是,创建/选择字体可能是性能问题的根源,因此,如果您在字体之间来回切换,则可以通过缓存和重用字体 (HFONT) 而不是每次都使用 CreateFont / SelectObject / DeleteObject 来实现显着的性能提升。基本上,在创建新字体后第一次调用 SelectObject 时,Windows 将执行字体匹配过程,为您所请求的逻辑字体找到最佳的物理字体。这是一个相当复杂的过程,因此您希望最大限度地减少在性能很重要的情况下发生的次数。
许多年前,我开发了一个丰富的编辑控件,它本质上是 Microsoft Word 的迷你版本。我使用 ExtTextOut 作为所有文本输出的主要工具。该控件将维护最近使用的字体的字体缓存(默认缓存大小为 10 种字体)。它支持 WYSIWYG 布局,因此它实际上使用打印机 DC 和字体进行所有布局,然后使用屏幕 DC 和类似字体渲染屏幕兼容版本,因此需要进行大量可能不适用于的额外工作你的情况。即便如此,在当时的典型硬件(例如 266 mhz Pentium)上运行时的性能仍然非常出色。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)