Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.17;
Скачать: CL | DM;

Вниз

Не закрывать попап   Найти похожие ветки 

 
RASkov   (2006-11-04 00:11) [0]

Есть Popup меню вот такое:


|---------|
|о Find.   |  <- Radio
|  Filtr  |  <- Radio
|-------- |
|v Name.   |  <- Check
|  Adr    |  <- Check
|  Data.   |  <- Check
|---------|


Как сделать, чтобы при выборе первых двух элементов, меню не закрывалось, а переключались состояния Checked этих элементов. Перекопал все меню в VCL - не смог сделать:(
В каком методе меню сворачивается, как его остановить/что перекрыть? У кого TMenu, TMenuItem, TPopupMenu?
Вроде бы был похожий вопрос - не нашел. Спасибо.


 
Германн ©   (2006-11-04 00:35) [1]

Имхо, этот вопрос не к VCL (Borland), а к OS Windows (MS). Так что эмулируй стандартное меню своим окном.


 
RASkov   (2006-11-04 01:16) [2]

А вот эта функция, что делает?

BOOL TrackPopupMenu(
   HMENU hMenu, // handle of shortcut menu
   UINT uFlags, // screen-position and mouse-button flags
   int x, // horizontal position, in screen coordinates
   int y, // vertical position, in screen coordinates
   int nReserved, // reserved, must be zero
   HWND hWnd, // handle of owner window
   CONST RECT *prcRect // points to RECT that specifies no-dismissal area
  );

Я англ. не понимаю. X-Translator перевел:


Функция TrackPopupMenu показывает сокращенное меню в указанном местоположении и отслеживает выбор пунктов(изделий) на меню. Сокращенное меню может появляться где-нибудь на экране.
....
hWnd
Идентифицирует окно, которое имеет(признает) сокращенное меню. Это окно получает все сообщения от меню. Окно не получает WM_COMMAND сообщение от меню до возвращений функции.

prcRect
Указывает на структуру RECT, которая определяет часть экрана, в котором пользователь может выбирать без того, чтобы уволить(отклонить) сокращенное меню. Если этот параметр ПУСТОЙ, сокращенное меню отклонено, если пользователь щелкает вне сокращенного меню.

По англ., наверное больше понятно, чем перевод:)

Ничем помочь не сможет?
Где-то видел такое, что меню не закрывается если "щелкается" по определенным пунктам. Неуж-то они(авторы тех прог где такое меню) с нуля своё меню делали?
Ну а не поможет... будем извращаться. Спасибо.


 
guav ©   (2006-11-04 01:27) [3]

можно попробовать not Enabled + OwnerDraw + WM_MENUSELECT


 
Германн ©   (2006-11-04 01:27) [4]


> RASkov   (04.11.06 01:16) [2]
>
> А вот эта функция, что делает?
>
> BOOL TrackPopupMenu(
>    HMENU hMenu, // handle of shortcut menu
>    UINT uFlags, // screen-position and mouse-button flags
>    int x, // horizontal position, in screen coordinates
>    int y, // vertical position, in screen coordinates
>    int nReserved, // reserved, must be zero
>    HWND hWnd, // handle of owner window
>    CONST RECT *prcRect // points to RECT that specifies
> no-dismissal area
>   );
>
> Я англ. не понимаю. X-Translator перевел:


Эт зря. Аглицкий понимать нужно, если хочешь делать подобное. :-)
По сути. Перевод достаточно правильный. Теперь нужно экспериментировать с применением данной функции. Я, лично, ни чем подобным не занимался, извини.


 
RASkov   (2006-11-04 02:03) [5]

> Аглицкий понимать нужно

Ой как желею об этом:(
Сейчас по справке шарился, много чего интересного но... нипонимаю, блин.

> [3] guav ©   (04.11.06 01:27)

Если можно небольшой пример как с этим можно побороть "Попап".
Как и где отловить WM_MENUSELECT? Можно даже оставить элемент выключенным
Т.е. первый и второй элемент Enable:=False;(пусть будут серенькими - даже лучьше) но при щелчке по ним нужно у них менять Checked..


 
RASkov   (2006-11-04 02:13) [6]

Вот кусок из RxMenus

procedure MenuWndMessage(Menu: TMenu; var AMsg: TMessage; var Handled: Boolean);
var
 Message: TMessage;
 Item: Pointer;
begin
 with AMsg do
   case Msg of
     WM_MEASUREITEM:
....
     WM_MENUSELECT: Menu.Dispatch(AMsg);
     CM_MENUCHANGED: Menu.Dispatch(AMsg);

.....
Может как нить .Dispatch Popap"у "сделать грамотно и вовремя"?


 
RASkov   (2006-11-04 04:06) [7]

Элемент меню(MenuItem) с Enabled:=False "ловит" какие-нибудь сообщения от мыши?
переопределил Click у TMenuItem, в нем пытался отправить попапу сообщение мыши

procedure TMyMenuItem.Click;
var Mes: TWMLButtonDown;
begin
 Mes.Msg:=WM_LBUTTONDOWN;
 TMenu(GetParentMenu).Dispatch(Mes);
end;

procedure TMyPopupMenu.WMLButtonDown(var Message: TWMLButtonDown);
begin
 ShowMessage("WMLButtonDown");
end;


На "включенных" приходят, а на "выкл" нет.... Но ведь "кто-то проверяет состояние элемента"... кто?


 
RASkov   (2006-11-04 04:12) [8]

Вот еще надеюсь на пример с not Enabled + OwnerDraw + WM_MENUSELECT
Но похоже сам я ничего уже больше не придумаю. Спасибо.


 
RASkov   (2006-11-04 20:22) [9]

Вообщем сделал так.... некрасиво, неправильно, но более менее близко к желаемому
procedure TForm1.N1Click(Sender: TObject);
begin
 if not (Sender as TMenuItem).Checked then begin
  (Sender as TMenuItem).Checked:=True;
  RxSpeedButton1.CheckBtnMenuDropDown;
 end;
 ...
end;

Это с использованием RxLib - его SpeedButton c RxPopupMenu. Код общий для первых двух элементов.
Вариант [1] > Так что эмулируй стандартное меню своим окном.
думаю не стОит сдесь этого. Хотя то же вариант.
Спасибо всем.
-Незачто:)



Страницы: 1 вся ветка

Текущий архив: 2006.12.17;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.04 c
15-1164391910
Колдун
2006-11-24 21:11
2006.12.17
К555РУ2


2-1164983329
vitv
2006-12-01 17:28
2006.12.17
DISTINCT + DBLookupComboBox


15-1164613294
Логин
2006-11-27 10:41
2006.12.17
Беспроводная сеть


1-1162540775
wild_arg
2006-11-03 10:59
2006.12.17
Показ неактивного окна


2-1164607610
Lixodei
2006-11-27 09:06
2006.12.17
Как отловить ошибку при добавлени в БД методом Post