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
使用LOGFONT
和lfEscapement = 900
将垂直文本绘制到DC
中。
当我以所需的垂直格式使用DT_NOCLIP
时,将输出文本。
然而,为了使这个文本居中,我使用DT_CALCRECT
参数调用DC.DrawText
。
我认识到,尽管文本确实是垂直绘制的,但 CRect
的宽度更大
比身高。
我的直觉告诉我,垂直绘制的文本的高度应该大于宽度。
我没有包括使文本居中的计算。问题是当我实现垂直居中时我可以依赖什么。
DC.DrawText
和 DT_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_LEFT
、TA_TOP
和TA_NOUPDATECP
标志。
考虑到这一点,解决方案是使用一些三角函数计算,从为擒纵 = 0 确定的大小开始,然后计算旋转矩形的左上角和右下角点。
【讨论】:
以上是关于MFC DrawText,垂直,DT_CALCRECT with lf_escapement = 900的主要内容,如果未能解决你的问题,请参考以下文章
MFC 画字体DrawText()或TextOut(),CFont字体样式类
Android Canvas drawText实现中文垂直居中
Android Canvas drawText实现中文垂直居中