Форум: "Начинающим";
Текущий архив: 2013.09.08;
Скачать: [xml.tar.bz2];
ВнизКак сделать исчезающее 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.003 c