如何制作' DrawText'矩形恰好适合文字?

时间:2017-11-02 05:35:36

标签: c winapi

文档[ 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的基础。在我的情况下,从fromsqlite->descrip数据库检索的sqlite始终被视为single-line文本。

感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

应添加

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