MFC:如何使用环绕和 v 居中绘制文本?
MFC: how to draw text with wrapping and v-centering?
以下代码使用 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);
输出如下图,看起来单行是 v-centered 而不是换行的。另请注意,上面的一些内容已被覆盖,也应加以解决。
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);
以下代码使用 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);
输出如下图,看起来单行是 v-centered 而不是换行的。另请注意,上面的一些内容已被覆盖,也应加以解决。
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);