文档[ 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
文本。
感谢任何帮助。
答案 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
。