C++ 下划线在DrawText使用DT_CALCRECT报告的矩形外绘制 症状
我对的最新版本2.0的“常规”变体有一个问题。Lato 1.0不会出现此问题 下划线似乎是在带有C++ 下划线在DrawText使用DT_CALCRECT报告的矩形外绘制 症状,c++,fonts,mfc,gdi,C++,Fonts,Mfc,Gdi,我对的最新版本2.0的“常规”变体有一个问题。Lato 1.0不会出现此问题 下划线似乎是在带有DT\u CALCRECT标志的DrawText()报告的矩形下方1px处绘制的 在以下屏幕截图中,计算出的矩形由蓝色背景指示。我在这个矩形的右边加了10px,这样你可以看到画下划线的位置的差异 Lato 2.0-下划线错误地绘制在由DT\u CALCRECT报告的矩形外: Lato 1.0-下划线正确绘制在由DT\u CALCRECT报告的矩形内: MCVE 可在Win 10和Win 7上复制
DT\u CALCRECT
标志的DrawText()
报告的矩形下方1px处绘制的
在以下屏幕截图中,计算出的矩形由蓝色背景指示。我在这个矩形的右边加了10px,这样你可以看到画下划线的位置的差异
Lato 2.0-下划线错误地绘制在由DT\u CALCRECT报告的矩形外:
Lato 1.0-下划线正确绘制在由DT\u CALCRECT报告的矩形内:
MCVE
- 可在Win 10和Win 7上复制(Win 8未测试)
- 并安装Lato 2.0常规字体(Lato-Regular.ttf)
- 使用向导创建基于对话框的MFC应用程序,并用示例代码替换对话框的
OnPaint()
处理程序
OnPaint()
的示例代码:
问题:
你认为这是我代码中的问题,是操作系统中的错误还是字体中的错误
不幸的是,我不能仅仅使用Lato 1.0,因为Lato 2.0增加了对我的软件需要支持的许多新语言的支持 目前没有时间深入研究这个问题,但是DrawText
的内部Windows实现并没有发挥任何作用。在绘制文本之后,它只在文本范围下方绘制一条线。因此,差别几乎肯定是你的字体。Lato 2.0的基线低于Lato 1.0。您应该能够在字体查看器程序中查看这一点,该程序显示有关OTF/TTF字体文件的所有详细信息。firstDrawText
返回的值是否与更新的textRect
的高度匹配?@VTT,是的,两个值都匹配。对我来说,这看起来像是字体中的错误!只要我的2美分。
CPaintDC dc{ this };
CRect rect; GetClientRect( &rect );
LOGFONTW lf{};
wcscpy_s( lf.lfFaceName, L"Lato" );
lf.lfHeight = 20 * 10; // tenths of a point
lf.lfWeight = FW_NORMAL;
lf.lfUnderline = TRUE;
CFont font;
VERIFY( font.CreatePointFontIndirect( &lf ) );
const int saved = dc.SaveDC();
dc.SelectObject( &font );
dc.SetBkMode( TRANSPARENT );
dc.SetTextColor( RGB( 0, 0, 0 ) );
const CString text = L"Hello Lato";
const DWORD dtFlags = 0;
// Calculate the size required by the text and fill this rectangle
CRect textRect = rect;
dc.DrawText( text, textRect, dtFlags | DT_CALCRECT );
textRect.right += 10;
dc.FillSolidRect( 0, 0, textRect.right, textRect.bottom, RGB( 180, 180, 255 ) );
// Actually draw the text
dc.DrawTextW( text, rect, dtFlags );
if( saved )
dc.RestoreDC( saved );