Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

"Правильная" идентификация события ухода мыши с формы. [D5, D7, Win2k, WinXP]


Enlight ©   (2009-03-30 21:26:00) 

Доброго времени суток.
Задано: у приложения есть главное окно, в на котором имеем главное меню и бар с набором кноп. Окно приклеено к одной из сторон десктопа (допустим вверху). Оно также обладает свойством (подобным панели задач виндовс) "Автоматически убирать с экрана". Т.е. обычно мы его не видим, когда подводим указатель к верхней границе экрана, оно появляется, соответсвенно когда уводим то, через некоторое время исчезает (на клике по другим окнам, основное окно также исчезает).
Возникла следующая проблема. Когда открываем один из пунктов меню(или дропдаун одной из кнопок бара), и позиционируем мышь на пунткуе меню таком, что-бы его координатно положение было за пределами самого главного окна, то главное окно исчезает, а меню остаеться) Что не самый приятный артефакт.
Соответсвенно возникает вопрос, какие есть методы определения ухода указателя с формы, которые учитывали бы момент, что факт нахождения мыши на попам-меню, тоже считаеться фактом нахождения мыши на форме.
Мм, понимаю, что формулировка вопроса не самая лучшая) но заранее всем спасибо за помощь.


Юрий Зотов   (2009-03-31 16:27:00) [1]

> NiGGa   (31.03.09 15:36) [8]

> форма не прячется т.к. меню висит

Нормально. Панель задач Windows ведет себя точно так же. И это логично, потому что юзер еще может захотеть щелкнуть по пункту меню, мешать ему незачем.


Enlight   (2009-03-31 15:37:00) [2]

Оо. Форум вспомнил мой старый логин NiGGa)))


NiGGa   (2009-03-31 15:36:00) [3]

Правда появился следующий артефакт: при открытии одного из меню или дропдауна, и при уходе мыши за пределы и меню и формы, форма не прячется т.к. меню висит) Но это уже приемлемо, как мне кажеться. Сворачивание происходит скорее всего по сообщению WM_ACTIVATE с Msg.Active = WA_INACTIVE.


NiGGa   (2009-03-31 15:33:00) [4]


> а к другому компоненту, то делается аналогично.

Да, так оно и есть. Правда с главым меню тоже самое) (ввиду того, что используеться ДевЕксы, и главное меню у них тот же dxBar)


Юрий Зотов   (2009-03-31 15:09:00) [5]

> NiGGa   (31.03.09 13:15) [5]

> меню и бар уже реализаовано существующими VCL компонентами, и
> внедриться в их код/произвести замену компонентного решения на данном
> этапе по сути невозможно

Этого и не требуется, можно все оставить, как есть. Для главного меню форма и так получает те же сообщения, а для PopupMenu все делается просто:

1. Оставляем на форме PopupMenu "как оно есть", но очищаем одноименное свойство формы.

2. Пишем обработчик правой кнопки мыши:
TrackPopupMenu(PopupMenu.Handle, TPM_RIGHTBUTTON, Mouse.CursorPos.X, Mouse.CursorPos.Y, 0, Handle, nil);

И все - форма будет получать те же сообщения. Если PopupMenu "привязано" не к форме, а к другому компоненту, то делается аналогично.


NiGGa   (2009-03-31 13:15:00) [6]


> Если меню показывать не средствами VCL

Мм. Тут сложно. Т.к. меню и бар уже реализаовано существующими VCL компонентами, и внедриться в их код/произвести замену компонентного решения на данном этапе по сути невозможно(


Юрий Зотов   (2009-03-31 03:58:00) [7]

Если меню показывать не средствами VCL, а вызовом TrackPopupMenu, то при его открытии форма получит сообщение WM_ENTERMENULOOP, а при закрытии - WM_EXITMENULOOP.

Остальное просто.


NiGGa   (2009-03-31 01:36:00) [8]


> поскольку не знаю как реализована "обработка ухода указателя
> с формы".

Ну на данный момент примитвно) Есть таймер, на ОнТаймер котороно имеем код:

var
 pt : TSmallPoint;
 rc : TRect;
begin
 pt := GetMessagePosition;
 GetWindowRect(Handle, rc);
 InflateRect(rc,
             2 * GetSystemMetrics(SM_CXDOUBLECLK),
             2 * GetSystemMetrics(SM_CYDOUBLECLK));
 if not PtInRect(rc, SmallPointToPoint(pt)) then
    <. вот тут-то и видим) .>


Германн   (2009-03-31 01:10:00) [9]


> KilkennyCat ©   (30.03.09 21:51) [1]
>
> Можно наоборот: главное окно, исчезая, должно забирать с
> собой все.
>

Харакири лучше апперкота?
:)


> "Соответственно" возникает вопрос, какие есть методы определения
> ухода указателя с формы, которые учитывали бы момент, что
> факт нахождения мыши на попам-меню, тоже "считается" фактом
> нахождения мыши на форме.

На OnPopup выставлять флаг, который сигнализирует о том, что попап-меню задействованно. И учитывать этот флаг при "уходе указателя мыши с формы". Сам не проверял, поскольку не знаю как реализована "обработка ухода указателя с формы".


KilkennyCat   (2009-03-30 21:51:00) [10]

Можно наоборот: главное окно, исчезая, должно забирать с собой все.


Наверх

Титульная страница Поиск, карта сайта Написать письмо