Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по Леонову, 5семестр.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
503.3 Кб
Скачать

37.Обработка сообщений от клавиатуры и мыши(wm_char,wm_keYxxx,wm_xButtoNxxx,

WM_NCHITTEST)

Работа Win приложений основана на обработке сообщений. При работе с устройствами ввода/вывода компа, драйверы этих устройств создают сообщения, описывающие эти действия. Каждое нажатие на клавиши клавиатуры вызывает генерацию ряда сообщений, определяющих, какая клавиша нажата. Перемещение мыши вызывает сообщ., описывающие траекторию перемещения указателя мыши… Сообщения сначала попадают в системную очередь ОС, из нее передаются приложениям, которым они предназначены, и записываются в очередь приложений. Каждое приложение имеет собственную очередь сообщений.

В MFC за обработку сообщений отвечают классы. Любой класс ,наследованный от базового класса CcmdTarget, может обрабатывать сообщения. Чтобы класс смог обрабатывать сообщения, необходимо, чтобы он имел таблицу сообщений класса. В этой таблице для каждого сообщения указан метод класса, предназначенный для его обработки. Сообщения, которые могут обрабатываться приложением ,построенным на основе библиотеки классов MFC, подразделяются в зависимости от процедуры их обработки на 3 группы:

  • Оконные сообщения

  • Сообщения от органов управления

  • Команды

Таблица сообщений: Message Map состоит из набора спец. Макрокоманд, ограниченных BEGIN_MESSAGE_MAP и END_MESSAGE_MAP. Между ними расположены макрокоманды ,отвечающие за обработку отдельных сообщений. В MFC определены несколько макрокоманд, отвечающих за обработку сообщений. Одна из них: ON_WM_<name>- для обработки стандартных сообщений Windows. Вместо <name> указывается имя сообщения без префикса WM_. Для обработки сообщений, определенных в таблице макрокомандами ON_WM_<name> вызываются одноименные методы. Имя метода обработчика соответствует названию сообщения.

Ввод с клавиатуры- двухэтапный процесс. Windows посылает окну сообщения WM_KEYDOWN и WM_KEYUP с кодами виртуальных клавиш, но прежде чем эти сообщения доходят до окна, они транслируются. Если введен символ ANSI (в результате чего генерируется сообщение WM_KEYDOWN), то ф-ия трансляции проверяет состояние регистра клавиатуры и посылает сообщение WM_CHAR с соответсвующим кодом символа- либо верхнего, либо нижнего регистра. Клавиши перемещения курсора и функциональные клавиши не имеют соответсвующих кодов символов, поэтому для них трансляция не требуется. Окно получает только сообщения WM_KEYDOWN и WM_KEYUP.

38 Таймеры, использование времени простоя программы и локального цикла обработки сообщений.

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

Таймеры задаются в Windows функцией

SetTimer

SetTimer(1,1000) 1-идентификатор таймера, 1000-задержка мсек

В конце работы с таймером используется функция

KillTimer(1);

Если SetTimer – глобальная, то HWND окна надо использовать

Сообщение от Timer по умолчанию получает окно

Void OnTimer(…)

{ static int InTimer = 0;

if(InTimer)return;

InTimer=1;

InTimer=0;

}

2)Использование времени простоя в классе CwinApp

есть функция

OnIdle(LONG Count) – вызывается во время простоя

(кол-во вызовов этой ф-ии – счётчик)

3)Использование локального цикла обработки сообщений

Void WaitIdle()-название условное(любое)

{MSG msg;

while(Prev Message(& msg, 0, 0, 0, PM_NOREMOVE))

{Get Message(& msg, 0, 0, 0);

Translate Message(& msg);

Dispatch Message(& msg);