Цитата:
Сообщение от DOR
Возвращаясь к теме, в выложенном примере, скрытие меню происходит только если перевести курсор на какой нить другой буттон, а не убрать фокус с кнопки и при этом (после скрытия меню) кнопка под которым вылазило меню, остается вжатой (. Помогите пожалуйста добить эту тему.
|
Нашёл в тырнете один варьянт как заставить "убраться" попапку после слёта с неё курсора, но он очень громоздкий, более 100 строк и около 5ти процедур в теле, это не айс, да в добавок он глючный, нарушает всю аплику, потому забил на энто дело. Есть более простые, на мой взгляд, способы - либо по таймеру послать эмульку эскейпа, (программно нажать на баттон Esc) типа:
Код:
keybd_event(VK_ESCAPE, MapVirtualKey(VK_ESCAPE, 0), 0, 0);
keybd_event(VK_ESCAPE, MapVirtualKey(VK_ESCAPE, 0), KEYEVENTF_KEYUP,0);
либо постануть попапке мессагу WM_NULL типа:
Код:
PostMessage(PopupMenu.Handle, WM_NULL, 0, 0);
Но здесь свои подводные каменюги: вроде нужно ловить сообщения для/от всплывающей менюхи, особливо про схождение с неё грызуна чтоб таймер включить (по идее это возможно, исчезает же при уходе выделение пунктов, здесь наверное задействуются WM_ENTERMENULOOP или WM_EXITMENULOOP, точно не проверял, походу эти мессаги в обход класса проходят) иначе, закроется менюшка даже под мышой, но к сожалению, я таких заморочек не знаю, только лишь открыто/закрыто на ум приходит(GetGUIThreadInfo:= GUITHREADINFO.hwndMenuOwner = 0:закр; <>0: откр) но это всё шлётся после клика по пунктам меню:-( Однажды я с таким сталкивался, плюнул, и сварганил эрзац попапки из связки панель+листбокс, но это было давно и очень нудно.
Ещё могу предложить немного модифицнуть в примере процедуру Button1MouseMove, дописав первой строчкой вот это:
Код:
if Application.Active then begin ...всё остальное... end;
иначе попапка будет вылазить и при неактивной форме, или сквозь другие проги, что не совсем хорошо.