我正在尝试对一段文本进行自动换行,以便在否则会太长的窗口中显示。我使用的字体不是固定宽度的字体,因此 GetSystemMetrics 不会为我的文本返回准确的值。
在这里使用static
窗口不是一个选项,因为static
窗口不会告诉我一个重要的信息:自动换行后绘制的文本的高度。
有任何想法吗?
比利3
查看 Win32 API 调用DrawtextEx。您需要传递DT_CALCRECT选项,告诉 Windows 您希望计算矩形。
您可以使用设置了DT_CALCRECT标志的DrawText() API 函数。您需要先为 HDC 选择正确的字体。
DrawTextEx()
如果要以单一字体显示整个文本,它将完成您想要和需要的一切。
如果您需要混合字体,则必须自己完成工作。在这种情况下,您需要查看GetTextMetrics()
(not GetSystemMetrics()
)之类的 API GetTextExtentExPoint32()
,并确定每次运行的位置和大小。
如果您需要处理复杂的脚本(例如,从右到左的语言和字母根据上下文改变形状的脚本),您将需要 Uniscribe。注意:Uniscribe 功能强大但级别很低。用更高级别的接口包装它可能需要做很多工作。如果您需要复杂的脚本处理,最好使用浏览器控件。
两者都DrawText()
可以DrawTextEx()
做到这一点。关键是DT_WORDBREAK
在format
参数中使用。
要在顶部的 100 x 100 矩形内绘制文本,可以使用以下任一方法:
RECT textRect;
SetRect(&textRect, 0, 0, 100, 100);
DrawText(hdc,TEXT("THIS IS TEXT THAT WILL PROBABLY WRAP AROUND A 100 BY 100 RECTANGLE. BUT YOU CAN'T BE SURE UNLESS YOU TRY."),-1,&textRect, DT_LEFT | DT_NOCLIP | DT_WORDBREAK);
该DT_LEFT
选项将句子向左对齐。DT_NOCLIP
确保文本不会在底部被剪切。
或者
使用DrawTextEx()
:
RECT textRect;
SetRect(&textRect, 0, 0, 100,100);
DrawTextEx(hdc,(LPSTR)TEXT("THIS IS TEXT THAT WILL PROBABLY WRAP AROUND A 100 BY 100 RECTANGLE. BUT YOU CAN'T BE SURE UNLESS YOU TRY."), -1, &textRect, DT_LEFT| DT_NOCLIP|DT_WORDBREAK , NULL);