![]() |
|
|
![]()
|
|
| SAVe |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 15.10.2007 Репутация: нет Всего: нет |
Здравствуйте !
Есть три проблемы с менюхами. Первая : Есть SDI приложение которое содержит 2 View разделённые сплиттером. Пункты меню Edit,Copy... и т.д. изначально неактивны т.к. нет обработчиков для них. Добавил для пунктов меню обработчики (в CMainFrame). Пункты меню становятся активными только при переходе на View 1. При переходе на View 2 автоматом дизаблятся. Как сделать наоборот , что бы они были активны на View 1 и неактивны на View 2. Вторая: Есть класс наследник от CEdit. В стандартном CEdit есть всплывающее меню (Edit,Copy,Undo... ). Как его плучить (или заменить)? Нужно изменить названия пунктов меню. Третья: Есть класс наследник от CRichEdit и там нет всплывающего меню (Edit,Copy,Undo... ). Как приделать ? Заранее спасибо за ответы. |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
1) Напиши обработчики не в MfinFrame, а на View2 - короче там, где они должны активизироваться.
Или сам проверяй в существующих (в MainFrame) обработчиках, какой вью активен. Для этого придется написать также код OnUpdate. 2) Сделай свое меню и показывай его на WM_CONTEXTMENU. 3) Аналогично. -------------------- ... |
|||
|
||||
| SAVe |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 15.10.2007 Репутация: нет Всего: нет |
1. Пробовал писать обработчики в View2. Активизируется почему то только первый пункт меню (Undo). В карте сообщений они все одинаково записаны.
По какому принципу происходит активация и как на это повлиять? |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Активизация происходит так:
Перед появлением меню главному окну (т.е. владельцу меню) посылается сообщение WM_INITMENUPOPUP. В обработчике этого сообщения для каждого пункта делается вызов OnCmdMsg сначала с кодом CN_UPDATE_COMMAND_UI, а потом просто COMMAND, но со спец. параметрами. Вызов проходит по всей цепочки диспетчеризации команд (т.е. сначала активному виду, потом документу и т.д.). Цель этого дела - найти обработчик обновления команды (OnUpdate) или просто обработчик (OnCommand). Если ничего не нашли, то пункт меню засеривается. Очень поучительно поставить точку прерывания в OnInitMenuPopup главного окна и пройти по цепочке. Тогда поймешь, почему обработчики не находятся (или какие находятся). -------------------- ... |
|||
|
||||
| SAVe |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 15.10.2007 Репутация: нет Всего: нет |
Сделал всё как советует Earnest. Всё заработало. Большое спасибо.
Первая проблема решилась добавлением в View2 обработчиков COMMAND и UPDATE_COMMAND_UI ( для UPDATE_COMMAND_UI просто пустых, без всякого функционала) Для 2 и 3 обработал WM_INITMENUPOPUP. Только меню пришлось вручную создавать (CreatePopupMenu() ,AppendMenu()...) т.к. мой контрольчик содержится в lib библиотеке , а при линковке используются ресурсы ехе файла. Т.е. мой контрол ресурсов не видит. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |