Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3 семестр, WinAPI, MFC.pdf
Скачиваний:
370
Добавлен:
15.06.2014
Размер:
6.17 Mб
Скачать

9.Послесозданияокнаонообязательнодолжнопоявитьсянаэкране? Чтонеобходимо сделатьдляотображенияокна?

10.Длячегослужитциклобработкисообщений? Откудаприложениеизвлекаеточередное сообщение? Какимобразомикемсообщениясоздаются?

11.Сколькоочередейсообщенийсуществует? Длякогопредназначенысообщения?

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

13.Ктообычнопосылаетсообщение(икакое), котороепрерываетциклобработки сообщений?

14.Еслидолжносделатьприложение, еслиононеобрабатываетнекотороесообщение?

15.Изкакихисточниковоконнаяпроцедураполучаетсообщения?

16.Какоесообщениеприходитокну, есличастьегорабочейобласти(иливсяона) требует перерисовки? Чтотакоенедействительнаяобласть?

17.Вкакихситуацияхрабочаяобластьможетстановитьсянедействительной?

18.СвызовакакойфункциидолжнаначинатьсяобработкасообщенияWM_PAINT? Вызовомкакойфункциионадолжназаканчиваться? Длячеговызываютсяэтифункции?

19.Какобычнореагируетстандартноеглавноеокноприложениянаполучениесообщенияо егоудалении? Чтоприэтомпроисходитсприложением?

20.Когдаприходитсообщениеобудаленииокна? Чтопроизойдет, еслиостальныеокна приложениябудутреагироватьнаэтосообщениетакже, какиглавноеокно?

Сообщения

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

синхронные сообщения(queued) - сообщения, которые Windows помещает в очередь сообщений программы, и которые извлекаются и диспетчеризуются в цикле обработки сообщений.

Отправление: с помощью функции PostMessage – ставится в очередь и немедленно возвращает управление.

Получение: результат пользовательского ввода путем нажатия клавиш (например, WM_KEYDOWN и WM_KEYUP), это символы, введенные с клавиатуры (WM_CHAR), результат движения мыши (WM_MOUSEMOVE) и щелчков кнопки мыши (WM_LBOTTONDOWN). Кроме этого синхронные сообщения включают в себя сообщение от таймера (WM_TIMER), сообщение о необходимости плановой перерисовки (WM_PAINT) и сообщение о выходе из программы (WM_QUIT)

асинхронные сообщения (nonqueued) – сообщения, передающиеся непосредственно окну, когда Windows вызывает оконную процедуру. Отправление: с помощью функции SendMessage – не ставится в очередь, оконная процедура вызывается непосредственно, а возврат управления только после обработки сообщения оконной процедурой.

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

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

Цикл обработки сообщений и оконная процедура работают не параллельно. Когда оконная процедура обрабатывает сообщение, то это результат вызова функции

DispatchMessage в WinMain. DispatchMessage не завершается до тех пор, пока оконная процедура не обработала сообщение.

Обработка клавиатурных сообщений

Синхронизация событий клавиатуры.

Основанная на сообщениях архитектура Windows идеальна для работы с клавиатурой:

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

2.драйвер клавиатуры передает информацию о нажатии клавиш в Windows.

3.Windows сохраняет эту информацию (в виде сообщений) в системной очереди сообщений.

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

5.отправление программой сообщения соответствующей оконной процедуре (с

помощью функции DispatchMessage).

Для отражения различных событий клавиатуры Windows посылает программам восемь различных сообщений. Программы вполне могут игнорировать многие из них.

Игнорирование событий клавиатуры.

Приложению не обязательно реагировать на каждое получаемое от клавиатуры сообщение - Windows сама обрабатывает многие сообщения клавиатуры и извещает программу об эффекте, вызванном нажатием той или иной клавиши:

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

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

Понятие фокуса ввода

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

Окно, имеющее фокус ввода – это окно, которое получает это сообщение клавиатуры.

Окно, имеющее фокус ввода – это либо активное окно, либо дочернее окно активного окна.

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

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

