在DrawText使用DT_CALCRECT报告的矩形之外绘制下划线

时间:2017-08-15 13:56:35

标签: c++ fonts mfc gdi

症状

我的"常规"中的Lato font的最新版本2.0存在问题。变种。此问题不会出现在Lato 1.0中。

似乎下划线比DrawText()报告的DT_CALCRECT标记下方的矩形低1px。

在以下屏幕截图中,计算的矩形由蓝色背景指示。我已在此矩形的右侧添加了10px,因此您可以看到与下划线绘制位置的差异。

Lato 2.0 - DT_CALCRECT报告的矩形 错误地绘制了下划线:

Lato 2.0

Lato 1.0 - 在DT_CALCRECT报告的矩形正确绘制下划线:

Lato 1.0

MCVE

  • 可以在Win 10和Win 7(Win 8未测试)
  • 上复制
  • Download并安装Lato 2.0 Regular字体(Lato-Regular.ttf)。
  • 使用向导创建基于对话框的MFC应用程序,并使用示例代码替换对话框的OnPaint()处理程序。

OnPaint()的示例代码:

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 );

问题

您认为这是我的代码中的问题,操作系统中的错误还是字体中的错误?

不幸的是,我不能只使用Lato 1.0,因为Lato 2.0增加了对我的软件需要支持的许多新语言的支持。

0 个答案:

没有答案