我不确定我在做什么错。我在基于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开始停止运行?
答案 0 :(得分:0)
您可能正在使用使用Visual Styles API的ComCtl32.dll版本6。
这意味着大多数文本都是通过DrawThemeText
或DrawThemeTextEx
绘制的。
这两个函数都使用HTHEME
参数指定的字体。
要更改字体,可以使用SetWindowTheme
更改窗口主题,也可以使用版本6之前的ComCtl32.dll版本。
WM_SETFONT
和WM_GETFONT
的处理似乎是为了与使用这些消息存储字体的程序保持兼容性。它们实际上并没有用于绘图。