Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Меню при нажатии на правую кнопку мыши


Автор: metoflex 16.9.2010, 20:38
У меня создан CTreeCtrl, там есть различные категории и т.п. как мне прописать, чтобы при нажатии на правую кнопку, на одном из элементов древа, мыши возникало контекстное меню (как в винде при нажатии, в проводнике скажем, на правую кнопку мыши). 

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

Огромное Спасибо!

Автор: Earnest 17.9.2010, 08:58
Обрабатывай сообщение WM_CONTEXMENU, в обработчике вызывай функцию TrackPopupMenu

Автор: metoflex 17.9.2010, 09:41
Ок. Помпробую! Спасибо Огромное!)

У меня появилась мысль - каждый раз при активности в окне древа обрабатывать каждое действие (вернее ввод любого символа) через getch(); А потом просто сравнивать его с кодом правой кнопки. Только вот не могу нигде найти ASCII или 16-ти ричный код правой кнопки... Не подскажете?

Автор: Earnest 17.9.2010, 09:50
Какой getch в WinAPI? Какой ASSCII код кнопки мыши?
Кнопка мыши и кнопка клавиатуры генерируют разные события.
И вообще, уже сказано - лови WM_CONTEXTMENU - это сообщение генерируются при нажатии правой кнопки мыши (кроме прочей обработки). И отображать контекстное меню нужно именно по этому событию. Кроме редких специальных случаев, до понимания которых еще надо дожить.

Автор: metoflex 17.9.2010, 10:06
Если можно маленький кусочек кода с примером того, как поймать WM_CONTEXTMENU? Не очень понял суть..

Спасибо Огромное!

Автор: Earnest 17.9.2010, 11:08
Давай-ка читай учебники: как обработчик сообщения к MFC-окну прикрутить и т.д. Похоже, с самого начала.
Вроде в сети были какие-то MFC first steps, если книжек нет.

Автор: metoflex 17.9.2010, 11:36
Код

POINT Cur;
    HWND wnd;
    HINSTANCE first;
    HMENU menu;
    HMENU menupart;

    first=(HINSTANCE)malloc(sizeof(HINSTANCE));
    wnd=(HWND)malloc(sizeof(HWND));


    GetCursorPos(&Cur);

    menu=LoadMenu(first,_T("Вставить"));

    menupart = GetSubMenu(menu, 0);

    TrackPopupMenu(menupart,TPM_LEFTALIGN | TPM_RIGHTBUTTON, Cur.x, Cur.y,0,wnd,NULL);

    DestroyMenu(menu);


Вот прописал появление меню таким образом, а результат-ничего не происходит...

Книги почитаю)
Спасибо за помощь!

Автор: Earnest 17.9.2010, 12:38
Цитата(metoflex @  17.9.2010,  12:36 Найти цитируемый пост)
wnd=(HWND)malloc(sizeof(HWND));

а потом передавать это в TrackPopupMenu - бред. Это должно быть окно, которое будет принимать команды.
Остальное, если это код обработчика WM_CONTEXTMENU, и в ресурсах есть меню "Вставить", а в нем попап, то все вроде нормально.
Если не работает - дебажь.

Автор: metoflex 17.9.2010, 13:30
wnd-это мне надо диалоговое окно создать или сделать ссылку на меню (ктороый создал в ресурсах)?

Автор: alex6077582 17.9.2010, 14:37
В редакторе ресурсов кликаеш правой кнопкой мыши по окну(в котором будет вызывотся меню)
Выбираеш свойства, сообщения, WM_CONTEXTMENU добавить OnContexMenu.
Естественно создаёш меню(в редакторе или динамически)
В созданный обработчик внесем следующий код:
    CMenu cMenu, *pMenu;
    cMenu.LoadMenu(IDR_MENU2);//загрузим меню из ресурсов
                                               //метод GetSubMenu возвращает указатель на, 
                               //в нашем случае, первое выпадающее меню
    pMenu=cMenu.GetSubMenu(0);//возьмем интересующее нас меню
                                             //ну и, непосредственно, покажем это меню
    pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,
                     point.x,point.y,this);


Автор: metoflex 18.9.2010, 20:32
Всё!)) Получилось!) Спасибо огромное!)


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)