Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2010.02.21;
Скачать: [xml.tar.bz2];

Вниз

"Правильная" идентификация события ухода мыши с формы.   Найти похожие ветки 

 
Enlight   (2009-03-30 21:26) [0]

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


 
KilkennyCat ©   (2009-03-30 21:51) [1]

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


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


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

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


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

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


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


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

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

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 03:58) [4]

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

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


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


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

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


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

> 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 15:33) [7]


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

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


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

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


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

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


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

> NiGGa   (31.03.09 15:36) [8]

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

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



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2010.02.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.006 c
15-1257309727
xayam
2009-11-04 07:42
2010.02.21
Старые архивы для DMSearch на www.delphimaster.net


15-1260171051
12
2009-12-07 10:30
2010.02.21
Нашел книгу по администрированию MSSQL


15-1260658521
Германн
2009-12-13 01:55
2010.02.21
Blacklist в почтовых (email) сообщениях.


15-1260653419
Юрий
2009-12-13 00:30
2010.02.21
С днем рождения ! 13 декабря 2009 воскресенье


15-1260328586
Kerk
2009-12-09 06:16
2010.02.21
Лицемерие :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский