Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Контекстное меню [D7]


BRemB ©   (2004-09-09 13:38:00) 

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


BRemB   (2004-09-10 09:11:00) [1]

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


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

Спасибо!!!


DVM   (2004-09-09 15:15:00) [3]


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

WM_COMMAND


BRemB   (2004-09-09 15:06:00) [4]

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


BRemB   (2004-09-09 14:49:00) [5]

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


BRemB   (2004-09-09 14:40:00) [6]

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


DVM   (2004-09-09 14:28:00) [7]

BOOL TrackPopupMenu(      

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


BRemB   (2004-09-09 14:23:00) [8]

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

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:09:00) [9]


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

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


BRemB   (2004-09-09 14:04:00) [10]


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

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


DVM   (2004-09-09 14:02:00) [11]


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

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


DVM   (2004-09-09 14:01:00) [12]


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

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


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


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

Вот именно, что меню ни прикреплено ни к какому окну, я его вызываю сам, т.е.
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 13:47:00) [14]


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

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

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

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


BRemB   (2004-09-09 13:42:00) [15]

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


DVM   (2004-09-09 13:39:00) [16]

WM_EXITMENULOOP


Наверх

Титульная страница Поиск, карта сайта Написать письмо