Я создаю окно с использованием чистого API Win32 (функции RegisterClass и CreateWindow). Как я могу указать шрифт для окна вместо системного, определенного?
Как я могу указать шрифт для окна, созданного с помощью 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
, чтобы пользователь мог установить другой шрифт. При рисовании используйте текущий объект шрифта, сохраненный в вашем классе.
Ответ 4
Один Addition- подход CreateFont не подойдет ни для каких приложений/меню. См. Https://docs.microsoft.com/en-us/windows/desktop/api/wingdi/nf-wingdi-createfonta.