0

我正在尝试对一段文本进行自动换行,以便在否则会太长的窗口中显示。我使用的字体不是固定宽度的字体,因此 GetSystemMetrics 不会为我的文本返回准确的值。

在这里使用static窗口不是一个选项,因为static窗口不会告诉我一个重要的信息:自动换行后绘制的文本的高度。

有任何想法吗?

比利3

4

4 回答 4

4

查看 Win32 API 调用DrawtextEx。您需要传递DT_CALCRECT选项,告诉 Windows 您希望计算矩形。

于 2009-05-02T14:50:11.540 回答
2

您可以使用设置了DT_CALCRECT标志的DrawText() API 函数。您需要先为 HDC 选择正确的字体。

于 2009-05-02T14:48:49.780 回答
1

DrawTextEx()如果要以单一字体显示整个文本,它将完成您想要和需要的一切。

如果您需要混合字体,则必须自己完成工作。在这种情况下,您需要查看GetTextMetrics()(not GetSystemMetrics())之类的 API GetTextExtentExPoint32(),并确定每次运行的位置和大小。

如果您需要处理复杂的脚本(例如,从右到左的语言和字母根据上下文改变形状的脚本),您将需要 Uniscribe。注意:Uniscribe 功能强大但级别很低。用更高级别的接口包装它可能需要做很多工作。如果您需要复杂的脚本处理,最好使用浏览器控件。

于 2009-05-07T16:36:58.573 回答
0

两者都DrawText()可以DrawTextEx()做到这一点。关键是DT_WORDBREAKformat参数中使用。

要在顶部的 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);
于 2021-08-26T11:47:39.233 回答