Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.49 MB
Время: 0.039 c
8-1090041633
ИМХО
2004-07-17 09:20
2004.10.10
Список аудиокодеков


1-1096203831
SeriousSam
2004-09-26 17:03
2004.10.10
Создание произвольного кол-ва объектов.


4-1094488155
Fon
2004-09-06 20:29
2004.10.10
Фон Edit-a


1-1096113812
cv
2004-09-25 16:03
2004.10.10
keypres


14-1095839538
vidiv
2004-09-22 11:52
2004.10.10
Creative SB под Win2kServer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский