Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методическое пособие 390

.pdf
Скачиваний:
3
Добавлен:
30.04.2022
Размер:
1.12 Mб
Скачать

Синтаксис: SHORT GetKeyState(nVirtKey) int nVirtKey; // код виртуальной клавиши

GetAsyncKeyState позволяет узнать текущее состояние клавиши и состояние клавиши при предыдущем вызове функции. Если старший бит установлен, то клавиша нажата. Если младший бит не установлен, то клавиша была между двумя последующими вызовами функции.

Синтаксис: SHORT GetAsyncKeyState(nVirtKey) int nVirtKey; // код виртуальной клавиши

Для мыши основными являются следующие функции:

GetCursorPos;

GetKeyboardState (для кнопок мыши);

GetSystemMetrics;

SystemParametersInfo (для получения скорости перемещения курсора).

GetCursorPos позволяет определить координаты курсора мыши на экране в пикселях. Функция возвращает true при корректном ее завершении.

Синтаксис: BOOL GetCursorPos(lpPoint)

LPPOINT lpPoint; // указатель на структуру POINT

Описания всех используемых типов структур приведены в приложении.

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

31

Синтаксис: int GetSystemMetrics(nIndex)

int nIndex; // тип запрашиваемой информации

Запрашиваемая информация может иметь следующие основные значения.

SM_CLEANBOOT - как загружена система (0 - нормально, 1- защитный режим, 2 - защитный режим с сетью).

SM_CMOUSEBUTTONS - количество кнопок мыши. SM_NETWORK - младший бит на выходе установлен,

если сеть присутствует.

SM_CXBORDER - ширина бордюра окна.

SM_CYBORDER - высота бордюра окна. SM_CYCAPTION - актуальная высота заголовка плюс

SM_CYBORDER.

SM_CXCURSOR - ширина курсора.

SM_CYCURSOR - высота курсора. SM_CXDOUBLECLK - ширина прямоугольника, в

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

котором засчитывается двойное нажатие кнопки мыши. SM_CXFULLSCREEN - ширина рабочей области окна

при полнооконном режиме.

SM_CYFULLSCREEN - высота рабочей области окна при полнооконном режиме (высота экрана минус высота заголовка).

SM_CXHSCROLL - ширина стрелки на горизонтальной линейке прокрутки.

SM_CYHSCROLL - высота стрелки на горизонтальной линейке прокрутки.

SM_CXICON - ширина иконки.

SM_CYICON - высота иконки.

SM_CYMENU - высота одной линии меню минус

SM_CYBORDER.

SM_CXMIN - минимальная ширина окна.

SM_CYMIN - минимальная высота окна.

32

SM_CXSCREEN - ширина экрана.

SM_CYSCREEN - высота экрана.

SM_CXSIZE - ширина изображения, содержащегося в линии заголовка.

SM_CYSIZE - высота изображения, содержащегося в линии заголовка.

SM_CXVSCROLL - ширина стрелки на вертикальной линейке прокрутки.

SM_CYVSCROLL - высота стрелки на вертикальной линейке прокрутки.

SM_CXHTHUMB - ширина прямоугольника на горизонтальной линейке прокрутки.

SM_CYVTHUMB - высота прямоугольника на вертикальной линейке прокрутки.

SM_MOUSEPRESENT - статус мыши (если установлена, то не нуль).

SM_SWAPBUTTON - реверс кнопок мыши (если нуль, то кнопка в нормальном состоянии).

SystemParametersInfo запрашивает или устанавливает системные параметры.

Синтаксис: BOOL SystemParametersInfo(wAction, wParam, lpvParam, fUpdateProfile)

UINT wAction; // тип действия

UINT wParam; // дополнительный параметр беззнаковое целое PVOID lpvParam; // дополнительный параметр указатель на неопределенный тип

UINT fUpdateProfile; // флаг обновления системы

Тип запрашиваемых или устанавливаемых параметров может принимать одно из следующих основных значений:

SPI_GETBEEP - запрашивает значение типа BOOL предупредительного звукового сигнала.

wParam=0; lpvParam=указатель на BOOL;

SPI_SETBEEP - устанавливает значение типа BOOL предупредительного звукового сигнала.

33

wParam=BOOL; lpvParam=NULL;

SPI_GETBORDER - запрашивает значение, определяющее ширину бордюра окна.

wParam=0; lpvParam=указатель на int;

SPI_SETBORDER - устанавливает значение, определяющее ширину бордюра окна.

wParam=int; lpvParam=NULL;

SPI_GETFASTTASKSWITCH - запрашивает положение переключателя быстрой задачи вкл./выкл.

wParam=0; lpvParam=указатель на BOOL;

SPI_SETFASTTASKSWITCH - устанавливает положение переключателя быстрой задачи вкл./выкл.

wParam=BOOL; lpvParam=NULL;

