Как я могу указать шрифт для окна, созданного через CreateWindow? - PullRequest
11 голосов
/ 21 октября 2008

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

Ответы [ 3 ]

14 голосов
/ 22 октября 2008

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

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

Как сказал 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);
6 голосов
/ 21 октября 2008

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

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

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