Получение времени нажатия клавиши и состояния управляющих клавиш. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Получение времени нажатия клавиши и состояния управляющих клавиш.



 

 

Вы всегда можете узнать время, когда возникло сообщение от клавиатуры при помощи функции GetMessageTime. Время определяется в единицах, отсчитанных от момента старта системы.

 

 

Существует ряд управляющих клавиш, от состояния которых зависит реакция системы (и программ) на нажатие остальных клавиш. К таким клавишам относятся: (< Shift >, < Ctrl >, < Alt >, < CapsLock >, < NumLock >, < ScrollLock >). Программа может получить их состояния с помощью функции GetKeyState. Например, для получения состояния SHIFT необходимо выполнить:

 

 

GetKeyState (VK _ SHIFT);

 

 

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

 

 

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

 

 

Символьные сообщения.

 

 

Ранее уже говорилось, что знания о виртуальном коде и положениях управляющих клавиш недостаточно для определения нажатого символа. Операционная система позволяет поддерживать большое число национальных клавиатур, алфавит которых может значительно отличаться друг от друга. В связи с этим, нажатие одной и той же клавиши может означать нажатие разных символов, определяемых выбранным в данный момент драйвером клавиатуры. Например, нажатие клавиши с буквой “ V ”, при выбранном драйвере русской или украинской клавиатуры, будет означать нажатие символа “М”.


 

 

Данное преобразование выполняет функция TranslateMessage, которая преобразует аппаратные сообщения в символьные, используя при этом состояние управляющих клавиш и драйвер клавиатуры. Обычно это происходит в цикле обработки сообщений:

 

 

while (GetMessage (& msg, NULL, 0, 0))

 

 

{

 

 

TranslateMessage (& msg);

 

 

DispatchMessage (& msg);

 

 

}

 

 

Функция TranslateMessage является своеобразным диспетчером сообщений. Если очередное сообщение, выбранное функцией GetMessage из очереди сообщений, является символьным, то TranslateMessage ставит в очередь сообщений к приложению еще одно сообщение – символьное. При этом, аппаратное сообщение продолжает свой путь в цикле обработки сообщений и попадает в оконную процедуру окна приложения через функцию DispatchMessage.

 

 

Аналогично аппаратным сообщениям, существует четыре символьных сообщения:

 

 


Типы сообщений

Несистемные символьные сообщения Системные символьные сообщения


Клавиша нажата WM_CHAR WM_SYSCHAR


Клавиша отпущена WM_DEADCHAR WM_DEADCHAR


 

 

Сообщения WM _ CHAR являются следствием сообщений WM _ KEYDOWN. В большинстве приложений предпочтительным является использование именно символьных сообщений. Параметр lParam, в случае сообщения WM _ CHAR, является таким же, как и соответствующий параметр в аппаратном сообщении, а wParam – определяет код символа ASCII.

 

 

В качестве примера рассмотрим случай, когда пользователь программы нажимает и отпускает клавишу "А". Если переключатель <CapsLock > не включен и не нажата клавиша < Shift >, то оконная процедура получит три следующих сообщения:

 

 

Сообщение Клавиша или код

 

 

WM _ KEYDOWN Виртуальная клавиша "А"

 

 

WM_CHAR ASCII код " а "

 

 

WM _ KEYUP Виртуальная клавиша "А"

 

 

Если вы нажимаете "А" при нажатой клавише <Shift >, то оконная процедура получит следующий ряд сообщений:

 

 

Сообщение Клавиша или код

 

 

WM _ KEYDOWN Виртуальная клавиша VK _ SHIFT

 

 

WM _ KEYDOWN Виртуальная клавиша "А"


– 33 –

 

 

WM_CHAR ASCII код " А "

 

 

WM _ KEYUP Виртуальная клавиша "А"

 

 

WM _ KEYUP Виртуальная клавиша VK _ SHIFT

 

 

Символьные сообщения приходят в программу не только, когда пользователь нажимает клавиши с буквами. Например, нажатие табуляции приведет к приходу символьного сообщения с кодом '\ t ', возврата каретки - '\ r ', забоя – '\ b '.


 

 

ЛЕКЦИЯ 5. ДОЧЕРНИЕ ОКНА

 

Общие сведения

 

 

До сих пор, мы создавали приложение с одним окном, в которое выводили текст, графику, рисунки. Все сообщения приложению, фактически, обрабатывались оконной процедурой этого самого единственного окна. Предположим, что на окно положили какой-либо объект, обладающий совокупностью функций и особенностей отображения внутри вашего окна. Этот объект, конечно же, может формировать ваша программа (рисовать объект при помощи сообщения WM _ PAINT, проверять, ни попал ли курсор мыши на объект при обработке WM _ LBUTTONDOWN и т.п.). Однако, согласно объектно-ориентированному подходу к программированию, более красивый и удобный путь – выделить характеристики и функции поведения этого объекта в некоторую логическую структуру, которая сама будет обрабатывать предназначенные ей сообщения, будет сама себя рисовать и т.п. Существует возможность создания таких объектов, а также имеется некоторое число предопределенных в Windows объектов. Они получили название "Дочерние окна управления".

 

 

Такое название они получили потому, что неразрывно связаны с теми окнами, на которых они находятся и их поведение во многом определяется поведением главного или родительского окна. Каждый из вас видел дочерние окна: это кнопки (buttons), флажки (check boxes), окна редактирования (edit boxes), списки (list boxes), комбинированные списки (combo boxes), строки текста (text strings) и полосы прокрутки (scroll bars). Все перечисленные окна управления зарегистрированы в Windows (поэтому для них нет необходимости в выполнении функции RegisterClass) и для их создания достаточно выполнить функцию CreateWindow, указав одно из следующих имен: " button " – для кнопки, " static " – для текста, "scrollbar" – для полосы прокрутки, "edit" – для окна редактирования, "listbox" – для окна списка, "combobox" – для окна комбинированного списка.

 

 

