Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.09.08;
Скачать: CL | DM;

Вниз

Как сделать исчезающее Popup меню   Найти похожие ветки 

 
Гест   (2012-12-21 23:00) [0]

Хочу сделать меню как в профиле ЖЖ или на многих сайтах сделаны. Когда наводишь мышь на кнопку SpeedButton - меню появляется, если отводишь мышь в сторону, а не выбираешь какой-либо пункт меню, то оно исчезает.

Выпадение меню сделать получилось. У TRxSpeedButton есть событие OnMouseMove. Вставил в него текст:

   with RxSpeedButton1, ClientToScreen(Point(0, Height)) do
   DropDownMenu.Popup(X, Y);


Меню появляется при наведении на него мыши. Теперь вопрос: как отслеживать уход мыши из зоны кнопки и меню, чтобы это меню закрыть?

Когда меню выпало, событие OnMouseLeave для кнопки уже не проходит, а у меню его вообще нет.


 
Rouse_ ©   (2012-12-21 23:44) [1]

Отслеживай координаты мыши для детектирования ее ухода (ну либо лови событие ухода).
Анимацию делай как обычно: Берешь контекст окна и копируешь на него рект бэкграунда с выставлением альфаканала по таймеру.

Вопрос - а нафига такие причуды?
Чем они пользователю то помогут при работе с программой?


 
Гест   (2012-12-21 23:53) [2]

Отслеживай координаты мыши для детектирования ее ухода
Как узнать размер меню чтобы узнать находится на нём мышь или нет?


> Вопрос - а нафига такие причуды?
> Чем они пользователю то помогут при работе с программой?

Кнопку не надо нажимать. Экономятся силы пользователя.


 
Rouse_ ©   (2012-12-21 23:56) [3]


> Гест   (21.12.12 23:53) [2]
> Отслеживай координаты мыши для детектирования ее ухода
> Как узнать размер меню чтобы узнать находится на нём мышь
> или нет?

Меню это окно - у него есть координаты.


> Гест   (21.12.12 23:53) [2]
> Кнопку не надо нажимать. Экономятся силы пользователя.

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


 
Гест   (2012-12-22 00:03) [4]


> Меню это окно - у него есть координаты.


Как их узнать?


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


... выползали и исчезали сразу же как только мышь с области меню ушла.

Это чудовищно ! Недопустим никогда ! Так?


 
Rouse_ ©   (2012-12-22 00:15) [5]


> Как их узнать?

Бох ты мой, да как тебе больше нравится, ну можно через напрямую :)
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633519(v=vs.85).aspx


 
Гест   (2012-12-22 00:31) [6]

Мне больше нравится пример на Дельфи.


 
Rouse_ ©   (2012-12-22 00:38) [7]


> Гест   (22.12.12 00:31) [6]
> Мне больше нравится пример на Дельфи.

Какой?


 
Inovet ©   (2012-12-22 01:13) [8]

> [7] Rouse_ ©   (22.12.12 00:38)
> Какой?

Код давай! Не понятно что ли?


 
Гест   (2012-12-22 01:50) [9]

Почему RxSpeedButton1.Click не вызывает выпадение меню? И как тогда правильно кликнуть на кнопку программно?


 
Германн ©   (2012-12-22 02:06) [10]


> Гест   (22.12.12 01:50) [9]
>
> Почему RxSpeedButton1.Click не вызывает выпадение меню?

А разве должен сей метод вызывать "выпадение меню"?


 
Ghost del vonte ©   (2012-12-22 02:44) [11]


type
 TNLabel = class(TLabel)
 private
   FOnMouseEnter: TNotifyEvent;
   FOnMouseLeave: TNotifyEvent;
 protected
   { Protected declarations }
   PROCEDURE CMMouseEnter(VAR msg:TMessage); message CM_MOUSEENTER;
   PROCEDURE CMMouseLeave(VAR msg: TMessage); message CM_MOUSELEAVE;
 public
   { Public declarations }
   constructor Create(AOwner : TComponent); override;
   destructor Destroy; override;
 published
   property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
   property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
 end;

...

PROCEDURE TNLabel.CMMouseEnter(var msg : TMessage);
begin
if Assigned(FOnMouseEnter) then
   FOnMouseEnter(Self);
end;

PROCEDURE TNLabel.CMMouseLeave(var msg: TMessage);
BEGIN
if Assigned(FOnMouseLeave) then
   FOnMouseLeave(Self);
END;


Это?


 
Ghost del vonte ©   (2012-12-22 02:48) [12]

Ах да... в обработчике процедуры OnMouseenter написать:


var
P: TPoint;
X, Y: Integer;
begin
if DownMenu <> nil then
begin
  X:= Left;
  Y:= Height + Top + 1;
  P:= Application.MainForm.ClientToScreen(Point(0, 0));
  PopupMenu1.Popup(P.X + X, P.Y + Y);
end;


 
Ghost del vonte ©   (2012-12-22 02:51) [13]

Перепутал все, сорри, сплю уже...
В процедуре OnMouseLeave прячь меню...


 
Гест   (2012-12-22 02:53) [14]


> Ghost del vonte ©

Нет, не это. Как просто попить меню я написал в первом постинге. Вопрос как от него избавиться через некоторое время. Хотел сделать это по таймеру, так обнаружил, что когда меню появилось - таймер не работает ! И как теперь быть тогда?


 
Гест   (2012-12-22 02:55) [15]


> Ghost del vonte ©   (22.12.12 02:51) [13]
>
> Перепутал все, сорри, сплю уже...


Ничего. Всё равно спасибо за проявленное ко мне внимание. :)


> В процедуре OnMouseLeave прячь меню...


Когда меню открыто, то OnMouseLeave не проходит. Также перестаёт работать таймер на форме. Похоже тут какая-то страшная засада.


 
Ghost del vonte ©   (2012-12-22 03:06) [16]

Попробуй создать свой компонент popupmenu, а его иетмсам назначь эти две процедуры...
тоесть, если мышь уходит из итемса - прячем меню... может так?


 
Гест   (2012-12-22 07:29) [17]

Написание компонента для меня сложно. Ищу более простой способ.
Или может уже есть такие готовые компоненты?


 
Гест   (2012-12-26 08:05) [18]

В общем так и не нашёл решения вопроса.

До чего просто реализовать эту идею на жаваскрипте, и до чего сложно на Дельфи. Просто сравните.


 
Ega23 ©   (2012-12-26 08:35) [19]


> До чего просто реализовать эту идею на жаваскрипте

Ой ли? Эта идея реализована в разных JQuery и ExtJS. Написать с нуля... Ну-ну.



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

Текущий архив: 2013.09.08;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.008 c
2-1356116402
Гест
2012-12-21 23:00
2013.09.08
Как сделать исчезающее Popup меню


1-1313140127
IGray
2011-08-12 13:08
2013.09.08
Программно запустить Delphi и дождаться полной загрузки


10-1185282081
niko_
2007-07-24 17:01
2013.09.08
Получение свойств COM-объектов расположенных на форме


15-1364326850
TStas
2013-03-26 23:40
2013.09.08
Керку про кладовку


1-1312895488
DrDobro
2011-08-09 17:11
2013.09.08
chm файл