Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Обработка сообщений от клавиатуры, часто используемые сообщения.

Читайте также:
  1. FМо-1 - частота интервала, предшествующего модальному;
  2. VII. Обработка звука. Редактор звука Adobe Audition.
  3. А. Кто заворожит посевы... 8б. Пусть не переманивает на свой участок чужого урожая.
  4. Агрегация «закрывает» капилляры, нарушая микроциркуляцию и участок ткани, который он кровоснабжает, становится ишемизированным.
  5. Анализ частоты
  6. Аппараты, используемые при определении рабочей длины зуба
  7. Аудиторские процедуры, используемые при аудите кассовых операций
  8. АЦП. Выбор частоты квантования.
  9. Биологически активные вещества природного происхождения, используемые в составах косметических изделий.
  10. Битовые операции и операции сдвига используются часто

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

 

1. Обработка сообщений клавиатуры, посылаемых вашему приложению.

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

Первый способ реализуется довольно просто: у формы устанавливаем свойство keypreview в true и обрабатываем событие onkeypress. К примеру, так:

 

procedure tform1.formkeypress(sender: tobject; var key: char);

begin

if key = '1' then beep; //если нажата клавиша 1 выдать звук в системный динамик

end;

 

Примечание: не всегда звук будет выдаваться в системный динамик, иногда он выдается в колонки.

 

Второй вариант, перехват события onmessage объекта application:

Для начала создадим и пропишем свой обработчик перехватываемых событий:

 

private

//процедура для перехвата событий onmessage обьекта application

procedure appmessage(var msg: tmsg; var handled: boolean);

 

 

procedure tform1.appmessage(var msg: tmsg; var handled: boolean);

begin

end;

 

При запуске приложения (событие формы oncreate) передаем обработку события onmessage, нашей процедуре:

 

procedure tform1.formcreate(sender: tobject);

begin

application.onmessage:= appmessage;

end;

 

Теперь при возникновении любого события onmessage, мы сможем его перехватить и обработать в процедуре appmessage:

 

appmessage(

var msg: tmsg; //посылаемое сообщение

var handled: boolean //определяет будет ли событие доходить до компонента

//если handled = true событие до компонента не дойдет

);

 

Примечание: под фразами «дойдет/не дайдет до компонента» подразумевается, то, что когда windows посылает сообщение нашей программе, его должен принять тот компонент, у которого в данный момент фокус ввода. Если мы поставим handled = true, то компонент, которому предназначалось это событие, его не получит.

 

Остается лишь написать обработчик:

 

procedure tform1.appmessage(var msg: tmsg; var handled: boolean);

begin

if msg.message = wm_keydown //если нажата кнопка (кнопка удерживается), то

then begin

memo1.lines.add(char(msg.wparam)); //добавляем в memo нажатую клавишу

handled:= false; //сообщение дальше этого обработчика ПОЙДЕТ

end;

end;

 

wm_keydown – событие возникает в момент нажатия и удержания кнопки. Так же можно применить:

wm_keyup - событие возникает в момент отпускания кнопки, wm_keyfirst и др.

 

 

2. Регистрация в системе «горячих» клавиш (hotkey).

 

Применяется тогда, когда нужно реагировать на нажатие, какой-либо клавиши (комбинации клавиш), в не зависимости от того у какого приложении

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

 

function registerhotkey(

hwnd: hwnd; // окно, которому посылается сообщение с «горячей» клавишей

id: integer; // идентификатор "горячей" клавиши

fsmodifiers, // флажки модификации клавиш

vk: uint // код виртуальной клавиши

): bool;

 

 

fsmodifiers может быть комбинацией следующих значений:

mod_alt - Любая клавиша alt должна удерживаться нажатой.

mod_control - Любая клавиша ctrl должна удерживаться нажатой.

mod_shift - Любая клавиша shift должна удерживаться нажатой

mod_win - Любая клавиша windows удерживалась нажатой.

 

Примечание: в параметре fsmodifiers, приведенные выше клавиши можно комбинировать обыкновенным сложением либо оператором or. К примеру: mod_alt or mod_control или mod_alt + mod_control.

 

Освобождение «горячей» клавиши выполняется функцией unregisterhotkey

 

function unregisterhotkey(

hwnd: hwnd; // окно, которому посылается сообщение с «горячей» клавишей

id: integer // идентификатор "горячей" клавиши

): bool;

 

посылаемое сообщение программе при нажатии «горячей» клавиши: wm_hotkey

 

twmhotkey = packed record

msg: cardinal;

hotkey: longint; // код виртуальной клавиши

unused: longint; // в младшем бите содержаться флажки модификаторы клавиш

// (описаны выше: параметр fsmodifiers функции registerhotkey)

//в старшем бите содержится код виртуальной клавиши

result: longint; //возвращает ноль в случае успеха

end;

 

Рассмотрим это на примере.

Создадим новый проект и поместим на форму memo, после чего надо создать и прописать принимаемое нами сообщение:

 

private

procedure wmhotkey(var msg: twmhotkey); message wm_hotkey;

 

 

procedure tform1.wmhotkey(var msg: twmhotkey);

begin

end;

 

Создадим «горячую клавишу» объявив ее в глобальных константах:

 

const

hotkey1 = ord('r');

 

 

21.Органы управления: кнопки, флажки, переключатели. Групповая рамка. Статический орган управления для вывода текста.

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

 

Когда курсор мыши перемещается над статическим органом управления, Windows посылает функции окна этого органа сообщение WM_NCHITTEST. В ответ на это сообщение статический орган возвращает Windows значение HTTRANSPARENT. В результате Windows посылает сообщение WM_NCHITTEST родительскому окну, лежащему под органом управления. В результате все сообщения от мыши попадают через "прозрачное" окно статического органа управления в родительское окно.

 

Зачем же нужен такой орган управления, который ничем не управляет?

 

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

Создание статического органа управления

 

Для создания статического органа управления вы должны использовать функцию CreateWindow. В качестве первого параметра этой функции следует указать класс окна "static":

HWND hStatic;

hStatic = CreateWindow("static", NULL,

WS_CHILD | WS_VISIBLE | SS_BLACKFRAME,

20, 40, 100, 50,

hWnd, (HMENU)-1, hInstance, NULL);

 

Второй параметр определяет текст, который будет расположен внутри органа управления. Вы можете указать этот параметр как NULL, если текст не используется.

 

В третьем параметре следует указать один из стилей статического органа управления. В нашем примере указан стиль SS_BLACKFRAME.

 

Так как статический орган управления не посылает сообщения родительскому окну, в качестве девятого параметра (идентификатор органа управления) можно указать любое число, например, 1.

 




Дата добавления: 2014-12-18; просмотров: 42 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2024 год. (0.01 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав