Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Создание контекстного меню и окна свойств

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

Буду невероятно признателен за любую помощь!
Спасибо.
505
24 октября 2007 года
vAC
343 / / 28.02.2006
Для отображения контекстного меню надо:
1. загрузить из ресурса или самостоятельно создать объект CMenu;
2. в обработчике правой кнопки мыши для меню вызвать метод CMenu::TrackPopupMenu, передав туда координаты мыши (они уже передаются в обработчике).

Для отображения различных меню в зависимости от места нажатия достаточно загрузить все виды меню и в обработчике определить требуемый объект CMenu.
Статическое меню формируют в редакторе, а если нужно добавить динамические пункты, то надо использовать метод CMenu::InsertMenu(Item), если они зависят от положения мыши, то добавлять элементы в самом обработчике правой кнопки.
Если идентификаторы команд в основном меню совпадают с идентификаторами во всплывающем, то они будут эквивалентны и менятся будут одновременно, это каксается и панели инструментов.
Чтобы отобразить диалог со свойствами объекта, нужно при нажатии мыши запомнить ссылку на него (указатель, идентификатор, или что-то другое, что может вывести на объект), а в обработчике команды "свойства" вызвать диалог, передав ему эту ссылку.
14K
25 октября 2007 года
BFS
34 / / 11.04.2007
добавил такую функцию:

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 должны его вызывать; как инициализируется объект этого окна... тоесть, всё, чтобы эта штука работала! Не сочтите за издевательство, пожалуйста, неукого спросить,.. да что уж тут, больше некогда, а не неукого... Огромное спасибо тому, кто откликнется!
355
26 октября 2007 года
<SCORP>
786 / / 21.10.2006
у каждого пункта меню (и контекстного, и главного) есть идентификатор команды, который с ним асоциирован. таким образом ты можешь в приложении повесить обработчик на соответствующую команду своего элемента меню.
14K
26 октября 2007 года
BFS
34 / / 11.04.2007
А каким образом осуществляется связь объекта диалога с его полями?
допустим у меня:

CDialog DialogOne(IDD_DIALOG1);

выполнена комманда DialogOne.DoModal ();

а в ресурсах я запроектировал допустим ячейку IDC_EDIT1, это EditControl; каким образом объект связан с этой ячейкой; как объекту в неё что-нибудь записать/прочитать?
14K
26 октября 2007 года
BFS
34 / / 11.04.2007
нет немного посидел, создал класс для конкретно этого диалога, понемногу разбираюсь, уже не так всё дико.
14K
26 октября 2007 года
BFS
34 / / 11.04.2007
Ещё один вопрос назрел по этой теме:
Я создал класс Диалога, вручную ничего не писал - там вижла(vs2005) всё сама сделала. Я только добавил необходимые переменные в этот класс. Только вот обработчики событий - нажатий кнопок на форме совсем не хотят обрабатываться в C*View. Мне, кстати, тоже создаёт их вижла, я выбираю клас C*View, и вправду - там появляются функции-обработчики этих кнопок, даже всё заносится в MessagesMap! НО! эти функции так и не вызываются никогда! потом делаю по-другому: создаю ещё кнопку, её уже для обработки в созданном классе MyDialog, и там управление передаётся нормально!!? Так в чём причина, если я проделываю одни и те же действия, но для разных классв, а функция не вызывается.. зачем тогда предусмотрено это?
355
27 октября 2007 года
<SCORP>
786 / / 21.10.2006
кнопка у тебя лежит на диалоге. вот и обрабатывается она, соответственно, классом диалога.
почитай про обработку сообщений в WinAPI
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог