Чтение онлайн

на главную

Жанры

Шрифт:

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

Есть множество способов установки шрифта текста, отображаемого в элементах управления. Можно, например, при создании каждого элемента управления посылать ему сообщение WM_SETFONT, передавая дескриптор (HFONT) созданного ранее объекта шрифта. В таком случае код создания и установки шрифта элементов управления (с использованием рассмотренных в этой главе функций) может выглядеть, как в листинге 2.35.

...

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

SendMessage(ctrl, WM_SETFONT, HFONT(font), 1);

ctrl := CreateButton(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 := CreateOption(210, 100, 180, 20, 3001, \'Переключатель 1\',

True);

SendMessage(ctrl, WM_SETFONT, HFONT(font), 1);

ctrl := CreateOption(210,130,180,20,3002, \'Переключатель 2\',

False, True);

SendMessage(ctrl, WM_SETFONT, HFONT(font), 1);

ctrl := CreateOption(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).

...

Листинг 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), которая будет вызываться по одному разу для каждого дочернего окна. В нашем примере функцияЕпитРипс имеет следующий вид (листинг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).

...

Листинг 3.1.

Как узнать, присутствует ли мышь

function MousePresent : Boolean;

begin

//При помощи вызова GetSystemMetrics определяем

//наличие мыши в системе

if GetSystemMetrics(SM_MOUSEPRESENT) <> 0 then

Result := True

else

Result := False;

end;

Описанная выше функция MousePresent позволяет проверить наличие мыши. Когда мышь присутствует, MousePresent возвращает True, в противном случае – False.

После того как мы обнаружили мышь, можем приступать к определению ее координат на экране (листинг 3.2).

...

Листинг 3.2.

Определение координат указателя мыши

procedure MouseForm.Button1Click(Sender: TObject);

var

pt: TPoint;

begin

//Получаем координаты указателя мыши

GetCursorPos(pt);

ShowMessage( \'(\' + IntToStr(pt.X) + \' ,\' + IntToStr( pt.Y ) + \')\' );

end;

Поделиться:
Популярные книги

Лекарь Империи 9

Карелин Сергей Витальевич
9. Лекарь Империи
Фантастика:
городское фэнтези
аниме
боевая фантастика
5.00
рейтинг книги
Лекарь Империи 9

Газлайтер. Том 5

Володин Григорий
5. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 5

Сапер

Вязовский Алексей
1. Сапер
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.29
рейтинг книги
Сапер

Я еще не князь. Книга XIV

Дрейк Сириус
14. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще не князь. Книга XIV

Кодекс Охотника. Книга VII

Винокуров Юрий
7. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
4.75
рейтинг книги
Кодекс Охотника. Книга VII

Я снова не князь! Книга XVII

Дрейк Сириус
17. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я снова не князь! Книга XVII

Точка Бифуркации XI

Смит Дейлор
11. ТБ
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Точка Бифуркации XI

Воронцов. Перезагрузка. Книга 2

Тарасов Ник
2. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Воронцов. Перезагрузка. Книга 2

Спасите меня, Кацураги-сан! Том 4

Аржанов Алексей
4. Токийский лекарь
Фантастика:
городское фэнтези
попаданцы
дорама
фэнтези
5.00
рейтинг книги
Спасите меня, Кацураги-сан! Том 4

Газлайтер. Том 26

Володин Григорий Григорьевич
26. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 26

Я уже царь. Книга XXIX

Дрейк Сириус
29. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я уже царь. Книга XXIX

Газлайтер. Том 4

Володин Григорий
4. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 4

Идеальный мир для Лекаря 13

Сапфир Олег
13. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 13

Огненный наследник

Тарс Элиан
10. Десять Принцев Российской Империи
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Огненный наследник