2015-05-16 5 views
3

В MFC предположим, что у меня есть диалоговое окно, и в этом поле у ​​него есть дочерний CListCtrl, затем я использую мышь, чтобы щелкнуть этот CListCtrl, мы знаем, что в конечном итоге сообщение WM_LBUTTONDOWN отправляется в CListCtrl. Мой вопрос: как это сообщение WM_LBUTTONDOWN? Две возможности:Поток сообщений MFC для элементов управления?

  1. Диалоговое окно первым получает этот WM_LBUTTONDOWN сообщение, и он считает, что мыши происходит в его дочернее окно, то он передает это сообщение в CListCtrl.
  2. CListCtrl сначала получает это сообщение WM_LBUTTONDOWN, оно может обрабатывать это сообщение, и если ему не важно, оно отправит это сообщение в родительское окно, то есть диалоговое окно для дальнейшей обработки.

Какое значение верно?

Спасибо.

ответ

2

Вводные сообщения никогда не отправляются отправлено в окно. Они отправляются в очередь сообщений, связанную с окном, ожидая получения через одну из функций поиска сообщений (GetMessage, PeekMessage и т. Д.).

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

Подводя итоги: цикл сообщения приложения (или вложенный модульный контур сообщения) позволяет увидеть сообщение первым и инструктирует диспетчер окон доставлять сообщение соответствующему получателю.


Подробное описание обработки сообщений Windows можно получить по адресу About Messages and Message Queues. Описание специфично для Windows API. Поскольку MFC - это всего лишь оболочка вокруг API Windows, содержимое распространяется и на MFC, хотя некоторые из понятий скрыты в типичном приложении MFC.

Смежные вопросы