Почему WM_NCMOUSELEAVE всегда отправляется окну после его создания? - PullRequest
0 голосов
/ 11 июля 2009

Я только что столкнулся с проблемой, связанной с WM_NCMOUSELEAVE.

Я заметил, что когда окно создано, затем просто наведите курсор на заголовок, тогда ему будет отправлено WM_NCMOUSELEAVE. Нет вызова TrackMouseEvent ().

Я читаю MSDN, но не понимаю. (

спасибо за ваш совет.

1 Ответ

1 голос
/ 11 июля 2009

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

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

  • Титры подписи
  • Системное меню / Свернуть / Развернуть / Закрыть
  • Граница

Сообщения с префиксом NC представляют события, которые произошли в не-клиентских областях окна. Сообщения без префикса находятся в клиентской области.

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

  • WM_NCMOUSEMOVE

(положение мыши изменилось в не клиентской области)

  • WM_NCLBUTTONDBLCLK
  • WM_NCLBUTTONDOWN
  • WM_NCLBUTTONUP

(действия левой кнопки в не клиентской области)

  • WM_NCMBUTTONDBLCLK
  • WM_NCMBUTTONDOWN
  • WM_NCMBUTTONUP

(действия средней кнопки в не клиентской области)

  • WM_NCRBUTTONDBLCLK
  • WM_NCRBUTTONDOWN
  • WM_NCRBUTTONUP

(правая кнопка в не клиентской области)

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

  • WM_NCACTIVATE

(активация окна изменилась в результате действий пользователя, и необходимо обновить область, не относящуюся к клиенту)

  • WM_NCHITTEST

(оконный менеджер хочет знать, отслеживает ли не-клиентская область активность мыши)

  • WM_NCPAINT

(область, не относящуюся к клиенту, должна быть перекрашена)

Полезным приемом для определения визуального экстента области, не являющейся клиентом, является перехват сообщения WM_NCPAINT и просто закрашивание области, не являющейся клиентом, в цвет по вашему выбору (красный / розовый или какой-либо другой выделенный цвет). Это полезно для отладки ситуаций, когда у вас есть несколько окон, смежных друг с другом с не-клиентскими областями, которые должны выглядеть незаметно.

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

Настройка области без клиента из CodeProject (VB)

...