SPI_GETGRIDGRANULARITY - запрашивает текущее значение размера ячейки сетки рабочего стола.

wParam=0; lpvParam=указатель на int;

SPI_SETGRIDGRANULARITY - устанавливает текущее значение размера ячейки сетки рабочего стола.

wParam=int; lpvParam=NULL;

SPI_GETKEYBOARDDELAY - запрашивает задержку повторения клавиатуры.

wParam=0; lpvParam=указатель на int;

SPI_SETKEYBOARDDELAY - устанавливает задержку повторения клавиатуры.

wParam=int; lpvParam=NULL;

SPI_GETKEYBOARDSPEED - запрашивает скорость повторения клавиатуры.

wParam=0; lpvParam=указатель на WORD;

SPI_SETKEYBOARDSPEED - устанавливает скорость повторения клавиатуры.

wParam=WORD; lpvParam=NULL;

SPI_GETMOUSE - запрашивает скорость перемещения мыши.

wParam=0; lpvParam=указатель на массив int, где lpiMouse[0] - порог1, lpiMouse[1] - порог2, lpiMouse[2] -

скорость ;

34

SPI_SETMOUSE - устанавливает скорость перемещения мыши.

wParam=0; lpvParam=указатель на массив int, где lpiMouse[0] - порог1, lpiMouse[1] - порог2, lpiMouse[2] -

скорость ;

SPI_GETSCREENSAVEACTIVE - запрашивает значение типа BOOL о включенном или выключенном хранителе экрана. wParam=0; lpvParam=указатель на BOOL;

SPI_SETSCREENSAVEACTIVE - устанавливает значение типа BOOL включенного или выключенного хранителя экрана. wParam=BOOL; lpvParam=NULL;

SPI_GETSCREENSAVETIMEOUT - запрашивает время в секундах, через которое срабатывает хранитель экрана. wParam=0; lpvParam=указатель на int;

SPI_SETSCREENSAVETIMEOUT - устанавливает время в секундах, через которое срабатывает хранитель wParam=int; lpvParam=NULL;

SPI_LANGDRIVER - идентификатор языкового драйвера.

wParam=0; lpvParam=указатель на строку char

ограниченной нулевым элементом;

SPI_SETDESKWALLPAPER - устанавливает имя файла обоев рабочего стола.

wParam=0; lpvParam=указатель на строку char

ограниченной нулевым элементом;

SPI_SETDOUBLECLICKTIME - устанавливает время двойного нажатия клавиши мыши в миллисекундах.

wParam=int; lpvParam=NULL;

SPI_SETDOUBLECLKHEIGHT - установка высоты прямоугольника, в котором срабатывает двойное нажатие. wParam=int; lpvParam=NULL;

SPI_SETDOUBLECLKWIDTH - установка ширины прямоугольника, в котором срабатывает двойное нажатие.

wParam=int; lpvParam=NULL;

SPI_SETMOUSEBUTTONSWAP - установка реверса кнопок мыши.

35

wParam=BOOL; lpvParam=NULL;

Получаемая информация предназначена как для реагирования программы на действия оператора, так и для получения типа установленных устройств. Приведенные функции позволяют оператору ПЭВМ получить следующую информацию:

тип клавиатуры и количество функциональных клавиш клавиатуры;

текущее состояние всех клавиш (клавиатуры и мыши);

текущее состояние заданной клавиши;

текущее и предыдущее состояние заданной клавиши;

положение курсора;

присутствие мыши в системе и количестве кнопок мыши;

скорость перемещения курсора и т.д.

Важнейшей информацией для интерфейса пользователя большинства приложений является состояние клавиш и положение курсора мыши на экране. По данной информации принимается решение о связи между оператором и выполняемой программой на ПЭВМ.

Получение типа клавиатуры и количества функциональных клавиш

Вывод типа клавиатуры осуществляется компонентой Edit1. Количество функциональных клавиш отражается компонентой

Edit2.

TEdit *Edit1;

TEdit *Edit2; void main()

{

int keyboard_type_num;

AnsiString keyboard_type[]={"IBM® PC/XTд or compatible (83-key) keyboard",

"Olivetti® \"ICO\" (102-key) keyboard", "IBM AT® (84-key) or similar keyboard",

36

"IBM enhanced (101or 102-key) keyboard",

"Nokia® 1050 and similar keyboards",

"Nokia 9140 and similar keyboards", "Japanese keyboard"}; keyboard_type_num=GetKeyboardType(0); if (keyboard_type_num--) Edit1 >Text=keyboard_type[keyboard_type_num];

else Edit1->Text="Error"; Edit2->Text=GetKeyboardType(2);

}

Получение текущего состояния клавиатуры

Компонента Edit1 выводит те клавиши из ряда от A до Z, которые нажаты.

TEdit *Edit1; void main ()

