具有SysMonthCal32类的窗口不响应WM_SETFONT

问题描述 投票:0回答:1

我不确定我做错了什么。我在基于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开始呢?

c++ winapi common-controls
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.