Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как заменить много одинаковых popup меню на одно?  (Прочитано 10707 раз)
0 Пользователей и 1 Гость смотрят эту тему.
luckystrike777
Гость
« : 07-04-2010 16:05 » 

Доброго времени суток!

Есть проблема! С ума сойти...

По нажатию правой кнопки мыши выбрасываю меню. В нем 8 пунктов. При наведении на каждый (там маленькая стрелочка нарисована)) из него выпадает сбоку субменю. Эти субменю для каждого из 8 пунктов !одинаковы! снаружи и должны выполнять схожие действия. Я не хочу  копировать 8 одинаковых субменю, это как-то безрадостно, хочу сделать одно. А действия его будут различаться в зависимости от номера родительского пункта (одного из 8)

Как сделать, чтобы это единое, созданное мной субменю, вылетали при наведении курсора на каждый из 8 пунктов?!
Где можно это отследить и как? Не понял Родительское меню создано в конструкторе, Не руками. (VS 2005/ MFC+WINAPI) 

Заранее благодарен! 
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 07-04-2010 16:23 » 

luckystrike777,
1) покажи код, лениво примеры придумывать ))
Записан

luckystrike777
Гость
« Ответ #2 : 07-04-2010 16:48 » 

Код:
CPoint point; 
GetCursorPos(&point);
CRect r; GetWindowRect(&r);
point.x-=r.left; point.y-=r.top;
CMenu Menu,*SubMenu,*SubMenuActive,Menu2,*psMenu2;
Menu.LoadMenu(IDR_ITEMMENU);
Menu.LoadMenuA(IDR_MEN);
SubMenu=Menu.GetSubMenu(0);
psMenu2 = Menu2.GetSubMenu(0);//Загрузка подменю

CPoint point2(pia->ptAction);
if (pia->iSubItem>1) // если щелкнули на колонке канала, то сразу вызываем меню канала
{
    SubMenuActive = SubMenu->GetSubMenu(pia->iSubItem - 2);
}
else
{
    SubMenuActive = SubMenu;
}
ClientToScreen(&point);    //Преобразование координат
 
SubMenuActive->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,AfxGetApp()->m_pMainWnd);
 
Menu.DestroyMenu();           //Уничтожение меню
« Последнее редактирование: 07-04-2010 17:29 от Вад » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 07-04-2010 16:54 » 

ну и где меню, что-то я не увидел. Состав меню - наполнение, не надо из ресурса, делай вручную. Пример поищу щас
Записан

luckystrike777
Гость
« Ответ #4 : 07-04-2010 16:57 » 

Блин, это кривой текст, но не столь важно..
Допустим я делаю его на лету..
Как сделать, чтобы СубСуб меню вылетало?
Записан
luckystrike777
Гость
« Ответ #5 : 07-04-2010 16:58 » 

И кстати, почему не надо из ресурса? Именно поэтому? Все меню тогда будет статическим? Не понял
Записан
luckystrike777
Гость
« Ответ #6 : 07-04-2010 17:07 » 

Вопрос снят!!!! прошу прощения! Нашел ссыль http://forum.codenet.ru/archive/index.php/t-48109.html
вроде если скопировать, то работает...
Однако не понятно, можно ли как-то это заделать с меню из ресурса?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 07-04-2010 17:08 » 

luckystrike777, погодь, пишу примерчик ) А не из ресурса, потому что надо будет свои идентификаторы всё равно вставлять
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 07-04-2010 17:09 » 

luckystrike777, ну да, так и делается, как в ссылке. Пример нужен или больше нет ?

Из ресурса в принципе возможно, но смысла мало - можно массивом пункты перечислить и так
Записан

luckystrike777
Гость
« Ответ #9 : 07-04-2010 17:15 » 

Спасибо, примера больше не надо.
Удалось подключить  СубСубМеню, уже написанное в ресурсе.
Код:
CPoint point; 
GetCursorPos(&point);
CRect r; GetWindowRect(&r);
point.x-=r.left; point.y-=r.top;
CMenu Menu,*SubMenu,*SubMenuActive,Menu2,*psMenu2;
Menu.CreatePopupMenu();
Menu2.LoadMenuA(IDR_MEN); // IDR_MEN уже нарисовано в рес-се
//SubMenu=Menu.GetSubMenu(0);
psMenu2 = Menu2.GetSubMenu(0);//Загрузка подменю

Menu.AppendMenuA(MF_STRING|MF_POPUP,UINT_PTR(psMenu2->GetSafeHmenu()),"Destroy");



ClientToScreen(&point);    //Преобразование координат

Menu.TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,AfxGetApp()->m_pMainWnd);

Menu.DestroyMenu();           //Уничтожение меню
Из сего делаю вывод, что в ресурсе можно делать только субменю самого низкого уровня. Остальные придется писать руками))
« Последнее редактирование: 07-04-2010 17:31 от Вад » Записан
luckystrike777
Гость
« Ответ #10 : 07-04-2010 17:17 » 

Arigato за Хелп!

У меня даже случайно получилось трехуровневое меню))))
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 07-04-2010 17:35 » 

luckystrike777, да хоть 10-этажное ) Главное - идентификаторы команд расставить удобно
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 07-04-2010 17:41 » 

кстати, один вкусный момент есть, иногда сверхудобно:

      
int cmd=SubMenuActive->TrackPopupMenu(TPM_RETURNCMD|TPM_LEFTALIGN|TPM_RIGHTBUTTON|TPM_LEFTBUTTON,point.x,point.y,AfxGetApp()->m_pMainWnd);

//cmd - идентификатор выбранной команды. Если закрыли меню, не выбрав команду, вернётся 0 (поэтому нельзя делать пункт с командой 0)

А TPM_RIGHTBUTTON|TPM_LEFTBUTTON позволит нажимать обеими кнопками - и левой, и правой
« Последнее редактирование: 07-04-2010 17:43 от Алексей1153++ » Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines