Студопедия

КАТЕГОРИИ:

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


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




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

Сообщения от клавиатуры. Их можно разбить на две группы. В первую группу входят сообщения о нажатии/отпускании клавиши WM_KEYDOWN и WM_KEYUP, а также WM_SYSKEYDOWN и WM_SYSKEYUP. Два последних сообщения посылаются, если в момент нажатия/отпускания клавиши была также нажата клавиша Alt. Параметры сообщений содержат информацию о том, какая именно клавиша была нажата, а также счетчик повторений (если пользователь долго удерживал клавишу нажатой).

Во вторую группу входят сообщения о введенном символе: WM_CHAR и WM_SYSCHAR. Эти сообщения не посылаются клавиатурой (от клавиатуры в систему поступают только коды клавиш), а генерируются функцией TranslateMessage на основании анализа «что было нажато/отпущено». Например, если была нажата клавиша Shift, а затем клавиша с буквой «a» и при этом выключен режим Caps Lock, то будет сгенерировано сообщение WM_CHAR с кодом заглавной буквы «A». Сгенерированные сообщения не заменяют, а дополняют собой поток аппаратных сообщений, предоставляя прикладной программе выбрать наиболее подходящий для нее способ работы с клавиатурой. Другими словами, программист выбирает, будет ли программа реагировать на «то, что нажато» или на «то, что введено», программирует обработку соответствующих сообщений, а остальные сообщения передает на обработку операционной системе.

Сообщения от мыши. Из этой группы наиболее важными являются сообщения о нажатии, отпускании и двойном щелчке кнопок мыши в пределах активного окна: WM_xBUTTONDOWN, WM_xBUTTONUP, WM_xBUTTONDBLCLK (здесь x – одна из букв L, R или M – для левой, правой или средней кнопки), а также WM_MOUSEMOVE – сообщение о перемещении курсора мыши в пределах активного окна. Когда курсор мыши входит в пределы окна, этому окну посылается сообщение WM_SETCURSOR (это позволяет прикладной программе, если надо, сменить вид курсора на время, пока он находится над данным окном). Если кнопка мыши нажата на неактивном окне, то подается сообщение WM_MOUSEACTIVATE (его обработка обычно вызывает активизацию окна).

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

Сообщения при создании окна. Одним из первых сообщений, которые получает только что созданное (еще невидимое) окно, является сообщение WM_CREATE. Это сообщение содержит информацию о параметрах окна. Затем окно получает еще ряд сообщений, в том числе WM_SIZE, которое сообщает окну его текущий размер, и WM_MOVE, содержащее текущие координаты окна. Когда окно, остающееся пока невидимым, полностью подготовлено к работе, оно обычно получает сообщение WM_SHOWWIN, переводящее окно в видимое состояние.

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

Многие из описанных здесь и далее сообщений могут предваряться сообщениями, имена которых начинаются с префикса NC (например, WM_NCCREATE, WM_NCSIZE и т.п.). Этот префикс расшифровывается как “non-client” и посылается системой в тех случаях, когда соответствующее сообщение касается неклиентской области окна, включающей рамку, заголовок, меню (см. рисунок 1). Клиентская же область – это та часть окна, за отображение которой отвечает прикладная программа.

 

Рис. 1. Клиентская область окна

Дублирование неклиентских сообщений позволяет гибко распределять обработку сообщений между прикладной программой и системой. Как правило, прикладная программа не реагирует на неклиентские сообщения, оставляя их обработку системе.

Сообщения об изменениях состояния окна. В ходе работы с приложениями Windows каждое окно обычно многократно претерпевает изменения своего состояния. Может измениться размер или координаты окна, окно может быть максимизировано (распахнуто на весь экран) или минимизировано (свернуто в значок), может быть закрыто другими окнами или выйти на передний план. Окно может получить фокус ввода (т.е. связь с клавиатурой) или потерять его. Все подобные изменения система сопровождает соответствующими сообщениями, что позволяет прикладной программе отреагировать на изменения согласно логике своей работы. Большая часть подобных сообщений может вообще не обрабатываться пользовательской программой, поскольку система лишь уведомляет: «Произошло то-то; я могу сделать все сама; но, может быть, желаете вмешаться?».

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

