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

на главную

Жанры

Шрифт:

Вот, собственно, и все, что нужно для работы рассматриваемой программы. Остается лишь уточнить, что способ установки масштаба, используемый в программе, предназначен для таких разрешений мониторов, при которых нет искажений по горизонтали или вертикали. Чаще всего это такие разрешения, при которых размеры изображения по горизонтали и вертикали подчиняются пропорции 4:3 (640 х 480, 800 х 600 и т. д.). При этом такими же пропорциями должен обладать экран монитора.

Подсвечивание элементов управления

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

В листинге 3.14 показано, как можно сделать статическую надпись похожей на гиперссылку (для

большего эффекта для такой надписи можно установить свойство Cursor равным crHandPoint на этапе проектирования формы).

...

Листинг 3.14.

Подчеркивание и изменение цвета надписи

procedure TForm1.lblUnderlineMouseEnter(Sender: TObject);

begin

lblUnderline.Font.Style := [fsUnderline];

lblUnderline.Font.Color := RGB(0, 0, 255);

end;

procedure TForm1.lblUnderlineMouseLeave(Sender: TObject);

begin

lblUnderline.Font.Style := [];

lblUnderline.Font.Color := RGB(0, 0, 0);

end;

Осталось добавить обработчик события Click для надписи, и получится довольно правдоподобная гиперссылка, правда, выполнять она может любое действие.

Начертание шрифта можно также изменить для стандартной кнопки. Как это можно сделать, показано в листинге 3.15.

...

Листинг 3.15.

Изменение начертания шрифта

procedure TForm1.cmbItalicBoldMouseMove(Sender: TObject;

Shift: TShiftState; X, Y: Integer);

begin

cmbItalicBold.Font.Style := [fsItalic, fsBold];

end;

procedure TForm1.lblItalicMouseEnter(Sender: TObject);

begin

lblItalic.Font.Style := [fsItalic];

end;

В листинге 3.15 используется обработчик MouseMove для кнопки потому, что, к великому сожалению, обработчики co6biTHftMouseEnter nMouseLeave для нее (по крайней мере, с вкладки Standard) не предусмотрены.

3.2. Клавиатура

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

Определение информации о клавиатуре

Начнем с небольшого примера, позволяющего определить некоторую информацию о клавиатуре (листинг 3.16). Пример основан на использовании API-функции GetKeyboardType.

...

Листинг 3.16.

Определение информации о клавиатуре

procedure TForm1.FormCreate(Sender: TObject);

begin

//Определяем тип клавиатуры

case GetKeyboardType(0) of

1: txtType.Text := \'PC/XT или совместимая (83 клавиши)\

2: txtType.Text := \'Olivetti «ICO» (102 клавиши)\

3: txtType.Text := \'PC/AT (84 клавиши) или похожая\

4: txtType.Text := \'Расширенная (101 или 102 клавиши)\

5: txtType.Text := \'Nokia 1050 или похожая\

6: txtType.Text := \'Nokia 9140 или похожая\

7: txtType.Text := \'японская\

end;

//Определяем код типа производителя

txtSubtype.Text := IntToStr(GetKeyboardType(1));

//Определяем количество функциональных клавиш

txtKeys.Text := IntToStr(GetKeyboardType(2));

end;

При создании формы происходит заполнение текстовых полей информацией о типе клавиатуры, коде типа, присвоенном производителем, и количестве функциональных клавиш.

Пример возможного результата определения информации о клавиатуре приводится на рис. 3.2.

Рис. 3.2. Информация о клавиатуре

Опрос клавиатуры

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

В листинге 3.17 приводится пример обработчика события TimerlTimer, определяющего, нажаты ли клавиши ↑, ↓, ←, →, а также пробел, Enter, Ctrl (правый) и Alt (правый).

...

Листинг 3.17.

Определение состояния некоторых клавиш

procedure TForm1.Timer1Timer(Sender: TObject);

var

buttons: TKeyBoardstate;

begin

//Получаем состояния клавиш

GetKeyboardState(buttons);

//Отобразим состояния клавиш

//..пробел

if buttons[VK_SPACE] and 128 <> 0 then

