![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#16
|
||||
|
||||
|
Цитата:
:Код:
procedure TForm1.sbt_StatMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var
pt: TPoint;
begin
with Sender as TButton do
begin
Perform(BM_SETSTATE, 1, 0);
pt := Parent.ClientToScreen(Point(Left, Top + Height));
PopupMenu1.Popup(pt.X, pt.Y);
Perform(BM_SETSTATE, 0, 0);
end;
end;p.s. Хотя конструкцию with я недолюбливаю... |
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
DOR (21.10.2012)
| ||
|
#17
|
|||
|
|||
|
Не сочтите за наглость, так чтобы было вообще при вообще, как сделать чтобы при смене фокуса меню закрывалось. Спасибо.
|
|
#18
|
||||
|
||||
|
Цитата:
|
|
#19
|
|||
|
|||
|
Хм, у меня не скрывается, приходиться щелкнуть в свободном месте, только после этого пропадает.
|
|
#20
|
||||
|
||||
|
При смене фокуса на такую же кнопку с выпадающим меню?
|
|
#21
|
|||
|
|||
|
Не всегда, иногда это просто кнопка, иногда на выпадающую
|
|
#22
|
||||
|
||||
|
Может так? Но я пока только с таймером допер.
ЗЫ Кусок кода Код:
if form1.ControlAtPos(pt,true,true).ClassType = TButton then
if form1.ControlAtPos(pt,true,true).Tag=54 then
Button1MouseMove(form1.ControlAtPos(pt,true,true),[],pt.X, pt.Y);
Последний раз редактировалось YVitaliy, 21.10.2012 в 14:14. |
|
#23
|
|||
|
|||
|
Возвращаясь к теме, в выложенном примере, скрытие меню происходит только если перевести курсор на какой нить другой буттон, а не убрать фокус с кнопки и при этом (после скрытия меню) кнопка под которым вылазило меню, остается вжатой (. Помогите пожалуйста добить эту тему.
|
|
#24
|
||||
|
||||
|
Цитата:
Код:
keybd_event(VK_ESCAPE, MapVirtualKey(VK_ESCAPE, 0), 0, 0); keybd_event(VK_ESCAPE, MapVirtualKey(VK_ESCAPE, 0), KEYEVENTF_KEYUP,0); Код:
PostMessage(PopupMenu.Handle, WM_NULL, 0, 0); Ещё могу предложить немного модифицнуть в примере процедуру Button1MouseMove, дописав первой строчкой вот это: Код:
if Application.Active then begin ...всё остальное... end; |
|
#25
|
||||
|
||||
|
Вот ещё бы в темочке писатеньки без выпендрёжечка.
![]() |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Alegun (24.11.2012)
| ||
|
#26
|
||||
|
||||
|
Цитата:
|
|
#27
|
|||
|
|||
|
Цитата:
Ну, если надо отследить именно уход фокуса, то в обработчике события OnExit надо просто проверить, что меню еще открыто, и если да, то просто закрыть его. |
|
#28
|
||||
|
||||
|
Цитата:
|
|
#29
|
||||
|
||||
|
Я в самопальном меню использовал WM_MOUSELEAVE.
|
|
#30
|
||||
|
||||
|
Для выхода я в примере использую EndMenu - должна закрывать все меню, так что эмулировать esc нет смысла.
Для "убора" фокуса с кнопки нужно (!) кликнуть по какому-нибудь другому контролу. Сам по себе фокус никуда не денется (если конечно не убирать его "вручную"). А для клика на другой контрол нужно навести на него мышь (при открытом меню tab не работает). А процедура (которая в таймере) отлавливает это наведение, и закрывает все меню, если tag в этого контрола не равен 55. В примере лежит и панель, неужели при наведении на нее меню не закрывается? |