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

на главную

Жанры

Шрифт:

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

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

Вернувшийся: Корпорация. Том III

Vector
3. Вернувшийся
Фантастика:
космическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Вернувшийся: Корпорация. Том III

На границе империй. Том 4

INDIGO
4. Фортуна дама переменчивая
Фантастика:
космическая фантастика
6.00
рейтинг книги
На границе империй. Том 4

Поводырь

Щепетнов Евгений Владимирович
3. Ботаник
Фантастика:
фэнтези
6.17
рейтинг книги
Поводырь

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

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

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

Дамиров Рафаэль
2. Последний герой
Фантастика:
попаданцы
альтернативная история
4.50
рейтинг книги
Последний Герой. Том 2

Изгой Проклятого Клана. Том 2

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

Цикл романов "Целитель". Компиляция. Книги 1-17

Большаков Валерий Петрович
Целитель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Цикл романов Целитель. Компиляция. Книги 1-17

Я спас СССР! том 1

Вязовский Алексей
1. Я спас СССР
Фантастика:
альтернативная история
6.57
рейтинг книги
Я спас СССР! том 1

На границе империй. Том 10. Часть 6

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 6

Эпоха Опустошителя. Том II

Павлов Вел
2. Вечное Ристалище
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эпоха Опустошителя. Том II

Я не царь. Книга XXIV

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

Сопротивление

Осадчук Алексей Витальевич
11. Последняя жизнь
Фантастика:
аниме
фэнтези
попаданцы
7.33
рейтинг книги
Сопротивление

Катализ

Скаландис Ант
Фантастика:
научная фантастика
5.00
рейтинг книги
Катализ

Зодчий. Книга III

Погуляй Юрий Александрович
3. Зодчий Империи
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Зодчий. Книга III