При изменении размера окна, его координат или Z-порядка (т.е. положения за или перед другими окнами) окно до начала изменения получает сообщение WM_WINDOWPOSCHANGING, а после окончания – сообщение WM_WINDOWPOSCHANGED. Оба этих сообщения содержат указатель на структуру данных, описывающую положение окна. Кроме того, после окончания изменения могут быть посланы сообщения WM_SIZE (при изменении размеров окна) или WM_MOVE (при перемещении окна). Сообщение WM_NCCALCSIZE содержит координаты трех прямоугольников: прежнего положения окна, прежнего положения клиентской области и нового положения окна. На основании этих данных прикладная программа может пересчитать, какие координаты должна теперь иметь клиентская область. Сообщение WM_GETMINMAXINFO позволяет системе запросить у прикладной программы, какие максимальные и минимальные размеры допустимы для данного окна. На основании полученного ответа система может ограничить возможности пользователя, пытающегося мышью изменить размер окна.

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

Сообщение WM_ACTIVATE посылается при смене активного окна системы, например, при щелчке кнопкой мыши на неактивном окне или при нажатии Alt+Tab. Сначала такое сообщение получает прежнее активное окно, причем один из параметров сообщения указывает, что окно теряет активность, а другой параметр содержат хэндл нового активного окна. Затем сообщение WM_ACTIVATE посылается активизируемому окну. Параметры сообщения указывают, что окно получает активность, и содержат хэндл прежнего активного окна. Обработка WM_ACTIVATE включает передачу фокуса ввода от прежнего активного окна к новому (если только новое активное окно не минимизировано), этим окнам посылаются соответственно сообщения WM_KILLFOCUS и WM_SETFOCUS, уведомляющие о переходе фокуса. Если прежнее и новое активные окна принадлежат разным приложениям, то оба окна получают также сообщения WM_ACTIVATEAPP: одно приложение перестает быть активным (становится фоновым), а другое, наоборот, активизируется (выходит на передний план).

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

Сообщения, связанные с элементами управления. Дочерние окна – элементы управления шлют родительскому окну сообщения WM_NOTIFY, сообщающие о каком-либо событии, связанном с элементом (нажатии кнопки, выбор элемента в списке и т.п.), или запрашивающие у родителя какие-либо данные. Сообщение WM_PARENTNOTIFY посылается родителю при создании и разрушении дочернего окна, а также когда пользователь щелкает мышкой на дочернем окне. Сообщение WM_GETTEXT запрашивает у окна связанную с ним строку текста (для поля ввода это редактируемая строка, для кнопки – надпись на ней, для окон верхнего уровня – название окна). Сообщение WM_SETTEXT посылает окну новое значение связанной с ним строки. Для некоторых сложных элементов управления определены целые наборы сообщений, начинающиеся не с WM_, а со специального префикса для данного типа элементов.

Например, такой важный элемент управления, как панель редактирования текста может получать от родительского окна сообщения-запросы EM_GETSEL (сообщить границы выделенной части текста). В ответ на этот запрос редактор посылает два числа – расстояние (число символов) от начала текста до начала селектированной области текста и до ее конца. В случае, если селектированной области нет, два числа совпадают и означают позицию указателя ввода текста. Кроме того, возвращаются также адреса соответствующих ячеек памяти.

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

Сообщения IME. Input Method Editor (IME) – это набор средств Windows, облегчающих набор сложных символов (таких, как иероглифы) на стандартной клавиатуре. Средства IME активны только в версиях Windows, локализованных для восточноазиатских языков, поэтому сообщения с префиксом WM_IME игнорируются в других версиях системы.

