Сегодня мы разсмотрим как создается меню и панели инструментов в mfc. Я главу прочитал в которой было описано как это делается и решил написать статью-шпору, что б было куда подсмотреть если вдруг понадобится.
И так приступим, запускаем visual studio 2010 и выбираем Файл->Создать->Проектпоявится окошко создать меню
выбираем mfc и приложение mfc, вводим имя menu и нажимаем кнопку ok и мы попадаем в мастер приложений MFC
нажимаем далее и мы попадаем на вкладку тип приложения
Здесь можно выбрать какое тип приложения мы хотим создать: одно документное или несколько документное или на основании диалогового окна. На основании диалогового окна — это самый простой тип приложения считается. Мы выбрали несколько документный, это не сильно важно, можно б выбрать и одноднодокументный. В общем делаем настройки такие как на скрине выше и нажимаем далее, я нихо за все настройки говорить, потому что ну очень много нужно расказать за каждую настройку, будем пологать что вы уже знаете их и лучше поэкспериментировать сними
После нажатия на кнопку далее мы попадаем на вкладку Поддержка составных документов
здесь ничего не меняем и ждем Далее, переходим к пункту свойство шаблона документа
здесь вводим расширение файла men и жмем далее без точки и мы попадаем в окошко Поддержка баз данных
ничего не изменяем, жмем далее, попадаем в свойства интерфейса пользователя
ничего не меняем жмем далее, попадем в дополнительные параметры
так же ничего не меняем, жмем далее и попадаем в созданные классы
нажимаем готово и у нас создался шаблон пустой mfc приложения.
Нажимаем CTL+F5 и получаем программу что создал мастер mfcМастер MFC создал стандартные пункты меню, и всякую хрень, а мы сейчас добавим к этим стандартным пунктам меню свои два пункта Element иColor , заходим в Окно ресурсов клацаем по папке Menu выбираем из списка IDR_menuTYPE и по нему два раза кликаем мышкой и мы попадаем в визуальный редактор, где можно редактировать меню
кликаем мышкой по текстовому полю в котром написано прототип для текста и вводим E&element и C&olor значек амперсанда означает что буква e и о будут активны при выборе пунктов меню. Вводим также подпункт для пункта меню элемент &Line, &Rectangle, &Circle, C&urve , а для Color подпункты &Black, &Red, &Green, B&lue.
Все менюшку мы создали, компилируем программу Ctl+F5
Как видно пункты меню не активны так как мы не добавили функции-обработчики событий для этих элементов. Добавим функции обработчики событий для каждого элемента, для этого в редакторе меню ресурсов кликнем правой клавишей мыши над пунктом Line и в раскрывшемся контекстном меню выберем пункт Добавить обработчик событий
и мы попадаем в мастер обработчика событий
здесь тип сообщения COMMAND, имя функции само сгенерировалось, мы можем его изменить, и выбираем класс к которому будет добавленя функция-обработчик события, я выбрал класс СmenuDoc. Нажимаем кнопку Добавить/править и мы переносимся в созданную функцию OnElementLine, создадим такие функции обработчики для все остальных пунктов меню. У вас должно появится в файле menuDoc.cpp 8 новых функций. Добавим в функцию OnElementLine код:
1 2 3 4 |
void CmenuDoc::OnElementLine() { AfxMessageBox(_T("Line")); } |
и скомпилируем программу Ctl+F5 и у нас уже активны пункты меню кликнем по пункту Line и у нас вызовется функция AfxMessageBox();
по другим пунктам меню когда мы нажимаем у нас ничего не происходит, так как функции обработчик событий этих пунктов меню пустые, мы специально добавили только в одну функцию обработчик, что б было понятно что вызываются функции.
Создадим заголовочный файл ConstantsMenu.h и добавим в него следующий код:
1 2 3 4 5 6 7 8 9 10 11 |
//глобальные переменные #pragma once //перечисление enum ElementType{LINE,RECTANGLE,CIRCLE,CUVE}; //константы const COLORREF BLACK=RGB(0,0,0); const COLORREF RED=RGB(255,0,0); const COLORREF GREEN=RGB(0,255,0); const COLORREF BLUE=RGB(0,0,255); |
и подключаем этот файл в файле menu.h
это перечисление ElementType для пунктов меню Element и константы цветов для пунктов меню Color. Добавим в класс CmenuDoc две переменные ElementType elementType и COLORREF color. в окне классов кликаем правой клавишей мышки над классом CmenuDoc и в контекстном меню выбираем Добавить->Добавить переменную и у вас появится окошко мастера добавления переменной
Заполняем поля данными и нажимаем Готово, так же добавляем переменную color. Все переменные добавлены в класс CmenuDoc, можете даже проверить в заголовочном файле
Дальше нужно в каждую функцию обработчик событий добавить следующий код для обработчиков пунктов меню Element вставить elelentType=LINE, elementType=RECTANGLE, elementType=CIRCLE, elementType=CURVE в каждый обработчик по записи, что б при вызове обработчика для пункта Rectangle elementType имел бы значение RECTANGLE и т.д. Ну и для цветов добавляем в обработчики следующие строки соответственно color=BLACK, color=RED, color=GREEN, color=BLUE
код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
void CmenuDoc::OnElementLine() { elementType=LINE; } void CmenuDoc::OnElementRectangle() { elementType=RECTANGLE; } void CmenuDoc::OnElementCircle() { elementType=CIRCLE; } void CmenuDoc::OnElementCurve() { elementType=CURVE; } void CmenuDoc::OnColorBlack() { color=BLACK; } void CmenuDoc::OnColorRed() { color=RED; } void CmenuDoc::OnColorGreen() { color=GREEN; } void CmenuDoc::OnColorBlue() { color=BLUE; } |
и так после того как мы добавили обработчики давайте добавим обработчики которые будут обновлять пункты меню и будут ставить галочки напротив выбранного пункта снова выбираем обработчик событийпопадаем в мастер создания события
только здесь уже для класса CmenuDoc создаем обработчики события типа UPDATE_COMMAND_UI, нажимаем кнопку Добавить/править и мы переносимся в этот же обработчик и такие обработчики создаем для все 8 пунктов новых меню 4 для Element и 4 для Color
Дальше в эти обработчики нужно добавить код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
void CmenuDoc::OnUpdateElementLine(CCmdUI *pCmdUI) { pCmdUI->SetCheck(elementType==LINE); } void CmenuDoc::OnUpdateElementRectangle(CCmdUI *pCmdUI) { pCmdUI->SetCheck(elementType==RECTANGLE); } void CmenuDoc::OnUpdateElementCircle(CCmdUI *pCmdUI) { pCmdUI->SetCheck(elementType==CIRCLE); } void CmenuDoc::OnUpdateElementCurve(CCmdUI *pCmdUI) { pCmdUI->SetCheck(elementType==CURVE); } void CmenuDoc::OnUpdateColorBlack(CCmdUI *pCmdUI) { pCmdUI->SetCheck(color==BLACK); } void CmenuDoc::OnUpdateColorRed(CCmdUI *pCmdUI) { pCmdUI->SetCheck(color==RED); } void CmenuDoc::OnUpdateColorGreen(CCmdUI *pCmdUI) { pCmdUI->SetCheck(color==GREEN); } void CmenuDoc::OnUpdateColorBlue(CCmdUI *pCmdUI) { pCmdUI->SetCheck(color==BLUE); } |
Нам так же нужно сделать инициализацию переменных elementType и color в конструкторе класса CmenuDoc
1 2 3 4 5 6 7 |
CmenuDoc::CmenuDoc() :elementType(LINE) ,color(BLACK) { // TODO: добавьте код для одноразового вызова конструктора } |
Компилируем программу и проверяем что у нас получилось!
И от какая программа у нас получиласьнапротив выбранного пункта меню появляются галочки. Нам осталось создать теперь панель инструментов и так приступим, заходим в окно ресурсов, выбираем папку Toolbar и пункт IDR_MAINFRAME_256 кликаем по нему два раза мышкой и мы попадаем в окно для создания панели инструментов
Тут уже в редакторе перемещаем кнопку на половину вправо, что б получился отступ
и рисуем линию в самой рабочей области и айди меняем на уже существующий айди для пункта меню
Все такие действия проделываем для всех остальных 7 кнопок соответствующих пунктам меню Element и Color. У вас должна получиться такая от панелька
все компилируем и смотрим что у нас получилось. У нас получилась программка в которой есть панель инструментов и в которой при нажатии на кнопке панели инструментов меняется и пункт меню и они оба выделяются
Можно так же добавить всплывающие подсказки, для этого нам нужно редактировать например для элемента меню Line у которого id=ID_ELEMENT_LINE
мы изменяем свойство Приглашение на line draw\nline line будет как заглавие всплывающей подсказки, а line draw будет текст после
а в строке состояния отобразится только line draw
ну и все ребятки на это все, программа у нас работает, меню работает, все короче работает. От так просто и легко в MFC делается меню.
[youtube]https://www.youtube.com/watch?v=fMTKARu2mkQ[/youtube]