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


Автор: BFS 24.10.2007, 10:44
Подскажите, как сделать контекстное меню, в VC++, желательно в 8-ом (VisualStudio 2005);
значит MDI- MFC приложение, есть окно представления; (графический редактор); и чтобы в зависимости от места правого щелчка мышью показывались различные меню (предопределённое); каким образом формируются пункты этого меню, различные комбинации, вложения(подменю); каким образом связываются со стандартным меню(чтобы при выборе пункта в контекстном, автоматически отмечался соответственный пункт в осносвном меню); ещё очень интересует возможность создания в таком меню подменю "Свойства", и чтобы после выбора "Свойства", отображалось окно свойств данной фигуры(на которой находится указатель мыши);

Буду невероятно признателен за любую помощь!
Спасибо.

Автор: zkv 24.10.2007, 11:05
поиск не работает? А внизу ссылки "А здесь смотрели?" для кого?
Цитата(BFS @  24.10.2007,  10:44 Найти цитируемый пост)
и чтобы в зависимости от места правого щелчка мышью показывались различные меню (предопределённое);

WM_CONTEXTMENU или WM_RBUTTONUP изучай
Цитата(BFS @  24.10.2007,  10:44 Найти цитируемый пост)
каким образом формируются пункты этого меню, различные комбинации, вложения(подменю);

можно рисовать в редакторе ресурсов, потом выбирать нужное, можно формировать динамически - изучай CMenu
Цитата(BFS @  24.10.2007,  10:44 Найти цитируемый пост)
каким образом связываются со стандартным меню(чтобы при выборе пункта в контекстном, автоматически отмечался соответственный пункт в осносвном меню); 

пункты меню с одинаковыми ID работают как один, те все изменения одного автоматически отображаются на другом, каждому ID соответствовать один обработчик должен, независимо в скольких менюшках он используется
Цитата(BFS @  24.10.2007,  10:44 Найти цитируемый пост)
ещё очень интересует возможность создания в таком меню подменю "Свойства", и чтобы после выбора "Свойства", отображалось окно свойств данной фигуры(на которой находится указатель мыши);

это своими силами: рисуешь диалог, при клике вычисляешь в какую фигуру попали, загружаешь данные в диалог, думодалишь, применяешь изменения.

Автор: BFS 25.10.2007, 16:22
добавил такую функцию:

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 должны его вызывать; как инициализируется объект этого окна... тоесть, всё, чтобы эта штука работала! Не сочтите за издевательство, пожалуйста, неукого спросить,.. да что уж тут, больше некогда, а не неукого... Огромное спасибо тому, кто откликнется!

Автор: Earnest 25.10.2007, 17:12
Контектсное меню кошернее показывать не по WM_RBUTTONDOWN, а по WM_CONTEXTMENU.

Что касается окна свойств, можно придумать массу вариантов. Например, такой:

- перед отображением контекстного меню находим и запоминаем в переменной класса CLastView тыкнутый объект.
- предполагается, что в контекстном меню присутствует пункт Options с ид-ром ID_OBJECT_OPTIONS
- в карту CLastView добавляем обработчик команды ID_OBJECT_OPTIONS, который анализирует тип запомненного объекта и вызывает соответствующий диалог; 
- диалоги, естественно, должны быть прописаны заранее. Лучше, если все они будут наследниками базового класса, скажем, CObjPropDlg, и все объекты тоже составляют иерархию с базовым классом CMyObj. Базовый диалог принимает в качестве параметра ссылку или указатель на базовый объект; конкретный диалог должен быть в курсе, как выбранные в нем параметры к этому объекту применить.

Автор: BFS 26.10.2007, 04:26
Ещё один вопрос назрел по этой теме:
  Я создал класс Диалога, вручную ничего не писал - там вижла(vs2005) всё сама сделала. Я только добавил необходимые переменные в этот класс. Только вот обработчики событий - нажатий кнопок на форме совсем не хотят обрабатываться в C*View. Мне, кстати, тоже создаёт их вижла, я выбираю клас C*View, и вправду - там появляются функции-обработчики этих кнопок, даже всё заносится в MessagesMap! НО! эти функции так и не вызываются никогда! потом делаю по-другому: создаю ещё кнопку, её уже для обработки в созданном классе MyDialog, и там управление передаётся нормально!!? Так в чём причина, если я проделываю одни и те же действия, но для разных классв, а функция не вызывается.. зачем тогда предусмотрено это?

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