Сообщения о командах. Сообщение WM_COMMAND генерируется при подаче команды с помощью меню, комбинации клавиш или командной кнопки. Этот тип сообщений обрабатывается прикладной программой в соответствии с логикой ее работы. Параметр wNotifyCode (старшее слово параметра wParam) указывает способ подачи команды. Если команда подана с помощью комбинации клавиш, то wNotifyCode равен 1; если команда подана через меню, wNotifyCode равен 0; если команда подана через элемент управления (кнопку и т.п.), то этот параметр принимает другие значения, заранее выбранные прикладным программистом. Младшее слово содержит идентификатор (код) конкретной выбранной команды. Сообщение WM_SYSCOMMAND генерируется командами системного меню (в левом верхнем углу окна), а также кнопками максимизации/минимизации окна. Как правило, оно обрабатывается системой.

Сообщения при закрытии окна. Когда пользователь закрывает окно приложения, окно получает сообщение WM_CLOSE. В ходе обработки этой команды генерируется и обрабатывается еще ряд сообщений: WM_WINDOWPOSCHANGING и WM_WINDOWPOSCHANGED (теперь позиция окна будет «никакая»), WM_ACTIVATE (окно перестает быть активным), если это последнее окно приложения – WM_ACTIVATEAPP (умирающее приложение перестает быть активным). Одно из последних сообщений, которые достигают окна ­– WM_DESTROY, которое посылается уже после того, как окно убрано с экрана. Если данное окно имеет дочерние окна, то они также получают сообщение WM_DESTROY. Сообщение WM_QUIT вызывает завершение цикла приема сообщений и оконной функции уже не передается.

Сообщение WM_PAINT. Это сообщение возникает в тех случаях, когда система обнаруживает, что часть области окна должна быть перерисована заново (например, эта часть ранее была закрыта другими окнами) или же пользователь явно указывает на необходимость такой перерисовки ввиду изменения содержимого окна, вызывая функцию InvalidateRect или InvalidateRgn. Если произошло несколько изменений содержимого окна до того, как программа успела обработать первое WM_PAINT, то вместо генерации новых сообщений система лишь корректирует размеры области, подлежащей перерисовке. Таким образом, для каждой нити может ожидать обработки не более чем одно сообщение WM_PAINT.

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

 

UINT_PTR SetTimer(

HWND hWnd, // дескриптор окна, с которым

// связан таймер

UINT_PTR nIDEvent, // идентификатор таймера

UINT uElapse, // период срабатывания таймера

TIMERPROC lpTimerFunc // функция обработки события

);

 

С помощью этой функции можно либо создать новый таймер, либо перезапустить ранее установленный. Если хотя бы один из параметров hWnd или nIDEvent равен NULL, то создается новый таймер, идентификатор которого возвращается в качестве значения функции. Если же при вызове функции SetTimer параметр hWnd имеет значение, отличное от NULL, и окно с указанным дескриптором (hWnd) уже имеет установленный таймер с идентификатором nIDEvent, то тогда существующий таймер сбрасывается и заменяется новым.

Период срабатывания таймера (uElapse) устанавливается в миллисекундах.

Если параметр lpTimerFunc установлен в NULL, то сообщение будет передаваться на обработку в оконную функцию, но только тогда, когда в очереди уже других нет сообщений. Для более оперативной реакции программист может предусмотреть свою функцию обработки сообщения таймера, и указать ее в качестве параметра (lpTimerFunc). Эта функция будет вызываться при срабатывании таймера сразу, в обход оконной функции.

Отметим, что после того, как таймер установлен, он начинает генерировать сообщения через интервал, установленный в uElapse. Остановить его можно с помощью функции KillTimer:

 

BOOL KillTimer(

HWND hWnd,

UINT_PTR uIDEvent

);

 

Как и WM_PAINT, сообщение WM_TIMER может быть только в одном экземпляре, даже если таймер успел сработать несколько раз.


Поделиться:

Дата добавления: 2015-09-15; просмотров: 96; Мы поможем в написании вашей работы!; Нарушение авторских прав





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