C++ 下划线在DrawText使用DT_CALCRECT报告的矩形外绘制 症状

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上复制

我对的最新版本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上复制(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字体文件的所有详细信息。first
DrawText
返回的值是否与更新的
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 );