在 MFC 中使用 DrawTextEx 自动换行
Posted
技术标签:
【中文标题】在 MFC 中使用 DrawTextEx 自动换行【英文标题】:Word wrap with DrawTextEx in MFC 【发布时间】:2012-06-28 08:09:13 【问题描述】:我需要在矩形内绘制文本。但是当文本很长时,它会剪掉多余的文本。我需要对文本进行换行,以便第一行不适合的多余文本部分转到下一行。
我已经谷歌了,有人建议使用带有 DT_CALCRECT 标志的 DrawTextEx() 而不是 DrawText()。但它仍然不起作用,当我使用这个标志时,我没有得到文本。
DRAWTEXTPARAMS lpDTParams;
lpDTParams.cbSize = sizeof(lpDTParams);
lpDTParams.iLeftMargin = 1;
lpDTParams.iRightMargin = 1;
lpDTParams.iTabLength = 4;
lpDTParams.uiLengthDrawn = 0;
pDC->DrawTextExA(sTemp, rc, DT_NOCLIP|DT_CENTER|DT_WORDBREAK|DT_CALCRECT, &lpDTParams);
任何建议将不胜感激。 谢谢
【问题讨论】:
嗯,这取决于你如何设置你的 CRect。 DT_CALCRECT 将增加其底部以适合所有文本行,但您必须提供足够的宽度。如果你有一个固定的区域,我建议不要使用 DT_CALCRECT(如果文本太大,请考虑使用 DT_NOCLIP 会发生什么)。最后检查 CRect 内容,它必须足够大以适合文本宽度。 另外请记住,如果您传递 DT_CALCRECT 则不绘制任何文本,它只是计算矩形需要多高才能适合所有内容。您需要再次调用 DrawTextEx 以使用计算出的 rect 进行绘制。 DT_CALCRECT 将用于获取新的矩形。删除 DT_CALCRECT 后再次调用此函数将绘制文本。但是现在文本来了,但线没有被换行,它扩展了矩形边界,但没有出现在 nect 线上。您能否对此发表评论,为什么文本 id 没有移动到下一行。 【参考方案1】:你不需要计算矩形。
使用以下标志:DT_LEFT | DT_EDITCONTROL | DT_WORDBREAK。
一条建议:
不要使用 UNICODE 或 ANSI 特定的函数名。
根据您的项目设置,编译器会选择正确的版本。这样您的应用程序是可移植的。
【讨论】:
感谢 JohnCz 使用 DT_EDITCONTROL 达到目的。以上是关于在 MFC 中使用 DrawTextEx 自动换行的主要内容,如果未能解决你的问题,请参考以下文章