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


Автор: NiJazz 21.1.2005, 16:24
Как в VC++ создать сабж на форме?

Автор: alien_by 21.1.2005, 17:27
В редакторе ресурсов создаёшь ресурс меню. Наполняешь его (там всё просто).

Затем есть два способа.
Если тебе нужно основное меню... Тогда просто в свойствах диалога находишь свойство Menu и выбираешь там ИД ресурса того меню, которое ты только что создал.

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

Код

       // Загружаем меню...
       // конечно лучше его загрузить где нибудь один раз, но для примера сойдёт
CMenu menu;
menu.LoadMenu(IDR_MENU1);

       // Получаем первое подменю
       // Попытаюсь обьяснить что тут происходит после примера
CMenu* pSubMenu = menu.GetSubMenu(0);

       // Показываем меню...
pSubMenu->TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x, point.y, this);


Вообщем там происходит следующее. В редакторе ресурсов ты редактишь горизонтальную и вертикальную линейки меню, горизонтальная линейка это не совсем то smile (Хотя если у всех её элементов установить свойство popup в false, то можно использовать в качестве всплывающего меню и её...)
А вот вертикальное меню - это то... smile Так вот данная функция выделяет вертикальное подменю, для того, чтобы его показать.

В принципе можно создавать меню динамически, тогда
Код

        // Создаём меню
CMenu menu;
menu.CreatePopupMenu();

        // Добавляем элемент(ы)
menu.AppendMenu(MF_STRING, ID_APP_EXIT, (LPCTSTR)"E&xit");

       // Исполняем
menu.TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x, point.y, this);


Опять же хочу оговорится, что лучше создате меню один раз (где нибудь в конструкторе или Dialog::Create) ну а в обработчике только исполнять.

И ещё, не смотря на то, что мы указываем окно диалога в качестве родительского для меню, оно может отображаться не там где надо smile Поэтому может понадобится использовать функции типа GetWindowRect для расчёта правильных координат.

Автор: Gazon 22.1.2005, 06:39
http://lib.training.ru/Lib/ArticleDetail.aspx?ar=2255&l=n&mi=842&mic=851

Автор: IEZ 11.2.2005, 01:39
Цитата(alien_by @ 21.1.2005, 17:27)
// Создаём меню
CMenu menu;
menu.CreatePopupMenu();

        // Добавляем элемент(ы)
menu.AppendMenu(MF_STRING, ID_APP_EXIT, (LPCTSTR)"E&xit");

      // Исполняем
menu.TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x, point.y, this);

На практике этот способ более удобен. smile

Автор: The Thing 18.3.2005, 20:50
А в VC6 в редакторе ресурсов.. создал меню, пр. кл. м. по нему..
есть такая опция как View As Popup
и менюшка уже является Popup

Код

CMenu menu;
menu.LoadMenu(IDR_MENU1);

menu.TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x, point.y, this);


не проходит..



Автор: The Thing 19.3.2005, 18:54
народ? кто может объяснить как сделать?..

Автор: IEZ 21.3.2005, 11:34
The Thing В чем проблема? Напиши.

Автор: Nuzur 23.3.2005, 19:15
Цитата(The @ 18.3.2005, 20:50)
А в VC6 в редакторе ресурсов.. создал меню, пр. кл. м. по нему..
есть такая опция как View As Popup
и менюшка уже является Popup

Код

CMenu menu;
menu.LoadMenu(IDR_MENU1);

menu.TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON, point.x, point.y, this);


не проходит..

Ты ведь забыл

// Получаем первое подменю
// Попытаюсь обьяснить что тут происходит после примера
CMenu* pSubMenu = menu.GetSubMenu(0);

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