Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1364415191
N.Cage
2013-03-28 00:13
2013.09.08
Рейтинг производителей ноутбуков


15-1364804038
Inovet
2013-04-01 12:13
2013.09.08
Прога для ришения ЕГЭ


15-1364934603
Юрий
2013-04-03 00:30
2013.09.08
С днем рождения ! 3 апреля 2013 среда


2-1356344035
oam333
2012-12-24 14:13
2013.09.08
Не получается копировать часть изображения


1-1312275277
Человек
2011-08-02 12:54
2013.09.08
Динамическое изменение TrayIcon.Icon





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский