Winapi 如何强制GetTextExtentPoint32考虑字距调整?

Winapi 如何强制GetTextExtentPoint32考虑字距调整?,winapi,fonts,gdi+,typography,Winapi,Fonts,Gdi+,Typography,我有一个应用程序,它使用GDI+并调用DrawTextExW将文本绘制到屏幕上。我还试图在编辑点放置一个闪烁的克拉。我正在使用GetTextExtentPoint32W计算克拉的位置。这对于单间距字体非常有效,但是使用Helvetica之类的工具,如果我遇到具有字距的字符对(即“Yo”“To”等),我从GetTextExtentPoint32W返回的值将被关闭,并且随着我包含的字符数量的增加,距离会越来越远。正如您在下面的屏幕截图中所看到的,克拉和突出显示的文本的位置就像没有紧排一样: 我检查

我有一个应用程序,它使用GDI+并调用
DrawTextExW
将文本绘制到屏幕上。我还试图在编辑点放置一个闪烁的克拉。我正在使用
GetTextExtentPoint32W
计算克拉的位置。这对于单间距字体非常有效,但是使用Helvetica之类的工具,如果我遇到具有字距的字符对(即“Yo”“To”等),我从GetTextExtentPoint32W返回的值将被关闭,并且随着我包含的字符数量的增加,距离会越来越远。正如您在下面的屏幕截图中所看到的,克拉和突出显示的文本的位置就像没有紧排一样:

我检查了一下,看到了这个:

由于某些设备对字符进行内核处理,因此字符串中字符的范围总和可能不等于字符串的范围

不幸的是,这并没有真正澄清问题。它是说如果我要对每个字符的范围求和,我会得到一个不同于
GetTextExtentPoint32W
返回的数字,还是说
GetTextExtentPoint32W
是对字符求和,所以你不应该期望它与屏幕上绘制的内容精确?在这种情况下,什么构成“设备”


在这一点上,我希望在<代码> DrawTextExW < /代码>中禁用KORKEN,或者计算出如何使<代码> GETTrExtTeXTrimePox32W如果可能的话,考虑KILN。

我可以建议您从GDI+切换到DWORD吗?不要将<代码> GETTrExtEngutoPoxt32/<代码>与<代码> DrawTextEx < /代码>混合。对于
drawtextextex
使用
DT_CALCRECT
并从文本开始测量。@PeterConstable不幸的是,这不是一个选项。@DanielSęk我会尝试一下。使用
DT\u CALCRECT
执行DrawTextEx是否有速度惩罚?滚动文本或确定是否需要滚动文本时,每个字符将调用一次
GetTextExtentPoint32
,直到在“视口”中找到偏移量为止。假设一个字符串长1000个字符,几乎一直滚动到最后,在最坏的情况下,可能需要调用900次来确定字符串中的第一个可见字符。我认为这确实可能会导致不必要的开销,可能您需要自己测量文本。参考: