MFC DrawText,垂直,DT_CALCRECT with lf_escapement = 900

Posted

技术标签:

【中文标题】MFC DrawText,垂直,DT_CALCRECT with lf_escapement = 900【英文标题】:MFC DrawText, vertical, 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);
  

【问题讨论】:

【参考方案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 确定的大小开始,然后计算旋转矩形的左上角和右下角点。

【讨论】:

以上是关于MFC DrawText,垂直,DT_CALCRECT with lf_escapement = 900的主要内容,如果未能解决你的问题,请参考以下文章

MFC 画字体DrawText()或TextOut(),CFont字体样式类

Android Canvas drawText实现中文垂直居中

Canvas drawText文字垂直居中方案

Android Canvas drawText实现中文垂直居中

记CRenderTarget:DrawText()绘制中文乱码的BUG及解决办法

Win32 C++ 中的 DrawText 会增加内存使用量