![]() |
|
|
![]()
|
|
| decembrist |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 1.4.2004 Репутация: нет Всего: нет |
Как динамически создавать пункты главного меню?
Кто знает, поделитесь опытом |
|||
|
||||
| Любитель |
|
|||
|
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 7 Всего: 92 |
1. Создаём объект класса CMenu (в контексте класса окна, куда надо приаттачить меню).
2. Пользуемся методом ApendMenu. 3. Для добавления подменю, создаём для него объект (локально) и затем ставим в AppendMenu флаг MF_POPUP, а в качестве ID задаём хендл нашей менюхи. 4. Вызываем SetMenu для окна, к которому приделываем меню. 5 .Всё. ЗЫ. Могу прислать пример динамической загрузки меню из реестра (просто относительно недавно сам такое делал). |
|||
|
||||
| decembrist |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 1.4.2004 Репутация: нет Всего: нет |
да примерчик нужен очень
пожалуйста. Добавлено @ 20:04 у меня диалог(Dialog Application), к которому я прицепил меню и мне нужно к определенным пунктам цеплять динамически созданные подпункты |
|||
|
||||
| tigger |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 456 Регистрация: 30.4.2005 Репутация: 3 Всего: 4 |
Лови пример по динамическому созданию меню и добавлению в пункт "импортировать" подменю.
Надеюсь это то что нужно!!! Присоединённый файл ( Кол-во скачиваний: 25 )
0101.zip 31,88 Kb |
|||
|
||||
| decembrist |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 1.4.2004 Репутация: нет Всего: нет |
Спасибочки большое
Щас посмотрю |
|||
|
||||
| decembrist |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 1.4.2004 Репутация: нет Всего: нет |
Вопрос: по какому принципу описываются пункты меню в файле ресурсов?
Это добавляется вручную? А если я заранее не знаю количество айтемов в сабменю? |
|||
|
||||
| Denn |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 6.8.2005 Репутация: 1 Всего: 2 |
просто числовые идентификаторы. генерятся визардом если делать в нем.
да, если делаешь меню руками. |
||||
|
|||||
| tigger |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 456 Регистрация: 30.4.2005 Репутация: 3 Всего: 4 |
Да это добавляется вручную.
Если заранее не известно количество пунктов в подменю то вместо:
используй:
|
||||
|
|||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
decembrist
Блин, ну есть же целая тема!!!!!!!! Когда поиском начнем пользоваться!!!???????????? Я кому выкладываю?????
-------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| tigger |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 456 Регистрация: 30.4.2005 Репутация: 3 Всего: 4 |
Или еще динамичней чем предыдущий пример
в котором нет предела совершенству:
Единственное что прийдется еще сделать так это прописать события при выборе на пунктов меню... |
|||
|
||||
| decembrist |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 238 Регистрация: 1.4.2004 Репутация: нет Всего: нет |
Вот-вот, события....Меню у меня создалось! Ура!
Как теперь к пункту меню прицепить событие, если созданы подпункты по последнему принципу с помощью цикла? |
|||
|
||||
| tigger |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 456 Регистрация: 30.4.2005 Репутация: 3 Всего: 4 |
Единственное что могу предложить так это заранее продумать что должно будет делаться при выборе пунктов меню и прописать события:
в секции файл (....cpp) BEGIN_MESSAGE_MAP(CMainFrm, CDialog) добавить ON_COMMAND(5000, OnKill) ON_COMMAND(5001, OnKill1) ---------------------------------- ON_COMMAND(5010, OnKill10) а в файле (.....h) afx_msg void OnKill(); afx_msg void OnKill1(); --------------------------------- afx_msg void OnKill10(); Ну вот пожалуй и все. |
|||
|
||||
| Earnest |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Какая уж тут динамика... Чтобы сделать "совсем" динамически, нужно следующее: 1) Структура, что-то типа
2) Где-нибудь объявить реестр (список, массив, etc) таких структур. Как ты их будешь набивать - дело твое, вариантов много. 3) При инициализации создать динамически меню по этому реестру - ну, это как уже показывали. 4) Обработка: переопределить виртуальную функцию OnCmdMsg у того объекта, который будет динамически обрабатывать команды. Примерно так:
Это самая примитивная схема. Недостаток - нужно следить, чтобы в команде m_OnCommand и m_OnUpdate соответствовали объекту, для которого их будут вызывать. Можно пойти дальше, и вместо того, чтобы хранить в команде указатели на обработчики, сделать Execute и Update виртуальными, и добавить им еще один параметр - CCmdTarget - и пусть делают что хотят. Тогда можно использовать один и тот же реестр комманд и для документа, и для вида. Таким образом, обработку команд можно вообще отделить от документа/вида. -------------------- ... |
||||||
|
|||||||
| JoyEx |
|
|||
|
Дядя ![]() ![]() Профиль Группа: Участник Сообщений: 323 Регистрация: 21.6.2005 Где: Москва, РФ Репутация: 5 Всего: 12 |
Избегайте ID < 0x100, выбирайте ID меню в диапазоне 256 - 64Кб
-------------------- Если ты уже никого не боишься, значит ты самый страшный |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |