Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС лабы / ОС - Лабораторная работа 1.doc
Скачиваний:
63
Добавлен:
01.06.2015
Размер:
1.18 Mб
Скачать
      1. Типы сообщений

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

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

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

Сообщения IME. InputMethodEditor(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может быть только в одном экземпляре, даже если таймер успел сработать несколько раз.