SysMonthCal32类的窗口不响应WM_SETFONT

时间:2019-03-17 08:16:39

标签: c++ winapi common-controls

我不确定我在做什么错。我在基于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上的屏幕截图,可以正常运行:

正常放大倍率:

enter image description here

放大:

enter image description here

但这是我在Windows 10上得到的,正常放大倍数:

enter image description here

并且(应该是)放大了,但是没有:

enter image description here

那么为什么它可以在XP上运行并从Vista开始停止运行?

1 个答案:

答案 0 :(得分:0)

您可能正在使用使用Visual Styles API的ComCtl32.dll版本6。
这意味着大多数文本都是通过DrawThemeTextDrawThemeTextEx绘制的。
这两个函数都使用HTHEME参数指定的字体。

要更改字体,可以使用SetWindowTheme更改窗口主题,也可以使用版本6之前的ComCtl32.dll版本。

WM_SETFONTWM_GETFONT的处理似乎是为了与使用这些消息存储字体的程序保持兼容性。它们实际上并没有用于绘图。