Мышь Enter и Мышь Выйти на форму - PullRequest
4 голосов
/ 13 ноября 2010

У меня есть форма с дочерними элементами управления. Я хочу, когда пользователь наведет курсор мыши на форму, форма будет закрыта. Таким образом, я ловлю мышью ввод и перехожу покинуть форму. Но если я наведу указатель мыши на любой элемент управления в форме, событие мыши также будет зафиксировано.

Пожалуйста, помогите мне решить эту проблему. Спасибо.

UPDATE: Когда курсор находится в области заголовка формы (эта область называется не клиентской областью). Я перемещаю мышь из этого региона, я не могу получить сообщение WM_MOUSELEAVE, а также WM_NCMOUSELEAVE. Пожалуйста, помогите мне в этой проблеме. Я хочу получать сообщение при перемещении мыши из этого региона. Спасибо.

Ответы [ 2 ]

1 голос
/ 13 ноября 2010

По сути, вы хотите проверить, находится ли курсор в области видимости элемента управления. Вот решение:

(1) Добавьте Panel в форме того же размера, что и ваш Form, и переместите все элементы управления в форме на панель. Это легко изменить: откройте MyForm.designer.cs, добавьте панель и измените все операторы, например this.Controls.Add(myLabel); на this.myPanel.Controls.Add(myLabel);.

(2) Обработайте события MouseEnter и MouseLeave панели, которую вы добавили.

myPanel.MouseEnter += (sender, e) =>
{
    //enter
};

myPanel.MouseLeave += (sender, e) =>
{
   if (Cursor.Position.X < myPanel.Location.X 
       || Cursor.Position.Y < myPanel.Location.Y
       || Cursor.Position.X > myPanel.Location.X + myPanel.Width 
       || Cursor.Position.Y > myPanel.Location.Y + myPanel.Height)
   {
       //out of scope
   }
};

(3) Почему бы не использовать Form на шаге 2? Зачем нам нужен Panel с таким же размером? Попробуй сам. Узкая граница формы сведет вас с ума.

(4) Вы можете сделать операторы if на шаге 2 для метода расширения, который полезен для дальнейшего использования.

0 голосов
/ 13 ноября 2010

это происходит потому, что у вас есть разрыв между дочерними элементами управления при выходе из элементов управления, событие form_mouseEnter запускается автоматически

, как вы можете сделать это, поместив элементы управления без пробела

или

Если вы не хотите, чтобы пользователь оставлял ваш элемент управления, вы можете установить Границу курсора Используйте это

Cursor.Clip=Control_name.Bounds;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...