Как я могу указать шрифт для окна, созданного с помощью CreateWindow?

Я создаю окно с использованием чистого API Win32 (функции RegisterClass и CreateWindow). Как я могу указать шрифт для окна вместо системного, определенного?

Ответ 1

Когда вы создаете свой собственный класс окон, вы сами отвечаете за управление шрифтом. Эта задача будет состоять из четырех частей:

  • Когда окно создается (т.е. когда вы обрабатываете WM_CREATE), используйте CreateFont() или CreateFontIndirect(), чтобы получить HFONT для шрифта, который вы хотите использовать в окне. Вам нужно будет сохранить этот HFONT вместе с другими данными, которые вы храните для каждого экземпляра класса окна. Вы можете выбрать, чтобы ваш класс окна обрабатывал WM_GETFONT и WM_SETFONT а также, как правило, не требуется для окон верхнего уровня (если вы создаете класс окна управления, вам нужно будет обрабатывать WM_SETFONT, так как диспетчер диалога отправляет это сообщение).
  • Если в вашем окне есть дочерние окна, содержащие текст, отправляйте каждое из них сообщение WM_SETFONT всякий раз, когда изменяется шрифт вашего окна. Все обычные элементы управления Windows обрабатывают WM_SETFONT.
  • Когда вы рисуете содержимое своего окна (обычно в ответ на сообщение WM_PAINT), выберите HFONT в контекст устройства с помощью SelectObject() перед рисованием текста (или с помощью текстовых функций, таких как или GetTextMetrics ( )).
  • Когда окно уничтожается (т.е. когда вы обрабатываете WM_DESTROY), используйте DeleteObject(), чтобы выпустить шрифт, созданный на шаге 1. Обратите внимание: если вы решите обработать WM_SETFONT в своем окне, не удаляйте объект шрифта, который вы получаете в обработчике WM_SETFONT, как код, который отправил сообщение рассчитывает сохранить право собственности на этот дескриптор.

Ответ 2

Как сказал vividos, просто используйте CreateFont()/CreateFontIndirect:

HFONT hFont = CreateFont (13, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, ANSI_CHARSET, 
      OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, 
      DEFAULT_PITCH | FF_DONTCARE, TEXT("Tahoma"));

И затем установите этот шрифт для вашего окна/элемента управления с сообщением WM_SETFONT:

SendMessage(window, WM_SETFONT, hFont, TRUE);

Ответ 3

Если вы суперкласса стандартного общего элемента управления, который уже имеет свой собственный дескриптор шрифта, используйте этот подход: просто создайте шрифт с помощью CreateFont или CreateFontIndirect и установите его с помощью сообщения WM_SETFONT (в MFC и ATL там будет быть соответствующей функцией SetFont). Когда шрифт больше не нужен, уничтожьте шрифт с помощью DeleteObject. Обязательно не уничтожайте ранее установленный шрифт окна.

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