Как установить шрифт по умолчанию для всех окон в приложении Win32? - PullRequest
12 голосов
/ 02 июня 2009

Я хочу, чтобы все элементы управления (редактирование, управление списком и т. Д.) В моем приложении имели одинаковый шрифт, который не является системным по умолчанию. Как мне это сделать? Есть ли Win32 API, который устанавливает шрифт приложения по умолчанию?

Ответы [ 6 ]

13 голосов
/ 13 июня 2013

Реализуйте это:

    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 для приложений.

8 голосов
/ 02 июня 2009

Windows не предоставляет никакого механизма для шрифта всего приложения. Каждый класс окна может иметь собственное поведение для выбора шрифта для использования по умолчанию. Он может попытаться выбрать шрифт, используемый диалогами оболочки Windows, или просто нарисовать свой текст, используя ужасный растровый «системный» шрифт, автоматически выбранный в новые контроллеры домена.

Все классы окна общего управления Windows отвечают на WM_SETFONT, которое является стандартным оконным сообщением, сообщающим окну, какой шрифт вы хотите использовать. Когда вы реализуете свои собственные классы окон (особенно новые дочерние классы окон управления), вы также должны написать обработчик для WM_SETFONT:

  1. Если в вашем классе окон есть дочерние окна, ваш обработчик WM_SETFONT должен переслать сообщение каждому из них.
  2. Если ваш оконный класс выполняет какой-либо пользовательский рисунок, обязательно сохраните HFONT, полученный в обработчике WM_SETFONT, и выберите его в DC, который вы используете при рисовании окна.
  3. Если ваш класс окна используется в качестве окна верхнего уровня, ему потребуется логика для выбора собственного шрифта, поскольку у него не будет родительского окна для отправки ему сообщения WM_SETFONT.

Обратите внимание, что менеджер диалогов делает кое-что за вас; при создании шаблона диалога в качестве шрифта нового диалога указывается шрифт, указанный в шаблоне, и диалоговое окно отправляет WM_SETFONT все его дочерние элементы управления.

6 голосов
/ 09 апреля 2011

Да, вы можете!

HFONT defaultFont;
defaultFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
SendMessage(handlerControl, WM_SETFONT, WPARAM (defaultFont), TRUE); // Send this to each control
4 голосов
/ 06 августа 2009

Удобный метод для установки шрифта для всех дочерних окон за один вызов:

SendMessageToDescendants( WM_SETFONT, 
                          (WPARAM)m_fntDialogFont.GetSafeHandle(), 
                          0 ); 
1 голос
/ 02 июня 2009

Вы не можете, нет способа сделать это для всех элементов управления одновременно. Вам нужно будет установить его через редактор ресурсов, как было предложено ранее, или вручную вызывать SetFont () для каждого элемента управления.

0 голосов
/ 02 июня 2009

Вы можете установить шрифт для каждого диалогового окна в представлении ресурсов. Щелкните правой кнопкой мыши диалоговое окно (не на другом элементе управления), выберите свойства и параметр шрифта.

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