我不确定我做错了什么。我在基于CDialog的MFC应用程序中有一个功能,可以增加某些常用控件的字体。通过向他们发送更大字体的WM_SETFONT消息来完成:
//No error checks for brevity
HFONT hFnt = (HFONT)::SendMessage(hCtrlWnd, WM_GETFONT, 0, 0);
LOGFONT lfFont;
::GetObject(hFnt, sizeof(lfFont), &lfFont);
BOOL bPositive = lfFont.lfHeight >= 0;
long nFontSz = abs(lfFont.lfHeight);
nFontSz += nFontDelta;
lfFont.lfHeight = bPositive ? nFontSz : -nFontSz;
HFONT hNewFont = ::CreateFontIndirect(&lfFont);
::SendMessage(hCtrlWnd, WM_SETFONT, (WPARAM)hNewFont, TRUE);
//Need to DeleteObject hNewFont when control gets a new font or is destroyed
这适用于除DateTime选择器之外的大多数控件(或更准确地说,它的月历,SysMonthCal32
窗口类。)
这是Windows XP上的屏幕截图,它按预期工作:
正常放大率:
放大:
但这是我在Windows 10上获得的正常放大倍数:
并且(应该是)放大了,但不是:
那么为什么它在XP上工作并停止,从Vista开始呢?
您可能正在使用使用Visual Styles API的ComCtl32.dll版本6。
这意味着大多数文本都是由DrawThemeText
或DrawThemeTextEx
绘制的。
这两个函数都使用HTHEME
参数指定的字体。
要更改字体,您可以使用SetWindowTheme
更改窗口的主题,也可以在版本6之前使用版本的ComCtl32.dll。
WM_SETFONT
和WM_GETFONT
的处理似乎是为了保持与使用这些消息存储其字体的程序的兼容性。它们实际上并不用于绘图。