Каждое дочернее окно создается с помощью вызова функции CreateWindow, где в параметре "родительское окно" указатель того окна, на котором создается окно. После этого, эти два окна неразрывно связаны. Положение дочернего окно четко определено в пределах родительского (его можно менять, но не выходя за рамки родительского окна), перемещение родительского окна происходит вместе с расположенным в нем дочерним. Оконная процедура родительского окна посылает сообщения дочерним окнам, а дочерние окна посылают сообщения обратно оконной процедуре.

 

 

Класс кнопок

 

 

Всем кнопкам, которые пользователь видит на экране, соответствует один предопределенный класс окна " button ". Windows поддерживает 10 стандартных стилией кнопок. Любую из них можно создать при помощи вызова функции CreateWindow с определением следующих параметров:

 

 

Имя класса " button "

 

 

Текст окна " Моя кнопка"

 

 

Стиль окна WS_CHILD|WS_VISIBLE|BS_<style>

 

 

Положение по х 50

 

 

Положение по х 50

 

 

Ширина 60

 

 

Высота 30

 

 

Родительское окно hwnd


– 35 –

 

 

Идентификатор дочернего окна (HMENU) i

 

 

Описатель программы hInstance

 

 

Дополнительный параметр NULL

 

 

Третий параметр функции указывает на создание дочернего видимого окна, а также определяет стиль кнопки: нажимаемая кнопка (BS _ PUSHBUTTON или BS _ DEFPUSHBUTTON), флажки (check boxes – BS _ CHECKBOX, BS _ AUTOCHECKBOX), переключатели (radio buttons – BS _ RADIOBUTTON, BS _ AUTORADIOBUTTON), групповое окно (group boxes – BS _ GROUPBOX), флажки на три состояния (BS _3 STATE, BS _ AUTO 3 STATE), кнопки, определяемые пользователем (BS _ OWERDRAW).

 

 

Обратите внимание на 9 параметр, который является идентификатором (номером, "именем") кнопки. С помощью его родительское и дочернее окна могут опознавать друг друга. Следует отметить, что данный параметр определен в Windows как параметр типа HMENU, в следствии чего перед переменной стоит директива преобразования типов.

 

 

Все кнопки, когда вы щелкаете на их поверхности, посылают родительскому окну сообщение WM _ COMMAND, указывая в параметре lParam описатель дочернего окна (возвращаемый также функцией CreateWindow при создании кнопок), в LOWORD (wParam) – идентификатор дочернего окна, о котором говорилось ранее, в HIWORD (wParam) – код уведомления.

 

 

Кратко остановимся на особенностях некоторых кнопок.

 

 

Нажимаемая кнопка

 

 

является самой широко используемой. Она представляет собой прямоугольник, внутри которого задан текст. При нажатии на кнопку (клик мыши на поверхности кнопки), она перерисовывается в виде нажатого состояния, а при отпускании мыши – переходит в первоначальное состояние. При отпускании мыши кнопка посылает родительскому окну сообщение WM _ COMMAND с кодом уведомления BN _ CLICKED. Вы можете имитировать нажатие кнопки, посылая окну сообщение WM _ SETSTATE. Так, строка программы:

 

 

SendMessage (hwndButton, BM _ SETSTATE,1,0);

 

 

приводит к нажатию кнопки, а строка

 

 

SendMessage (hwndButton, BM _ SETSTATE,0,0);

 

 

возвращает кнопку к своему нормальному состоянию.

 

 

Флажки

 

 

Флажки представляют собой маленькие квадратные окна с текстом; текст обычно размещается справа от флажка. Флажки, как правило, действуют как двухпозиционные переключатели: один щелчок вызывает появление контрольной метки (птички); другой щелчок приводит к исчезновению контрольной метки. Часть флажки объединяют в группы, чтобы сконцентрироваться на опциях какого-то одного объекта. В последнем случае состояния одних из кнопок могут зависеть от состояний других. При использовании стиля BS _ CHECKBOX программа должна сама устанавливать и снимать контрольную метку, посылая окну кнопки сообщение BM _ SETCHECK и 1 или 0 в параметре wParam. В случае стиля BS _ AUTOCHECKBOX флажок сам включает и выключает себя. Оба окна посылают традиционное для кнопок сообщение WM _ COMMAND родительскому окну при щелчке мыши на поверхности кнопки.

 

 

Можно также получить текущее состояние флажка послав в кнопку сообщение BM _ GETCHECK:

 

 

int Result = (int) SendMessage(hwndButton, BM_GETCHACK, 0, 0);


 

 

Существует еще два типа флажков на три состояния - BS _3 STATE, BS _ AUTO 3 STATE. Их поведение аналогично описанным флажкам, но они могут иметь третье состояние – квадрат метки закрашивается серым цветом и к возможным состояниям 0 и 1 добавляется состояние 2.

 

 

Переключатели

 

 

Переключатели похожи на флажки, но форма метки у них не квадратная, а круглая. Жирная точка внутри кружка показывает, что переключатель помечен. Переключатель имеет стиль окна BS _ RADIOBUTTON, BS _ AUTORADIOBUTTON, но последний используется только в окнах диалога. В окнах диалога группы переключателей, как правило, используются для идентификации нескольких взаимоисключающих опций. В отличие от флажков, его состояние не изменится. Взаимодействия переключателей с родительским окном аналогично флажкам.

 

 



Поделиться:


Последнее изменение этой страницы: 2017-02-05; просмотров: 561; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.248.24 (0.033 с.)