Событие пузырьков - событие Mousehover для дочерних элементов управления - PullRequest
3 голосов
/ 14 апреля 2011

У меня есть winform с некоторыми элементами управления.
Пока курсор входит в форму (границы формы, включая содержимое формы), я хочу вызвать определенную задачу.Когда курсор покидает форму, я хочу вызвать другую задачу.

Очевидно, что эти события в форме не будут работать: (потому что, например, MouseLeave будет срабатывать при переходе от самой формы к другому элементу управления)

this.MouseEnter += (sender, e) =>
{
   //do stuff
};

this.MouseLeave += (sender, e) =>
{
   //do stuff
};

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

 public bool PreFilterMessage(ref Message m)
 {
    switch (m.Msg)
    {
        case WM_MOUSEMOVE: //or other messages
        bool z = myForm.Bounds.Contains(Cursor.Position); //This didn't help
    }
    eturn false;
}

Существует также проблема с обнаружением в содержимом формы (когда я перемещаюсь между элементами управления).

Что мне не хватает?

обновление: я не хочу использовать таймеры!

Ответы [ 2 ]

0 голосов
/ 09 сентября 2011

Я однажды применил такой трюк, чтобы следить за предками всех форм:

Формы имеют событие ControlAdded . Вы можете подключиться к этому (вероятно, до InitializeForm . Внутри этого обработчика событий можно подключиться к событиям ControlAdded и MouseXXX всех детей и внуков . отправить все события одного и того же типа одному и тому же обработчику.

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

0 голосов
/ 14 апреля 2011

Вы можете получить текущие координаты x, y указателя и посмотреть, находятся ли они внутри формы.Если это не так, выполните задачу не в форме.

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