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

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

Как сделать исчезающее Popup меню


Гест ©   (2012-12-21 23:00:00) 

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

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

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


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

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


Ega23   (2012-12-26 08:35:00) [1]


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

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


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

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

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


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

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


Ghost del vonte   (2012-12-22 03:06:00) [4]

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


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


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


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


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


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


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


> Ghost del vonte ©

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


Ghost del vonte   (2012-12-22 02:51:00) [7]

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


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

Ах да... в обработчике процедуры 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:44:00) [9]


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;


Это?


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


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

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


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

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


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

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

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


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


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

Какой?


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

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


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


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

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


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


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


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


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


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

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


Rouse_   (2012-12-21 23:56:00) [17]


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

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


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

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


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

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


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

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


Rouse_   (2012-12-21 23:44:00) [19]

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

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


Наверх

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