{

unsigned char far pbKeyState[256]; GetKeyboardState(pbKeyState);Edit1->Text="";

for (char i='A';i<='Z';++i) if (pbKeyState[i]&0x80) Edit1- >Text=Edit1->Text+i;

}

Получение состояния заданной клавиши

В зависимости от того нажата клавиша "Escape" или нет компонента CheckBox1 выставляет либо не выставляет крест.

TCheckBox *CheckBox1; void main (){CheckBox1-

>Checked=GetKeyState(VK_ESCAPE)&0x80;}

Получение позиции курсора мыши

Компонента Edit1 выводит горизонтальную координату, а Edit2 - вертикальную координату позиции курсора мыши.

TEdit *Edit1;

TEdit *Edit2;

void mouse_move()

{

POINT mouse_pos;

if (GetCursorPos(&mouse_pos)){Edit1->Text=(int)mouse_pos.x;Edit2-

37

>Text=(int)mouse_pos.y;}

}

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

В зависимости от того присутствует мышь в системе или нет, компонента Label1 меняет значение свойства Caption. Компонента Edit1 выводит количество кнопок мыши.

TEdit *Edit1; TLabel *Label1; void main ()

{

if (GetSystemMetrics(SM_MOUSEPRESENT)) Label1- >Caption="Мышь установлена";

else Label1->Caption="Мышь не установлена";

Edit1->Text=GetSystemMetrics(SM_CMOUSEBUTTONS);

}

Определение скорости перемещения курсора

КомпонентыEdit1 - Edit3 выводят числовые значения определяющие скорость мыши.

TEdit *Edit1;

TEdit *Edit2;

TEdit *Edit3; void main ()

{

int lpiMouse[3]; if

(SystemParametersInfo(SPI_GETMOUSE,0,lpiMouse,SPIF_SENDWINI NICHANGE)) {Edit1->Text=lpiMouse[0];Edit2->Text=lpiMouse[1];Edit3- >Text=lpiMouse[2];}

}

Управляющие функции предназначены для настройки клавиатуры и мыши. Так, например, кроме инициации нажатия и отжатия клавиш, можно включить или выключить действие клавиш: "NumLock", "CapsLock" и "ScrollLock", о

чем свидетельствует соответствующая индикация. С помощью функций управления мышью программа

38

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

Для клавиатуры:

SetKeyboardState.

SetKeyboardState устанавливает текущее состояние клавиатуры. Массив размером 256 байт соответствует состоянию каждой из 256 клавиш виртуальной таблицы. Если старший бит установлен, то клавиша нажата. Если младший бит виртуальных клавиш "NumLock", "CapsLock" или "ScrollLock" установлен, то данные клавиши задействованы, о чем свидетельствует соответствующая индикация. Код виртуальных клавиш '0' - '9' и 'A' - 'Z' соответствуют их ASCIIкоду. Для остальных клавиш определены константы: "VK_F1"

- "VK_F24", "VK_NUMPAD0" - "VK_NUMPAD9", "VK_NUMLOCK", "VK_SCROLL", "VK_LBUTTON" -

"VK_RBUTTON"(для мыши), "VK_SHIFT", "VK_CONTROL", "VK_MENU"(Alt) и т.д. Функция возвращает true при корректном ее завершении.

Синтаксис: BOOL SetKeyboardState(lpbKeyState)

LPBYTE lpbKeyState; // указатель на массив, устанавливающий состояние клавиатуры

Для мыши:

ShowCursor;

SwapMouseButton;

ClipCursor;

SetCursorPos;

SystemParametersInfo (для установки скорости перемещения курсора).

ShowCursor показывает и скрывает курсор. Функция возвращает знаковое значение - счетчик. Если счетчик больше или равен нулю, курсор виден иначе, курсор скрыт. Таким образом, если n-раз вызвать функцию с параметром false,

39

скрывающую курсор, чтобы показать курсор нужно также n- раз вызвать функцию с параметром true.

Синтаксис: int ShowCursor(bShow)

BOOL bShow; // показать или скрыть курсор

SwapMouseButton реверсирует кнопки мыши, при этом назначение левой и правой кнопок мыши меняются. Функция возвращает значение типа BOOL, отражающее реверсирование кнопок до вызова функции.

Синтаксис: BOOL SwapMouseButton(fSwap)

BOOL fSwap; // флаг реверсирования

ClipCursor ограничивает перемещение курсора заданными границами. Функция возвращает true при корректном ее завершении.

Синтаксис: BOOL ClipCursor(lprc)

CONST RECT *lprc; // указатель на структуру прямоугольника, ограничивающего перемещение курсора

typedef struct tagRECT { LONG left;

LONG top; LONG right; LONG bottom;

} RECT;

SetCursorPos устанавливает координаты курсора мыши на экране в пикселях. Функция возвращает true при корректном ее завершении.

Синтаксис: BOOL SetCursorPos(X, Y)

int X; // значение новой позиции по горизонтали int Y; // значение новой позиции по вертикали

40