0

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

4

1 回答 1

0

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

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

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

于 2019-03-17T10:23:11.187 回答