Окно с классом SysMonthCal32 не отвечает на WM_SETFONT - PullRequest
0 голосов
/ 17 марта 2019

Я не уверен, что я делаю не так.В моем приложении MFC на основе CDialog есть функция, позволяющая увеличить шрифт в некоторых общих элементах управления.Это делается путем отправки им 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 голосов
/ 17 марта 2019

Вероятно, вы используете ComCtl32.dll версии 6, которая использует API визуальных стилей.
Это означает, что большая часть текста рисуется либо DrawThemeText, либо DrawThemeTextEx.
Обе эти функции используют шрифт, заданный аргументом HTHEME.

Чтобы изменить шрифт, вы можете либо изменить тему окна, используя SetWindowTheme, либо использовать версию ComCtl32.dll доверсия 6.

Кажется, что обработка WM_SETFONT и WM_GETFONT предназначена для обеспечения совместимости с программами, которые используют эти сообщения для хранения своего шрифта.На самом деле они не используются для рисования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...