我正在使用香草Win32 API在C ++中实现文本编辑器,并试图find实现语法高亮显示的最佳方法。 我知道现在有像闪烁石这样的控件,但是我为了好玩而做了这个,所以我想自己做大部分的工作。 我也希望它是快速和轻量级的。
从我迄今为止所了解到的情况看,GDI中绘制文本的最底层选项看起来就是TextOut
函数。 但是,如果我需要不断更改字体颜色,那么这意味着我将需要对TextOut
进行多次调用,以便以混合格式绘制一个文本主体。 这是低效的吗? 当语法高亮和富文本控件被实现时,他们可能会在幕后使用TextOut
还是有其他方法? 在GDI中绘制文本的其他方法只是TextOut
的更高级别的包装?
DrawText和TextOut都是ExtTextOut的包装器,所以ExtTextOut是低级的API。 根据我的经验,ExtTextOut速度相当快,所以我怀疑你会看到ExtTextOut本身的任何性能问题。 但是,创建/选择字体可能是性能问题的一个来源,所以如果您在字体之间来回切换,则可以通过缓存和重新使用字体(HFONT)而不是每次CreateFont / SelectObject / DeleteObject来实现显着的性能提升。 基本上,第一次在创建一个新的字体后调用SelectObject,Windows将执行一个字体匹配过程来找到你所请求的逻辑字体的最佳物理字体。 这是一个相当复杂的过程,因此您希望最大限度地减少在性能很重要的情况下发生的次数。
我在很多年前开发了一个丰富的编辑控件,实质上是Microsoft Word的一个迷你版本。 我使用ExtTextOut作为所有文本输出的主要主力。 该控件将维护最近使用的字体的字体缓存(默认缓存大小为10个字体)。 它支持所见即所得的布局,所以它实际上是使用打印机DC和字体做所有的布局,然后使用屏幕DC和类似的字体渲染屏幕兼容的版本,所以有很多额外的工作可能不适用于你的情况。 即使如此,在典型的硬件上(例如,266MHz的Pentium),性能也非常出色。
不要考虑哪个“绘制文本”功能是最快的,考虑到“我怎样才能最大限度地减少我必须呈现的文本的数量”,通过聪明地重写/无效作为文本改变,或者如何缓存滚动的渲染文本。
对于复杂的用法,您可能需要DrawText
因为它比TextOut
提供更多的控制权。 它有一些基本的格式化支持,但比编辑器要少。 下一步是公共控件库中的富文本编辑器,它几乎为您提供了所有的帮助。