Создание контекстного меню и окна свойств
значит MDI- MFC приложение, есть окно представления; (графический редактор); и чтобы в зависимости от места правого щелчка мышью показывались различные меню (предопределённое); каким образом формируются пункты этого меню, различные комбинации, вложения(подменю); каким образом связываются со стандартным меню(чтобы при выборе пункта в контекстном, автоматически отмечался соответственный пункт в осносвном меню); ещё очень интересует возможность создания в таком меню подменю "Свойства", и чтобы после выбора "Свойства", отображалось окно свойств данной фигуры(на которой находится указатель мыши);
Буду невероятно признателен за любую помощь!
Спасибо.
1. загрузить из ресурса или самостоятельно создать объект CMenu;
2. в обработчике правой кнопки мыши для меню вызвать метод CMenu::TrackPopupMenu, передав туда координаты мыши (они уже передаются в обработчике).
Для отображения различных меню в зависимости от места нажатия достаточно загрузить все виды меню и в обработчике определить требуемый объект CMenu.
Статическое меню формируют в редакторе, а если нужно добавить динамические пункты, то надо использовать метод CMenu::InsertMenu(Item), если они зависят от положения мыши, то добавлять элементы в самом обработчике правой кнопки.
Если идентификаторы команд в основном меню совпадают с идентификаторами во всплывающем, то они будут эквивалентны и менятся будут одновременно, это каксается и панели инструментов.
Чтобы отобразить диалог со свойствами объекта, нужно при нажатии мыши запомнить ссылку на него (указатель, идентификатор, или что-то другое, что может вывести на объект), а в обработчике команды "свойства" вызвать диалог, передав ему эту ссылку.
void CLastView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CMenu MenuOne;
MenuOne.LoadMenuW(IDR_MENUPOPUP);
POINT cursor_pos;
::GetCursorPos (&cursor_pos);
MenuOne.GetSubMenu (0)->TrackPopupMenu( nFlags, cursor_pos.x, cursor_pos.y,this);
CView::OnRButtonDown(nFlags, point);
}
нарисовал меню, всё работает; но как там поступить с окном свойств..? У меня уже это меню выскакивает как меню фигуры, тоесть допустим что MenuOne вызывается ТОЛЬКО тогда, когда мы кликнули на фигуре. В этом меню есть пункт Options. Должно появиться окошко, там можно будет менять толщину линий данной фигуры, её цвет, ..., будет кнопка "применить". Можно поподробнее о процессе создания такого окошка (формы, диалога), и о том, какие функции при выборе Options должны его вызывать; как инициализируется объект этого окна... тоесть, всё, чтобы эта штука работала! Не сочтите за издевательство, пожалуйста, неукого спросить,.. да что уж тут, больше некогда, а не неукого... Огромное спасибо тому, кто откликнется!
у каждого пункта меню (и контекстного, и главного) есть идентификатор команды, который с ним асоциирован. таким образом ты можешь в приложении повесить обработчик на соответствующую команду своего элемента меню.
допустим у меня:
CDialog DialogOne(IDD_DIALOG1);
выполнена комманда DialogOne.DoModal ();
а в ресурсах я запроектировал допустим ячейку IDC_EDIT1, это EditControl; каким образом объект связан с этой ячейкой; как объекту в неё что-нибудь записать/прочитать?
нет немного посидел, создал класс для конкретно этого диалога, понемногу разбираюсь, уже не так всё дико.
Я создал класс Диалога, вручную ничего не писал - там вижла(vs2005) всё сама сделала. Я только добавил необходимые переменные в этот класс. Только вот обработчики событий - нажатий кнопок на форме совсем не хотят обрабатываться в C*View. Мне, кстати, тоже создаёт их вижла, я выбираю клас C*View, и вправду - там появляются функции-обработчики этих кнопок, даже всё заносится в MessagesMap! НО! эти функции так и не вызываются никогда! потом делаю по-другому: создаю ещё кнопку, её уже для обработки в созданном классе MyDialog, и там управление передаётся нормально!!? Так в чём причина, если я проделываю одни и те же действия, но для разных классв, а функция не вызывается.. зачем тогда предусмотрено это?
почитай про обработку сообщений в WinAPI