Я хочу, чтобы все элементы управления (edit, list control и т.д.) в моем приложении имели тот же шрифт, который не является системным по умолчанию. Как мне это сделать? Есть ли какой-либо Win32 API, который устанавливает шрифт по умолчанию для приложения?
Как установить шрифт по умолчанию для всех окон в приложении Win32?
Ответ 1
В Windows не предусмотрен какой-либо механизм для всплывающего шрифта. Каждый класс окна может иметь собственное поведение для выбора шрифта, который будет использоваться по умолчанию. Он может попытаться выбрать шрифт, используемый диалоговыми окнами оболочки Windows, или может просто нарисовать его текст, используя шрифт ужасной растровой "системы", автоматически выбранный в новые контроллеры домена.
Все классы окна управления Windows в целом отвечают на WM_SETFONT
, который является стандартным сообщением окна для сообщения о том, какой шрифт вам нужен использовать. Когда вы реализуете свои собственные классы окон (особенно новые классы окон дочерних элементов управления), вы также должны написать обработчик для WM_SETFONT
:
- Если ваш класс окна имеет дочерние окна, ваш обработчик
WM_SETFONT
должен отправить сообщение каждому из них. - Если ваш класс окна выполняет какой-либо пользовательский чертеж, обязательно сохраните HFONT, который вы получите в своем обработчике
WM_SETFONT
, и выберите его в DC, который вы используете при рисовании вашего окна. - Если ваш оконный класс используется как окно верхнего уровня, ему потребуется логика, чтобы выбрать свой собственный шрифт, так как у него не будет родительского окна, чтобы отправить ему сообщение
WM_SETFONT
.
Обратите внимание, что менеджер диалога выполняет некоторые из этих действий для вас; при создании шаблона диалога новый шрифт диалога устанавливается на шрифт, названный в шаблоне, и диалог отправляет WM_SETFONT
все его дочерние элементы управления.
Ответ 2
Внедрите это:
bool CALLBACK SetFont(HWND child, LPARAM font){
SendMessage(child, WM_SETFONT, font, true);
return true;
}
внутри отдельного файла или только в main.cpp, а затем просто запустите:
EnumChildWindows(hwnd, (WNDENUMPROC)SetFont, (LPARAM)GetStockObject(DEFAULT_GUI_FONT));
когда вы хотите, например, в сообщении WM_CREATE
, после создания всех дочерних окон!
У меня всегда есть SetFont.cpp
и SetFont.h
в моих решениях приложений win32 GUI.
Ответ 3
Да, вы можете!
HFONT defaultFont;
defaultFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
SendMessage(handlerControl, WM_SETFONT, WPARAM (defaultFont), TRUE); // Send this to each control
Ответ 4
Удобный способ установки шрифта для всех дочерних окон за один вызов:
SendMessageToDescendants( WM_SETFONT,
(WPARAM)m_fntDialogFont.GetSafeHandle(),
0 );
Ответ 5
Вы не можете, нет никакого способа сделать это для всех элементов управления одновременно. Вам нужно будет установить его через редактор ресурсов, как было предложено ранее, или вызвать SetFont() вручную для каждого элемента управления.
Ответ 6
Вы можете установить шрифт для каждого диалогового окна через представление ресурсов. Щелкните правой кнопкой мыши по диалогу (не на другом элементе управления), выберите свойства и параметр шрифта.