MFC:如何使用环绕和垂直居中绘制文本?

Posted

技术标签:

【中文标题】MFC:如何使用环绕和垂直居中绘制文本?【英文标题】:MFC: how to draw text with wrapping and v-centering? 【发布时间】:2020-03-08 00:21:50 【问题描述】:

以下代码使用 DrawText(单行)和 DrawTextEx(换行)绘制文本。我想要两个都以 v 为中心。

    CRect rect1(50, 50, 100, 125);
    CRect rect2(100, 50, 500, 125);

    CPen pen(PS_SOLID, 0, RGB(192, 192, 192));

    pDC->MoveTo(rect1.left, rect1.top);
    pDC->LineTo(rect2.right, rect2.top);
    pDC->MoveTo(rect1.left, rect1.bottom);
    pDC->LineTo(rect2.right, rect2.bottom);

    pDC->DrawText("hello", rect1, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
    pDC->DrawTextEx("0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 ",
                    rect2, DT_EDITCONTROL | DT_WORDBREAK | DT_LEFT | DT_VCENTER, NULL);

输出如下图,看起来单行是垂直居中的,但不是换行的。另外,请注意,上面的部分内容已涵盖,也应加以解决。

【问题讨论】:

DT_VCENTER 的文档指出:“垂直居中文本。此值仅与 DT_SINGLELINE 值一起使用。” 【参考方案1】:

DT_VCENTER 只能与DT_SINGLELINE 组合使用。对于多线绘制,使用DT_CALCRECT获取高度,然后手动计算中心。示例:

CString str = "0123456789 0123456789 0123456789 0123456789 0123456789";
CRect rc = rect2;
dc.DrawText(str, &rc, DT_EDITCONTROL | DT_WORDBREAK | DT_LEFT | DT_CALCRECT);
rc.OffsetRect(0, (rect2.Height() - rc.Height()) / 2);
dc.DrawText(str, &rc, DT_EDITCONTROL | DT_WORDBREAK | DT_LEFT);

【讨论】:

以上是关于MFC:如何使用环绕和垂直居中绘制文本?的主要内容,如果未能解决你的问题,请参考以下文章

word中如何让文字与图片上下居中?

如何用word使图片上下居中

有没有一种“正确”的方式让 NSTextFieldCell 绘制垂直居中的文本?

Android绘制文字时垂直居中

web前端技巧-文本如何垂直居中?多行文本如何实现上下居中?

如何让Word文本框中的文字垂直上下居中