【问题标题】:How to make the 'DrawText' rectangle just fit the text?如何使“DrawText”矩形恰好适合文本?
【发布时间】:2018-04-14 13:29:19
【问题描述】:

[ here ] 的文档说如果我们使用DT_CALCRECT 标志,那么下面会做:

确定矩形的宽度和高度。如果有 多行文字,DrawText 使用矩形的宽度 由 pRect 参数指向并扩展 矩形来绑定文本的最后一行。如果只有一行 文本,DrawText 修改矩形的右侧,使其 限制行中的最后一个字符。无论哪种情况,DrawText 返回格式化文本的高度,但不绘制文本。

从描述中可以清楚地看出DT_CALCRECT 会使DrawText 来绘制内容,所以我应该做类似的事情

DrawTextExA(hdc, fromsqlite->descrip, -1, &rect, DT_CALCRECT, NULL);
// On debugging, I can see that rect is being modified in the above step.
if (DrawTextExA(hdc, fromsqlite->descrip, -1, &rect,
            DT_LEFT | DT_EDITCONTROL | DT_WORDBREAK, NULL) == 0) {
MessageBox(NULL, L"DrawText failed", NULL, MB_OK);
}

现在的问题是矩形的宽度应该是固定的。所以,我只想扩展矩形rect 的底部。在我的情况下,虽然从sqlite 数据库中检索到的fromsqlite->descrip 始终被视为single-line 文本。

感谢任何帮助。

【问题讨论】:

    标签: c winapi


    【解决方案1】:

    应添加DT_WORDBREAK 以中断单行文本。

    DT_CALCRECT 应与最终格式相结合才能得到矩形。

    文档:DrawText function(GDI 函数)

    DT_WORDBREAK
    断词。之间的线会自动断开 如果单词超出指定矩形的边缘,则为单词 通过 lpRect 参数。回车换行序列也 断线。

    如果未指定,则输出为一行。

    例子:

    RECT rc={ 0, 0, 200, 0 };
    const wchar_t* text = L"word1 word2 word3 word4 word5";
    UINT format = DT_LEFT | DT_TOP | DT_EDITCONTROL | DT_WORDBREAK;
    DrawText(hdc, text, -1, &rc, format | DT_CALCRECT);
    DrawText(hdc, text, -1, &rc, format);
    

    输出将类似于以下内容(取决于字体大小)

    word1 word2 word3
    word4 word5

    DT_EDITCONTROL 有必要吗?

    考虑这个例子:

    text = L"SingleLinexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    format = DT_LEFT | DT_TOP | DT_WORDBREAK;
    DrawText(hdc, text, -1, &rc, format | DT_CALCRECT);
    DrawText(hdc, text, -1, &rc, format);
    

    这一次“单词”可能比矩形的宽度更长,行不会中断,文本会溢出到右侧。

    您可能希望将格式与DT_EDITCONTROL 或其他标志(如DT_WORD_ELLIPSIS)结合使用,以确保右侧没有溢出。

    DrawTextEx 使用相同的 DT_XXXX 标志。

    附注:如果您的文本是 UTF-8,您可以使用 MultiByteToWideChar 转换为 UTF-16,而不是使用需要 ANSI 输入的 DrawTextA

    【讨论】:

    • 干杯朋友!我正在调查这个..DrawTextA 是故意的,因为我严格处理 ANSI 输入。
    • 好吧,这行得通!确实是一个不错的技术。但是我没有使用我觉得这里没有必要的`DT_EDITCONTROL`标志..
    • @sjsam 您在示例中使用了DT_EDITCONTROL。正如此答案正确显示的那样,您必须在第一次调用 DrawText 时使用与第二次调用 DrawText 相同的标志,否则计算出的矩形将不正确。
    • 如果没有DT_EDITCONTROL,文本也可能溢出到矩形的右侧。查看更新的答案。
    • 你可以复制一个矩形rcText = rc然后改变rc的高度
    猜你喜欢
    • 2018-01-01
    • 1970-01-01
    • 2017-09-15
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    相关资源
    最近更新 更多