Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Win32 API中绘制格式化文本的最快方法是什么? 我在C++中使用了一个文本编辑器,只是使用了香草Win32 API,我正在尝试找到实现语法高亮显示的最好方法。我知道有像斯金特拉这样的现有控件,但我这样做是为了好玩,所以我想自己做大部分工作。我也希望它是快速和轻量的_C++_C_Windows_Winapi - Fatal编程技术网

在Win32 API中绘制格式化文本的最快方法是什么? 我在C++中使用了一个文本编辑器,只是使用了香草Win32 API,我正在尝试找到实现语法高亮显示的最好方法。我知道有像斯金特拉这样的现有控件,但我这样做是为了好玩,所以我想自己做大部分工作。我也希望它是快速和轻量的

在Win32 API中绘制格式化文本的最快方法是什么? 我在C++中使用了一个文本编辑器,只是使用了香草Win32 API,我正在尝试找到实现语法高亮显示的最好方法。我知道有像斯金特拉这样的现有控件,但我这样做是为了好玩,所以我想自己做大部分工作。我也希望它是快速和轻量的,c++,c,windows,winapi,C++,C,Windows,Winapi,据我所知,在GDI中绘制文本的最低级选项似乎是TextOut函数。但是,如果我需要不断更改字体颜色,那么这意味着我需要多次调用TextOut,以便绘制具有混合格式的文本体。这是低效的吗?在实现语法突出显示和富文本控件时,它们可能会在幕后使用TextOut,还是有其他方法?在GDI中绘制文本的其他方法是否只是TextOut的更高级包装?对于复杂的用法,您可能需要DrawText,因为它比TextOut提供更多的控制。它有一些基本的格式支持,但比编辑器需要的少。下一步是来自公共控件库的富文本编辑器,

据我所知,在GDI中绘制文本的最低级选项似乎是
TextOut
函数。但是,如果我需要不断更改字体颜色,那么这意味着我需要多次调用
TextOut
,以便绘制具有混合格式的文本体。这是低效的吗?在实现语法突出显示和富文本控件时,它们可能会在幕后使用
TextOut
,还是有其他方法?在GDI中绘制文本的其他方法是否只是
TextOut
的更高级包装?

对于复杂的用法,您可能需要
DrawText
,因为它比
TextOut
提供更多的控制。它有一些基本的格式支持,但比编辑器需要的少。下一步是来自公共控件库的富文本编辑器,它可以为您提供所有这些功能。

DrawText和TextOut都是ExtTextOut的包装器,因此ExtTextOut是低级API。根据我的经验,ExtTextOut非常快,所以我怀疑您是否会发现ExtTextOut本身存在任何性能问题。但是,创建/选择字体可能是性能问题的根源,因此,如果您在字体之间来回切换,您可以通过缓存和重用字体(HFONT)而不是每次创建字体/SelectObject/DeleteObject来实现显著的性能提升。基本上,在创建新字体后第一次调用SelectObject时,Windows将执行字体匹配过程,为您请求的逻辑字体找到最佳的物理字体。这是一个相当复杂的过程,因此您希望尽量减少在性能非常重要的情况下发生的次数


多年前,我开发了一个丰富的编辑控件,它本质上是MicrosoftWord的一个迷你版。我使用ExtTextOut作为所有文本输出的主要工具。控件将维护最近使用的字体的字体缓存(默认缓存大小为10种字体)。它支持WYSIWYG布局,因此它实际上使用打印机DC和字体进行所有布局,然后使用屏幕DC和类似字体呈现屏幕兼容版本,因此有大量额外工作正在进行,可能不适用于您的情况。尽管如此,在典型的一天硬件(例如,266兆赫奔腾)上,性能还是很好的。

< P>而不是考虑哪一个“绘制文本”函数是最快的,它可能更有利地考虑,“如何能够最小化我必须渲染的文本量”,因为在文本更改时,如何重新绘制/失效是明智的,或者如何缓存呈现的文本进行滚动。

DrawText
只是一个方便的函数,充当
TextOut
的包装器,还是完全独立?我做了一些非常简单的测试,发现
TextOut
明显更快。我知道Riched32.dll中的RICHEDIT窗口类等富编辑控件,但如果可能的话,我想自己使用低级函数实现富文本控件。Win32 API通常是一个“黑盒”,但如果您录制对图元文件的
DrawText
调用并检查它,您将看到对
exttextouth
的一系列调用。这并不完全准确。例如,
ExtTextOut
反过来使用类似Uniscribe的API。而这反过来可能会为你做字体替换。因此,如果您正在寻找“底层”API,Uniscribe可能会更好。它有一些原语,如“将Unicode字符串拆分为可单独塑造的项”。@MSalters:ExtTextOut确实可能使用Uniscribe API,但Uniscribe最终会调用ExtTextOut来进行实际渲染,因此我仍然认为ExtTextOut是“低级API”(有关详细信息,请参阅此链接:)。这就是说,Uniscribe在功能上可能是一个更好的选择,但绘制文本的“最快方式”是ExtTextOut。“DrawText和TextOut是ExtTextOut的包装器”:这对于Windows 7是正确的,但不适用于Windows XP。除此之外,PolyTextOut是唯一一个不调用ExtTextOut的文本绘制API。测试PolyTextOut的速度可能很有趣。另一个速度改进是避免使用GetTextExtentPoint32等API在绘制字符串之前测量字符串。如果您必须一个接一个地绘制多个字符串(例如,每个单词具有不同的颜色),则可以通过GetCurrentPositionEx获取当前绘制位置,并使用MoveToEx进行更改。当您首先处理杂耍DC句柄时,如何缓存字体?例如,通过调用
BeginPaint
获得的DC是从已选择默认字体的缓存DC复制的,那么如何缓存字体[和字体选择]?按照我的理解,当你得到一个像这样的DC时,你必须选择所有的字体,即使你以前已经准备好了一个字体句柄。要使它正确已经是一个挑战。很好地介绍了您需要解决的问题。有趣的一点。我没有调查过缓存。谢谢你的主意。这不是问题的答案。例如,如果要将大型日志输出绘制到窗口或列表框中,则没有可以重用或省略的内容。