Программирование в Delphi. Трюки и эффекты. Александр Чиртик
сообщений здесь довольно проста, за исключением изменения шрифта текстового поля. Обратите внимание на следующий отрывок листинга 2.34:
//Замена шрифта в Edit
hOldFont:= HFONT(SendDlgItemMessage(hMainWnd,2001,WM_GETFONT, 0,0));
hCurFont:= CreateFontIndirect(font);
SendDlgItemMessage(hMainWnd, 2001, WM_SETFONT,
Integer(hCurFont), Integer(True));
SetEdit Text(2001, 'Текст, записанный выбранным шрифтом');
if (hOldFont <> 0) then DeleteObject(hOldFont);
Этот довольно объемный фрагмент кода всего лишь заменяет шрифт в текстовом поле. Подобную операцию можно использовать для задания шрифта любого элемента управления. В частности, в приведенных в этой главе примерах текст на кнопках, надписях и т. д. выглядит довольно невзрачно потому, что используется системный шрифт, установленный по умолчанию.
Способ, которым можно установить шрифт всех элементов управления окна, рассмотрен ниже. Остался еще один существенный момент: не забывайте удалять объекты GDI (в данном случае – шрифт) после того, как они стали не нужны. Дело в том, что приложение может содержать не более 65 ООО объектов GDI, и при наличии так называемой «утечки» ресурсов GDI может произойти аварийное завершение приложения из-за исчерпания лимита ресурсов GDI.
Установка шрифта элементов управления
Существует множество способов установки шрифта текста, отображаемого в элементах управления. Можно, например, при создании элемента управления посылать ему сообщение WM_SETFONT, передавая дескриптор (HFONT) созданного ранее объекта шрифта. В таком случае код создания и установки шрифта элементов управления (с использованием рассмотренных в этой главе функций) может выглядеть, как показано в листинге 2.35.
//Шрифт для элементов управления
font:= CreateFont(16, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET,
OUT_CHARACTER_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH, 'Courier new');
//Создание элементов управления
ctrl:= CreateButt on(20, 30, 70, 30, 1001, 'Кнопка 1');
SendMessage(ctrl, WM_SETFONT, HFONT(font), 1);
ctrl:= CreateButt on(100, 30, 70, 30, 1002,'Кнопка 2');
SendMessage(ctrl, WM_SETFONT, HFONT(font), 1);
ctrl:= CreateCheck(210, 30, 180, 20, 2001, 'Флажок 1');
SendMessage(ctrl, WM_SETFONT, HFONT(font), 1);
ctrl:= CreateCheck(210, 60, 180, 20, 2001, 'Флажок 2', True);
SendMessage(ctrl, WM_SETFONT, HFONT(font), 1);
ctrl:= CreateOpti on(210, 100, 180, 20, 3001, 'Переключатель 1', True);
SendMessage(ctrl, WM_SETFONT, HFONT(font), 1);
ctrl:= CreateOpti on(210,130,180,20,3002, 'Переключатель 2', False, True);
SendMessage(ctrl, WM_SETFONT, HFONT(font), 1);
ctrl:= CreateOpti on(210, 160, 180, 20, 3003, 'Переключатель 3', True);
SendMessage(ctrl, WM_SETFONT, HFONT(font), 1);
//Запуск цикла обработки сообщений
while (Longint(GetMessage(mess, 0, 0, 0)) <> 0)
do begin
TranslateMessage(mess);
DispatchMessage(mess);
end;
//Удаление шрифта
DeleteObject(font);
Вид окна с элементами управления, шрифт которых установлен любым из рассмотренных способов, показан на рис. 2.9.
Рис. 2.9. Шрифт элементов управления, отличный от системного
Способ задания шрифта, приведенный в листинге 2.35, легко реализовать. Его существенным недостатком является двукратное увеличение количества строк кода, выполняющих создание элементов управления. Для окон, содержащих большое количество элементов управления, можно предложить более универсальный способ (листинг 2.36).
//Шрифт для элементов управления
font:= CreateFont(16, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET,
OUT_CHARACTER_PRECIS, CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY, DEFAULT_PITCH, 'Courier new');
//Создание элементов управления
CreateButton(20,