2009-07-11 3 views
0

Я только что встретил проблему с WM_NCMOUSELEAVE.Почему WM_NCMOUSELEAVE всегда отправляется в окно после его создания?

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

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

поблагодарить Вас за совет.

ответ

1

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

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

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

сообщения, которые начинаются с ЧПУ представляют собой события, которые произошли в Non-Client областях окна. Сообщения без префикса находятся в области «Клиент».

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

  • 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

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

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

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

Customizing the Non-client Area from CodeProject (VB)

+0

Благодарим Вас за ответ^_^ Но это не очень полезно для моего вопроса :( Моя проблема, я создаю окно, и я хочу, чтобы отслеживать WM_NCMOUSELEAVE по какой-то причине, поэтому я добавляю обработчик WM_NCMOUSELEAVE в WINPROC. Но я заметил, что до того, как я вызываю TrackMouseEvent() для отслеживания WM_NCMOUSELEAVE, но после создания окна, если я перемещаю курсор над неклиентской областью, WINPROC получит WM_NCMOUSELEAVE один раз и только один раз Я не знаю почему. Поэтому я отправляю вопрос. Я попытался вызвать TrackMouseEvent с TME_CANCEL, чтобы предотвратить это сообщение, но он не работает. Моя система WINXP с sp3. – cyberscorpio

+0

Когда вы вызываете TrackMouseEvent()? Согласно Документации в MSDN, если мышь не находится в соответствующей области окна во время ее вызова, она выведет сообщение один раз, а затем выйдет. Попробуйте добавить обработчик WM_NCMOUSEMOVE к вашему WndProc и настроить свой вызов на TrackMouseEvent() там, если он еще не активен. После того, как вы получили уведомление WM_NCMOUSELEAVE, вы должны вызвать его снова в следующем сообщении WM_NCMOUSEMOVE. – meklarian

+0

Вот ссылка для TrackMouseEvent(). http://msdn.microsoft.com/en-us/library/ms646265(VS.85).aspx – meklarian

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

  • Нет связанных вопросов^_^