Обрабатывая сообщения WM_SETFOCUS и WM_KILLFOCUS, оконная процедура может определить, когда окно имеет фокус ввода.

WM_SETFOCUS - окно получило фокус ввода

WM_KILLFOCUS – что окно потеряло фокус ввода

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

GetFocus - позволяет узнать окно, владеющее фокусом ввода;

SetFocus – позволяет изменить окно, владеющее фокусом ввода;

Категории клавиатурных сообщений:

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

символьные (characters) – нажатие клавиш с использованием таких клавиш как <Ctrl>, <Shift> и <CapsLock> - сочетание даёт символ, например строчные и прописные буквы.

Аппаратные сообщения. Виды аппаратных сообщений:

несистемные– это сообщения WM_KEYDOWN и WM_KEYUP

Несистемные сообщения WM_KEYDOWN и WM_KEYUP вырабатываются для клавиш, которые нажимаются и отпускаются без участия клавиши <Alt>. Приложение использует или не использует эти сообщения клавиатуры. Windows их проигнорирует.

системные - это сообщения WM_SYSKEYDOWN и WM_SYSKEYUP

Системные аппаратные сообщения WM_SYSKEYDOWN и WM_SYSKEYUP

важны для Windows, а не для приложений. Эти сообщения обычно вырабатываются при нажатии клавиш в сочетании с клавишей <Alt>.

Программы обычно игнорируют сообщения WM_SYSKEYDOWN и WM_SYSKEYUP и передают их в функцию DefWindowProc.

case WM_SYSKEYDOWN:

MessageBox(hWnd,”Message WM_SYSKEYDOWN”,”Key”,MB_OK); return(DefWindowProc(hWnd,message,wParam,lParam));

Если не передать системные аппаратные сообщения в DefWindowProc. происходит запрет всех операций с клавишей <Alt> (команды меню, <Alt+Tab> и др.), когда окно программы имеет фокус ввода.

Аппаратные сообщения клавиатуры становятся в очередь. Приложение с помощью функции GetMessageTime получить время нажатия и отпускания клавиши относительно старта системы.

32-разрядная переменная lParam, передаваемая в оконную процедуру, состоит из шести полей:

счетчик повторений - число нажатий клавиши;

скан-код OEM (Original Equipment Manufacturer) - код клавиши, генерируемый аппаратурой компьютера;

флаг расширенной клавиатуры - 1, если сообщение клавиатуры появилось в результате работы с дополнительными клавишами расширенной клавиатуры IBM;

код контекста - 1, если нажата клавиша <Alt>;

флаг предыдущего состояния клавиши - 0, если в предыдущем состоянии клавиша была отпущена, и 1, если в предыдущем состоянии она была нажата;

флаг состояния клавиши - 0, если клавиша нажимается, и 1, если клавиша отпускается;

wParam – содержит виртуальный код клавиши.

Виртуальный код клавиши (virtual key code) - идентифицирует нажатую или отпущенную клавишу.

Коды виртуальных клавиш имеют символьные обозначения, определенные в заголовочных файлах Windows, и имеют префикс VK_.

Сообщения WM_SYSKEYDOWN и WM_SYSKEYUP адресованы Windows, и

приложению не всегда нужно их отслеживать. Если приложение обрабатывает сообщение WM_KEYDOWN, то сообщение WM_KEYUP оно обычно тоже игнорирует.

Определение состояния клавиш сдвига и клавиш-переключателей.

Параметры wParam и lParam аппаратных сообщений клавиатуры ничего не сообщают о состоянии клавиш сдвига (<Shift>, <Ctrl>, <Alt>) и клавиш-переключателей (<CapsLock>, <NumLock>, <ScrollLock>).

GetKeyState- функция, получающая состояние любой виртуальной клавиши:

1.Отражает состояние клавиатуры на момент, когда последнее сообщение от клавиатуры было выбрано из очереди.

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

Информация о текущем положении клавиши используется функция GetAsyncKeyState.

Символьные сообщения. Виды символьных сообщений:

несистемные – WM_CHAR, WM_DEADCHAR;

системные – WM_SYSCHAR, WM_SYSDEADCHAR;