【问题标题】:MFC DrawText, vertical, DT_CALCRECT with lf_escapement = 900MFC DrawText,垂直,DT_CALCRECT with lf_escapement = 900
【发布时间】:2020-09-11 23:43:50
【问题描述】:

我正在处理一个带有一些 GDI 绘图的 MFC 项目。 我使用DC.DrawText 使用LOGFONTlfEscapement = 900 将垂直文本绘制到DC 中。 当我以所需的垂直格式使用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);
  }
}

【问题讨论】:

    标签: c++ mfc gdi rect vertical-text


    【解决方案1】:

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

    备注

    DrawTextEx 函数仅支持具有擒纵和 方向都是零。

    设备上下文的文本对齐模式必须包含 TA_LEFTTA_TOPTA_NOUPDATECP 标志。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 2011-08-03
      • 1970-01-01
      相关资源
      最近更新 更多