在 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 自动换行的主要内容,如果未能解决你的问题,请参考以下文章

MFC的CEdit多于1024个字符自动换行

MFC EDIT类控件 自动换行

MFC编辑框Edit

CGridCtrl 一行文字太长时候,怎么让 CGridCtrl 能够换行显示? VC/MFC / ...

MFC可以换行的编辑框

用mfc怎么打开excel表格