Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
7 - 8 лаба по оссп в исходнике отавлены нужные...doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
1.17 Mб
Скачать

Оконный объект

Хотя определенная часть управления клавиатурой выполняется циклом сообщений, основная нагрузка возлагается на соответствующие функции – обработчики оконного объекта – оконную функцию. Можно игнорировать большинство сообщений, сосредоточив внимание на WM_CHAR и WM_KEYDOWN (при вводе «непечатных» символов).

В некоторых случаях для обработки ввода с клавиатуры необходимы системные сообщения; в частности, когда активное окно системы пиктограммное, Windows заменяет обычные сообщения клавиатуры соответствующими им системными сообщениями (WM_SYSKEYDOWN, WM_SYSKEYUP, WM_SYSCHAR).

Оконная процедура умолчания

Все сообщения, не используемые оконной процедурой, попадают в оконную процедуру умолчания (Default Window procedure): DefWindowProc(hwnd, message, wParam, lParam).

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

Мышь

При получении сообщений мыши, связанных с рабочей областью окна, через параметр wParam передается значение, позволяющее определить, были ли одновременно с этим нажаты кнопки мыши или клавиши <Shift> и <Ctrl> клавиатуры. Например, если обработка должна зависеть от состояния клавиш <Shift> и <Ctrl>, то приложение могло бы воспользоваться следующей логикой:

UINT fwKeys = wParam; // состояние кнопок мыши

if(MK_SHIFT & fwKeys)

{

if(MK_CONTROL & fwKeys) { }

/* нажаты клавиши <Shift> и <Ctrl> */

else { } /* нажата клавиша <Shift> */

}

else

{

if(MK_CONTROL & fwKeys) { }

/* нажата клавиша <Ctrl> */

else { } /* клавиши <Shift> и <Ctrl> не нажаты */

}

Функция GetKeyState также может возвращать состояние кнопок мыши или клавиш <Shift> и <Ctrl>, используя виртуальные коды клавиш VK_LBUTTON, VK_RBUTTON, VK_MBUTTON, VK_SHIFT и VK_CONTROL. При нажатой кнопке или клавише возвращаемое значение функции GetKeyState отрицательно.

Двойной щелчок мыши

Если необходимо, чтобы оконная процедура получала сообщения двойного щелчка мыши, то следует включить идентификатор CS_DBLCLKS при задании стиля класса окна перед вызовом функции RegisterClass, например:

wndclass.style=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;

Если CS_DBLCLKS не включить в стиль окна и пользователь в быстром темпе щелкнет левой кнопкой мыши, то оконная процедура получит сообщения о двух одинарных щелчках мыши в следующей последовательности:

WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDOWN,WM_LBUTTONUP.

Использование таймера

Хотя драйвер SYSTEM.DRV поддерживает асинхронное прерывание Int 08h, сообщение WM_TIMER не является асинхронным. Сообщение WM_TIMER помещается в очередь приложения и обслуживается так же, как и другие сообщения, при этом сообщение WM_TIMER похоже на WM_PAINT.

Таймер можно установить/снять в программе, используя функции SetTimer в главной функции или в ветвях обработки сообщений WM_CREATE/WM_DESTROY.

Функция установки SetTimer () имеет вид

SetTimer (hwnd, ID_TIMER, wMsecInterval, NULL),

где hwnd – дескриптор окна, функция, которая будет поддерживать обработку WM_TIMER;

параметр ID_TIMER – номер таймера, неотрицательная величина;

wMsecInterval – задает интервал в миллисекундах.

Когда оконная функция получает сообщение WM_TIMER, wParam равен ID_TIMER и lParam равен нулю.

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

# define ID_TIMER_SEC 1

# define ID_TIMER_MIN 2

SetTimer (hwnd, ID_TIMER_SEC,1000, NULL);

SetTimer (hwnd, ID_TIMER_MIN,60000, NULL);

Case WM_TIMER:

switch (wParam)

{

case ID_TIMER_SEC: …… //код обработчика 1 таймера.. break;

...

case ID_TIMER_MIN: …… //код обработчика 2 таймера.. break;}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]