MFC DrawText,垂直,DT_CALCRECT 和 lf_escapement = 900

MFC DrawText, vertical, DT_CALCRECT with lf_escapement = 900

我正在使用一些 GDI 绘图处理 MFC 项目。 我使用 DC.DrawText 将垂直文本绘制成 DC,使用 LOGFONTlfEscapement = 900。 当我以所需的垂直格式使用 DT_NOCLIP 时,将输出文本。 然而,为了使文本居中,我使用了带有 DT_CALCRECT 参数的 DC.DrawText 调用。 我认识到,尽管文本确实是垂直绘制的,但 CRect 的宽度更大 比身高。 我的直觉告诉我垂直绘制的文本的高度应该大于宽度。 我没有包括使文本居中的计算。问题是当我实现垂直居中时我可以依赖什么。

DC.DrawTextDT_CALCRECT 是否忽略擒纵机构?

void CMFCFontTestDlg::OnPaint()
{
  CPaintDC dc(this); // Gerätekontext zum Zeichnen

  if (IsIconic())
  {
    ...
  }
  else
  {
    CDialogEx::OnPaint();

    CRect clTextRect;
    CFont myFont;

    myFont.CreateFont(12, 0, 900, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, _T("Tahoma"));

    CFont* oldFont = dc.SelectObject(&myFont);

    dc.DrawText(_T("000000"), clTextRect, DT_CALCRECT);
    clTextRect.MoveToXY(100, 100);

    dc.DrawText(_T("000000"), clTextRect, DT_NOCLIP);
    dc.SelectObject(oldFont);
  }
}

我在 DrawTextEx 函数的评论中发现了它 https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-drawtextexa。 但是,请注意 DrawText 的文档和 DT_CALCRECT 标志的文档都没有说明这一点。 如果使用 DrawText 而不是 DrawTextEx,这很可能会受到监督。 我通过 "Is this page helpful?" 反馈可能性将此事告知了 MS​​。

Remarks

The DrawTextEx function supports only fonts whose escapement and orientation are both zero.

The text alignment mode for the device context must include the TA_LEFT, TA_TOP, and TA_NOUPDATECP flags.

考虑到这一点,解决方案是从为擒纵机构 = 0 确定的尺寸开始使用一些三角函数计算,然后计算旋转矩形的左上角和右下角点。