|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Message Loop
A simple message loop consists of one function call to each of these three functions: GetMessage, TranslateMessage, and DispatchMessage.
MSG msg; while( GetMessage( &msg, NULL, 0, 0 ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); }
The GetMessage function retrieves a message from the queue and copies it to a structure of type MSG. It returns TRUE unless it encounters the WM_QUIT message, in which case it returns FALSE and ends the loop. In a single-threaded application, ending the message loop is often the first step in closing the application. An application can end its own loop by using the PostQuitMessage function, typically in response to the WM_DESTROY message in the window procedure of the application's main window.
If you specify a window handle as the second parameter of GetMessage, only messages for the specified window are retrieved from the queue. GetMessage can also filter messages in the queue, retrieving only those messages that fall within a specified range. For more information about filtering messages, see Message Filtering. A thread's message loop must include TranslateMessage if the thread is to receive character input from the keyboard. Windows generates virtual-key messages ( WM_KEYDOWN and WM_KEYUP) each time the user presses a key. A virtual-key message contains a virtual-key code that identifies which key was pressed, but not its character value. To retrieve this value, the message loop must contain TranslateMessage, which translates the virtual-key message into a character message (WM_CHAR) and places it back into the application message queue. The character message can then be removed upon a subsequent iteration of the message loop and dispatched to a window procedure.
The DispatchMessage function sends a message to the window procedure associated with the window handle specified in the MSG structure. If the window handle is HWND_TOPMOST, DispatchMessage sends the message to the window procedures of all top-level windows in the system. If the window handle is NULL, DispatchMessage does nothing with the message. An application's main thread starts its message loop after initializing the application and creating at least one window. Once started, the message loop continues to retrieve messages from the thread's message queue and to dispatch them to the appropriate windows. The message loop ends when the GetMessage function removes the WM_QUIT message from the message queue.
Only one message loop is needed for a message queue, even if an application contains many windows. DispatchMessage always dispatches the message to the proper window; this is because each message in the queue is an MSG structure that contains the handle of the window to which the message belongs. You can modify a message loop in a variety of ways. For example, you can retrieve messages from the queue without dispatching them to a window. This is useful for applications that post messages not specifying a window. You can also direct GetMessage to search for specific messages, leaving other messages in the queue. This is useful if you must temporarily bypass the usual FIFO order of the message queue.
An application that uses accelerator keys must be able to translate keyboard messages into command messages. To do this, the application's message loop must include a call to the TranslateAccelerator function. For more information about accelerator keys, see Keyboard Accelerators. If a thread uses a modeless dialog box, the message loop must include the IsDialogMessage function so that the dialog box can receive keyboard input.
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Цикл Сообщения
Простой цикл сообщения состоит из одного функционального вызова в каждую из этих трех функций: GetMessage, TranslateMessage, и DispatchMessage.
msg MSG; пока( GetMessage( &msg, НЕДЕЙСТВИТЕЛЬНЫЙ, 0, 0 ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); }
Функция GetMessage извлекает сообщение из очереди и копирует это в структуру типа MSG. Это возвращает ИСТИНУ если это не сталкивается с сообщением WM_QUIT, в этом случае это возвращает ЛОЖЬ и заканчивает цикл. В единственный прошитом приложении, заканчивающем цикл сообщения является часто первым шагом на закрытии приложения. Приложение может закончить свой собственный цикл используя функцию PostQuitMessage, обычно в ответ на сообщение WM_DESTROY в процедуре окна прикладного основного окна.
Если Вы определяете ручку окна как второй параметр GetMessage, только сообщения для определенного окна извлечены из очереди. GetMessage МОЖЕТ также отфильтровать сообщениям в очереди, поиске только те сообщения, которые находятся в пределах определенного дипазона. Более подробно о фильтрующих сообщениях, смотри Фильтрацию Сообщения. Цикл сообщения резьбы должен включить TranslateMessage если резьба должна получать символьный вклад с клавиатуры. Окно генерирует виртуальные-ключевые сообщения ( WM_KEYDOWN и WM_KEYUP) всякий раз, когда потребитель нажимает ключ. Виртуальное-ключевое сообщение содержит виртуальный-ключевой код, который идентифицирует какой ключ был нажат, но не символьная величина. Для того, чтобы извлекать эту величину, цикл сообщения должен содержать TranslateMessage, который переводится виртуальному-ключевому сообщению в символьное сообщение (WM_CHAR) и места это снова в прикладную очередь сообщения. Символьное сообщение может затем удален в последующей итерации цикла сообщения и посланного в процедуру окна.
Функция DispatchMessage посылает сообщение в процедуру окна связанную ручкой окна определенную в структуре MSG. Если ручка окна - HWND_TOPMOST, DispatchMessage посылает сообщение в процедуры окна всего окна верхнего уровня в системе. Если ручка окна НЕДЕЙСТВИТЕЛЬНА, DispatchMessage делает ничто с сообщением. Прикладная основная резьба начинает свой цикл сообщения после инициализировать приложения и создания по крайней мере одно окно. Как только начато, цикл сообщения остается извлекать сообщения из очереди сообщения резьбы и, чтобы посылать им в подходящее окно. Цикл сообщения заканчивается когда функциональные удаления GetMessage сообщение WM_QUIT из очереди сообщения.
Только один цикл сообщения необходим для очереди сообщения, даже если бы приложение содержит много окно. DispatchMessage ВСЕГДА посылает сообщение в соответствующее окно; дело в том, что каждое сообщение в очереди - структура MSG, которая содержит ручку окна на котором сообщение принадлежит. Вы можете модифицировать цикл сообщения в ряд путей. Например, Вы можете извлечь сообщения из очереди не посылая им в окно. Это полезное для приложений, которые посылают сообщения не определяя окно. Вы можете также направить GetMessage, чтобы искать специфические сообщения, оставляющие другие сообщения в очереди. Это полезное если Вы должны временно обойти обычный порядок FIFO очереди сообщения.
Приложение, которое использует ключи акселератора должно быть способным перевестись клавишные сообщения в командные сообщения. Для того, чтобы делать это, прикладной цикл сообщения должен включить вызов в функцию TranslateAccelerator. Более подробно о ключах акселератора, смотри Клавишные Акселераторы. Если резьба использует независимый диалоговый ящик, цикл сообщения должен включить функцию IsDialogMessage чтобы диалоговый ящик может получить ввод данных с клавиатуры.
|
|
|
|
| |