SendMessage(cmbSpace.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbSpace.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..enter

if buttons[VK_RETURN] and 128 <> 0 then

SendMessage(cmbEnter.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbEnter.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..правый Ctrl

if buttons[VK_RCONTROL] and 128 <> 0 then

SendMessage(cmbRCtrl.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbRCtrl.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..правый Alt

if buttons[VK_RMENU] and 128 <> 0 then

SendMessage(cmbRAlt.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbRAlt.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..правый Shift

if buttons[VK_RSHIFT] and 128 <> 0 then

SendMessage(cmbRShift.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbRShift.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..вверх

if buttons[VK_UP] and 128 <> 0 then

SendMessage(cmbUp.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbUp.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..вниз

if buttons[VK_Down] and 128 <> 0 then

SendMessage(cmbDown.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbDown.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..влево

if buttons[VK_LEFT] and 128 <> 0 then

SendMessage(cmbLeft.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbLeft.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..вправо

if buttons[VK_RIGHT] and 128 <> 0 then

SendMessage(cmbRight.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbRight.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

end;

Для того чтобы определить состояние клавиш, можно использовать API-функцию GetKeyboardState, которая заполняет массив buttons (на самом деле тип TKeyBoardstate определен как array [0. 255] of Byte) значениями, характеризующими, нажата ли клавиша. Причем значения в массиве buttons трактуются следующим образом:

• если установлен старший бит (проверка чего и делается в листинге 3.17), то клавиша в данный момент нажата;

• если установлен младший бит, то функция, закрепленная за этой клавишей (например, Caps Lock), включена.

Для индексации массива можно использовать ASCII-коды символов, а также константы, соответствующие несимвольным клавишам (обозначения и коды для таких клавиш приводятся в приложении 1).

Каждой контролируемой клавише (листинг 3.17) соответствует кнопка на форме. Для принудительной установки кнопки в нажатое или ненажатое состояние используется посылка сообщения BMSETSTATE. Пример определения состояния клавиш в некоторый момент времени показан на рис. 3.3.

Рис. 3.3. Состояние некоторых клавиш клавиатуры

Интересно, что рассмотренный способ работы с клавиатурой можно использовать даже для определения неисправных клавиш на клавиатуре, например, как это сделано в одной из программ пакета Norton Utilities.

Имитация нажатия клавиш

Состояние клавиш на клавиатуре можно не только определять, его также можно программно изменять. Рассмотрим один из способов программного нажатия клавиш, который крайне прост благодаря наличию API-функции keybdevent, как раз и предназначенной для имитации клавиатурного ввода.

Назначения параметров этой функции поясним на примере (листинг 3.18).

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

Горькие ягодки

Вайз Мариэлла
Любовные романы:
современные любовные романы
7.44
рейтинг книги
Горькие ягодки

Сама себе хозяйка

Красовская Марианна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Сама себе хозяйка

Черный Маг Императора 6

Герда Александр
6. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
7.00
рейтинг книги
Черный Маг Императора 6

Последний Паладин. Том 2

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

Огни Аль-Тура. Завоеванная

Макушева Магда
4. Эйнар
Любовные романы:
любовно-фантастические романы
эро литература
5.00
рейтинг книги
Огни Аль-Тура. Завоеванная

Законы Рода. Том 7

Flow Ascold
7. Граф Берестьев
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Законы Рода. Том 7

Жандарм 2

Семин Никита
2. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Жандарм 2

Измена. Мой заклятый дракон

Марлин Юлия
Любовные романы:
любовно-фантастические романы
7.50
рейтинг книги
Измена. Мой заклятый дракон

Его темная целительница

Крааш Кира
2. Любовь среди туманов
Фантастика:
фэнтези
5.75
рейтинг книги
Его темная целительница

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

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

Неудержимый. Книга XVI

Боярский Андрей
16. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XVI

Жена по ошибке

Ардова Алиса
Любовные романы:
любовно-фантастические романы
7.71
рейтинг книги
Жена по ошибке

Real-Rpg. Город гоблинов

Жгулёв Пётр Николаевич
1. Real-Rpg
Фантастика:
фэнтези
7.81
рейтинг книги
Real-Rpg. Город гоблинов

Венецианский купец

Распопов Дмитрий Викторович
1. Венецианский купец
Фантастика:
фэнтези
героическая фантастика
альтернативная история
7.31
рейтинг книги
Венецианский купец