Способ задания шрифта, приведенный в листинге 2.35, легко реализовать. Его существенным недостатком является двукратное увеличение количества строк кода, выполняющих создание элементов управления. Для окон, содержащих большое количество элементов управления, можно предложить более универсальный способ (листинг 2.36).

Листинг 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, 30, 70, 30, 1001, 'Кнопка 1');

CreateButton(100, 30, 70, 30, 1002,'Кнопка 2');

CreateCheck(210, 30, 180, 20, 2001, 'Флажок 1');

CreateCheck(210, 60, 180, 20, 2001, 'Флажок 2', True);

CreateOption(210, 100, 180, 20, 3001, 'Переключатель 1', True);

CreateOption(210, 130, 180, 20, 3002, 'Переключатель 2', False, True);

CreateOption(210, 160, 180, 20, 3003, 'Переключатель 3', True);

//Установка шрифта элементов управления

EnumChildWindows(hMainWnd, Addr(EnumFunc), font);

//Запуск цикла обработки сообщений

while (Longint(GetMessage(mess, 0, 0, 0)) <> 0)

do begin

TranslateMessage(mess);

DispatchMessage(mess);

end;

DeleteObject(font);


Собственно, за установление шрифта отвечает в приведенном листинге только одна строка:


EnumChildWindows(hMainWnd, Addr(EnumFunc), font);


При этом также нужно определить функцию обратного вызова (в данном случае это функция EnumFunc), которая будет вызываться по одному разу для каждого дочернего окна. В данном примере функция EnumFunc имеет следующий вид (листинг 2.37).

Листинг 2.37. Реализация функции EnumFunc

function EnumFunc(wnd: HWND; param: LPARAM): BOOL; stdcall;

begin

SendMessage(wnd, WM_SETFONT, WPARAM(param), LPARAM(True));

EnumFunc:= True; //Продолжать перечисление

end;


В принципе, имя этой функции и названия параметров могут быть любыми, а вот типы параметров, возвращаемого значения и способ вызова функции должны быть именно такими, какие представлены в листинге 2.37. Функция должна возвращать True, если нужно продолжать перечисление окон, и False – в противном случае. Значение, которое было передано в качестве третьего параметра API-функции EnumChildWindows, передается в функцию обратного вызова. В данном случае этим параметром является дескриптор шрифта.

Глава 3

Мышь и клавиатура

• Мышь

• Клавиатура


Самыми распространенными устройствами управления персональным компьютером являются мышь и клавиатура. Клавиатура обеспечивает полноценный ввод текстовой информации, а мышь является наиболее простым, интуитивно понятным средством работы с графическим интерфейсом. Поэтому существует масса возможностей по созданию различного рода хитростей и трюков, связанных с мышью и клавиатурой.

Мышь

Кто из нас не пользовался мышью? Это незамысловатое устройство помогает быстро, а главное просто работать с программами. Начнем с простых операций с мышью. Научимся определять координаты, а также программно перемещать и делать невидимым указатель мыши. Кроме того, вы узнаете, как «захватить» указатель мыши, ограничить область его перемещения и вычислить расстояние, проходимое указателем мыши на экране монитора.

Координаты и указатель мыши

Для начала программным путем определим наличие мыши в системе, а именно выясним, что мышь подключена к компьютеру и правильно настроена (то есть устройство используется). Один из способов определения наличия мыши демонстрирует следующий пример (листинг 3.1).

Листинг 3.1. Определение присутствия в системе мыши