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

Вниз

Контекстное меню   Найти похожие ветки 

 
BRemB   (2004-09-09 13:38) [0]

У меня такой вопрос, можно ли вообще отловить момент закрытия контекстного меню, а если можно, то как? Это меню у меня ни к какому объекту на форме не привязано, я его вызываю сам.


 
DVM ©   (2004-09-09 13:39) [1]

WM_EXITMENULOOP


 
BRemB   (2004-09-09 13:42) [2]

И как мне его использовать, т.е. мне что надо писать свою оконную процедуру для этого меню, а для меню вообще можно написать оконную процедуру, оно является окном?


 
DVM ©   (2004-09-09 13:47) [3]


> И как мне его использовать, т.е. мне что надо писать свою
> оконную процедуру для этого меню

Это сообщение будет приходить тому окну от которого меню.
Обрабатывать обычным образом.

> а для меню вообще можно написать оконную процедуру, оно
> является окном?

Окном оно является, но очень необычным. Заменить оконную процедуру меню нельзя.


 
BRemB   (2004-09-09 13:56) [4]


> Это сообщение будет приходить тому окну от которого меню.

Вот именно, что меню ни прикреплено ни к какому окну, я его вызываю сам, т.е.
PopUpMnu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);

Попробовал сейчас обработать это сообщение того окна от которого оно вызывается, но ниче не получилось. Короче код у меня такой:

function _WndProcMap(WND: HWND; Msg: Integer; wParam, lParam: Longint): Longint; stdcall;
begin
Result:=0;
case Msg of
 WM_RBUTTONDOWN : begin
                    //Здесь вызывается мое меню
                    frmMain.pupMnMainMap.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
                    Result:=1;
                  end;
else result := CallWindowProc(OldMapWndProc, WND, Msg, wParam, lParam);
end;
end;


Дело в том, что я использую готовый компонент и там зашито свое меню, а мне надо его переделать. И в этом компоненте нет такого свойства как PopupMenu.


 
DVM ©   (2004-09-09 14:01) [5]


> Вот именно, что меню ни прикреплено ни к какому окну, я
> его вызываю сам, т.е.
> PopUpMnu.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);

Сообщение будет приходить "главному" окну. Возьми SPY++ и погляди какому из окон твоей програмы оно приходит.


 
DVM ©   (2004-09-09 14:02) [6]


> Попробовал сейчас обработать это сообщение того окна от
> которого оно вызывается, но ниче не получилось. Короче код
> у меня такой:

Правильнее не WM_RBUTTONDOWN, а WM_CONTEXTMENU


 
BRemB   (2004-09-09 14:04) [7]


> Правильнее не WM_RBUTTONDOWN, а WM_CONTEXTMENU

Я не здесь обрабатываю это сообщение, вообще это пример вызова меню, показывающий, что он не прикреплен ни к какому окну


 
DVM ©   (2004-09-09 14:09) [8]


> показывающий, что он не прикреплен ни к какому окну

Сообщения о выборе пункта меню все равно будут приходить какому-то окну. Вот оно и есть то.


 
BRemB   (2004-09-09 14:23) [9]

Т.е. как я понимаю из какого окна вызывается меню, к тому оно и прикреплено? Тогда если это так, то почему когда я пишу следующий код

function _WndProcMap(WND: HWND; Msg: Integer; wParam, lParam: Longint): Longint; stdcall;
begin
Result:=0;
case Msg of
WM_RBUTTONDOWN : begin
                   //Здесь вызывается мое меню
                   frmMain.pupMnMainMap.Popup(Mouse.CursorPos.X, Mouse.CursorPos.Y);
                   Result:=1;
                 end;
WM_EXITMENULOOP : begin
                    //Здесь делаю что-то
                  end;
else result := CallWindowProc(OldMapWndProc, WND, Msg, wParam, lParam);
end;
end;

данная оконная процедура не обрабатывает сообщение WM_EXITMENULOOP при закрытии меню?


 
DVM ©   (2004-09-09 14:28) [10]

BOOL TrackPopupMenu(      

   HMENU hMenu,
   UINT uFlags,
   int x,
   int y,
   int nReserved,
   HWND hWnd,
   HWND prcRect
);
Меню всегда показывается этой функцией и hWnd - ВОТ ЭТО ОКНО


 
BRemB   (2004-09-09 14:40) [11]

Это все понятно, не понятно то, кто является хозяином меню. У меня MDI приложение, дочерние окна формируются динамичсеки, на них я выставляю компонент (тоже динамически), оконную процедуру которого я заменяю написанной выше. В это оконной процедуре я заменяю стандартное меню компонента своим. Хотя при проектировании главного родительского окна я выставляю на него меню. Так дескриптор какого окна присутствует в функции TrackPopupMenu? Пробовал Spy++ ставить и на родительское окно, и на дочернее, и на компонент, но ничего не получается.


 
BRemB   (2004-09-09 14:49) [12]

Все я решил вопрос, я вызываю меню функцией
TrackPopupMenuEx(frmMain.pupMnMainMap.Handle,0,Mouse.CursorPos.X, Mouse.CursorPos.Y,{HWND моего компонента},nil);
Потом в оконной процедуре обрабатываю сообщение WM_EXITMENULOOP при закрытии меню. Все работат!


 
BRemB   (2004-09-09 15:06) [13]

А еще такой вопрос, какое сообщение посылается окну, когда происходит нажатие на выбранном пункте меню?


 
DVM ©   (2004-09-09 15:15) [14]


> А еще такой вопрос, какое сообщение посылается окну, когда
> происходит нажатие на выбранном пункте меню?

WM_COMMAND


 
BRemB   (2004-09-09 15:39) [15]

Спасибо!!!


 
BRemB   (2004-09-10 09:11) [16]

Как мне определить порядковый номер выбранного пункта меню или хотябы текс?



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

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

Наверх




Память: 0.51 MB
Время: 0.056 c
1-1096275024
Aleksandr.
2004-09-27 12:50
2004.10.10
Можно ли как-то оптимизировать этот код (для скорострельности)?


6-1091435529
Alex_2004
2004-08-02 12:32
2004.10.10
Сетевое имя компьютера


3-1094984552
Morrison
2004-09-12 14:22
2004.10.10
Cannot focuse a disabled or invisible window


3-1094896062
Гаврила
2004-09-11 13:47
2004.10.10
SQL-DMO ->AV


1-1096271454
Vova
2004-09-27 11:50
2004.10.10
Помогите подщитать количество пикселей в рисунке