На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

Queued Messages



Windows can display any number of windows at a time. To route mouse and keyboard input to the appropriate window, Windows uses message queues.

Windows maintains a single system message queue and any number of thread message queues, one for each GUI thread. To avoid the overhead of creating a message queue for non-GUI threads, all threads are created initially without a message queue. The system creates a thread's message queue only when the thread makes its first call to one of the Win32 API User or GDI functions.
Whenever the user moves the mouse, clicks the mouse buttons, or types on the keyboard, the device driver for the mouse or keyboard converts the input into messages and places them in the system message queue. Windows removes the messages, one at a time, from the system message queue, examines them to determine the destination window, and then posts them to the message queue of the thread that created the destination window. A thread's message queue receives all mouse and keyboard messages for the windows created by the thread. The thread removes messages from its queue and directs Windows to send them to the appropriate window procedure for processing.

With the exception of the WM_PAINT message, Windows always posts messages at the end of a message queue. This ensures that a window receives its input messages in the proper first-in, first-out (FIFO) sequence. The WM_PAINT message, however, is kept in the queue and is forwarded to the window procedure only when the queue contains no other messages. Multiple WM_PAINT messages for the same window are combined into a single WM_PAINT message, consolidating all invalid parts of the client area into a single area. Combining WM_PAINT messages reduces the number of times a window must redraw the contents of its client area.

The system posts a message to a thread's message queue by filling an MSG structure and then copying it to the message queue. Information in MSG includes: the handle of the window for which the message is intended, the message identifier, the two message parameters, the time the message was posted, and the mouse cursor position. A thread can post a message to its own message queue or to the queue of another thread by using the PostMessage or PostThreadMessage function.

An application can remove a message from its queue by using the GetMessage function. To examine a message without removing it from its queue, an application can use the PeekMessage function. This function fills MSG with information about the message.
After removing a message from its queue, an application can use the DispatchMessage function to direct Windows to send the message to a window procedure for processing. DispatchMessage takes a pointer to MSG that was filled by a previous call to the GetMessage or PeekMessage function. DispatchMessage passes the window handle, the message identifier, and the two message parameters to the window procedure, but it does not pass the time the message was posted or mouse cursor position. An application can retrieve this information by calling the GetMessageTime and GetMessagePos functions while processing a message.

A thread can use the WaitMessage function to yield control to other threads when it has no messages in its message queue. The function suspends the thread and does not return until a new message is placed in the thread's message queue.
You can call the SetMessageExtraInfo function to associate a 32-bit value with the current thread's message queue. Then call the GetMessageExtraInfo function to get the value associated with the last message retrieved by the GetMessage or PeekMessage function.


Пригласи друзей и счет твоего мобильника всегда будет положительным!
Предыдущая статья
 
Сайт Народ.Ру Интернет
Следующая статья
Пригласи друзей и счет твоего мобильника всегда будет положительным!

Поставленные в очередь Сообщения



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

Окно поддерживает единственную системную очередь сообщения и любой номер сообщения резьбы ставит в очередь, за каждой резьбы ГРАФИЧЕСКОГО интерфейса пользователя. Для того, чтобы избегать подвесного создания очереди сообщения для не-резьбы ГРАФИЧЕСКОГО интерфейса пользователя, вся резьба создается первоначально без очереди сообщения. Система создает очередь сообщения резьбы только когда резьба делает своим первым вызовом один из Потребителя Win32 API или функциями GDI.
Всякий раз, когда потребитель перемещает мышь, щелкает кнопки мыши или набирается на клавиатуре, водитель устройства для мыши или клавиатуры преобразовывает вклад в сообщения и устанавливает им в системной очереди сообщения. Окно удаляет сообщения, поочередно, из системной очереди сообщения, изучает их, чтобы определять окно расположения, затем посылает им в очередь сообщения резьбы, которая создавала окно расположения. Очередь сообщения резьбы получает всю мышь и клавишные сообщения для окна созданного резьбой. Резьба удаляет сообщения из своей очереди и направляет Окно, чтобы посылать им в подходящую процедуру окна для обработки.

За исключением сообщения WM_PAINT, Окно всегда посылает сообщения в конце очереди сообщения. Это проверяет, что окно получает свои входные сообщения в соответствующем первом-в, сначала- последовательность (FIFO). Сообщение WM_PAINT, тем не менее, держано в очереди и переслано процедуре окна только когда очередь не содержит никакие другие сообщения. Многочисленные сообщения WM_PAINT для того же окна объединены в единственное сообщение WM_PAINT, укрепляющее все неправильные части области клиента в единственную область. Объединение сообщений WM_PAINT уменьшает раз (а) окно должно перерисовывать содержание своей области клиента.

Система посылает сообщение в очередь сообщения резьбы заполняя структуру MSG и затем копируя это в очередь сообщения. Информация в MSG включает: ручка окна для которого сообщение предположено, идентификатор сообщения, два параметра сообщения, время сообщение было объявлено, и позиция курсора мыши. Резьба может послать сообщение в свою собственную очередь сообщения или в очередь другой резьбы используя PostMessage или функция PostThreadMessage.

Приложение может удалить сообщение из своей очереди используя функцию GetMessage. Чтобы изучать сообщение не удаляя это из своей очереди, приложение может использовать функцию PeekMessage. Эта функция заполняет MSG информацией о сообщении.
После удаления сообщения из своей очереди, приложение может использовать функцию DispatchMessage, чтобы направлять Windows, чтобы посылать сообщение в процедуру окна для обработки. DispatchMessage ПЕРЕДАЕТ указатель MSG, которое было заполнено предшествующим вызовом в GetMessage или функцию PeekMessage. DispatchMessage ПЕРЕДАЕТ ручку окна, идентификатор сообщения, и два параметра сообщения в процедуру окна, но это не передает время, которое сообщение было объявлено или позиция курсора мыши. Приложение может извлечь эту информацию вызывая GetMessageTime и функции GetMessagePos при обработке сообщения.

Резьба может использовать функцию WaitMessage, чтобы давать управление в другую резьбу когда у него нет сообщений в своей очереди сообщения. Функция задерживает резьбу и не возвращается пока новое сообщение не будет установлено в очереди сообщения резьбы.
Вы можете вызвать функцию SetMessageExtraInfo, чтобы соединять 32- битовую величину с очередью сообщения текущей резьбы. Затем вызовите функцию GetMessageExtraInfo, чтобы связать величину последним сообщением извлеченным GetMessage или функцию PeekMessage.


Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz