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

на главную - закладки

Жанры

Шрифт:

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

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

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

Сапфир Олег
39. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
боевая фантастика
5.00
рейтинг книги
Кодекс Охотника. Книга XXXIX

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

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

Дочь моего друга

Тоцка Тала
2. Айдаровы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Дочь моего друга

Князь Андер Арес 4

Грехов Тимофей
4. Андер Арес
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Князь Андер Арес 4

Законник Российской Империи

Ткачев Андрей Юрьевич
1. Словом и делом
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Законник Российской Империи

Гримуар тёмного лорда I

Грехов Тимофей
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Гримуар тёмного лорда I

Вернувшийся: Первые шаги. Том II

Vector
2. Вернувшийся
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Вернувшийся: Первые шаги. Том II

Кодекс Крови. Книга ХVII

Борзых М.
17. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХVII

Княжна попаданка. Последняя из рода

Семина Дия
1. Княжна попаданка. Магическая управа
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Княжна попаданка. Последняя из рода

Казачий князь

Трофимов Ерофей
5. Шатун
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Казачий князь

Эволюционер из трущоб. Том 6

Панарин Антон
6. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эволюционер из трущоб. Том 6

Вечный. Книга I

Рокотов Алексей
1. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга I

Гимн Непокорности

Злобин Михаил
2. Хроники геноцида
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
Гимн Непокорности

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

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