Форум: "WinAPI";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
ВнизКонтекстное меню Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.032 c