Аннотация: Стили меню. Меню как ресурс. Добавление ресурса меню. Привязка ресурса меню к ресурсу главного окна. Привязка к меню функциональных возможностей. Создание диалога AboutBox.
Создание макета диалогового окна About. Создание управляющего класса. Динамические меню. Создание контекстных меню. Построение областей чувствительности. Отладочный обработчик сообщения WM_CONTEXTMENU. Создание ресурсов-заготовок контекстных меню. Построение комбинированного обработчика.
Командные клавиши — акселераторы.
Файлы к данной лабораторной работе, Вы можете скачать здесь.
Цель работы
- Создать меню для приложения
- Добавить меню в главное диалоговое окно приложения
- Вызывать функции приложения из меню
- Создать контекстное (всплывающее) меню
- Создать комбинированный обработчик (вручную)
- Задать акселераторы (ускоряющие, горячие клавиши) быстрого вызова опций меню
Проектировщики компьютерных программ изобрели графический интерфейс пользователя ( GUI — Graphical User Interface ), чтобы облегчить взаимодействие с компьютерными системами и приложениями. Важной частью этого интерфейса является меню.
МЕНЮ ДЛЯ КАФЕ С НУЛЯ ЗА 40 МИНУТ| Теперь ты дизайнер!
Стили меню
Хотя никаких стандартов разработки меню не существует, разработчиками приложений при проектировании меню накоплен богатый опыт, позволяющий облегчить работу будущего пользователя. Его необходимо придерживаться, чтобы не вынуждать потенциального пользователя нашего приложения срочно получать второе высшее только для того, чтобы правильно воспользоваться произведенным детищем.
Меню как ресурс
Различные составляющие приложений Windows , включая макет диалогового окна, меню, панели инструментов, изображения, текстовые строки, командные клавиши, управляющие элементы и т.д. рассматриваются как ресурсы. Проектировщик приложения на визуальном уровне указывает среде IDE содержимое текстов, размеры, идентификаторы ресурсов, типы ресурсов, а среда в это время заносит эти сведения в файл ресурсов на специальном языке — описания ресурсов. Ресурсы — это как видимые фишки в казино взамен пока еще невидимых денег. В приложениях ресурсы превращаются в объекты только после их компиляции.
Меню можно создавать заранее, как ресурс, с помощью редактора меню и такие меню называются статическими. Но чаще всего необходимо в приложении обеспечить управление составом меню в зависимости от состояния приложения. Некоторые пункты меню нужно скрыть, некоторые новые — показать, некоторые заблокировать или разблокировать. Такие действия позволяет выполнить MFC -класс CMenu . Более того, с помощью этого класса можно вообще программно создать меню с нуля, задав значения соответствующих свойств класса. Такая технология создания меню программно, без использования ресурсов, называется динамическим меню.
Однако удобнее использовать комбинированный подход: заранее создать необходимый набор ресурсов статическим способом, затем по мере необходимости подгружать в работающее приложение тот или иной ресурс программно, управляя его составом нужным образом. В нашей лабораторной работе технологию динамической загрузки и программного управления меню мы применим ниже применительно к контекстным меню.
Как создать меню для ресторана онлайн в Canva
Создание заготовки приложения
- Создайте новый проект MFC App C++ под названием Menu на основе диалога
Application Type | Dialog Based |
Resource language : | Английский (США) |
Project style : | MFC standard |
Use of MFC : | Use MFC in a static library |
Main frame styles : | System menu |
Dialog title : | Menu |
Все сбросить! |
Заменим иконку приложения на любую иную по выбору. Для этого сделайте следующее:
- Найдите в панели Resource View узел Icon . В нем хранится ресурс с идентификатором IDR_MAINFRAME . Это стандартное имя для иконки приложения
- Вызовите для узла Icon контекстное меню (или выделите его и через категорию Project главного меню) выполните команду Add Resource
- В появившемся диалоговом окне выполните кнопку Import
- Настройте фильтр на расширение *.ico , перейдите в каталог Icons с готовыми иконками и загрузите ресурс новой иконки
- Закройте панель с графическим редактором иконок, удалите ресурс IDR_MAINFRAME, а сгенерированный идентификатор IDI_ICON1 новой иконки переименуйте в IDR_MAINFRAME
- Полностью перестройте приложение ( Build/ Rebuild Solution ) и убедитесь, что новая иконка появилась
Убедитесь, также, в том, что файл .ico оболочка скопировала в каталог res проекта.
- Добавьте к приложению одну кнопку E PostMessage(WM_QUIT); // Посылаем сообщение напрямую >
Добавление ресурса меню
После того, как базовая заготовка создана мастером, нужно добавить и настроить в нее меню.
- Откройте панель Resource View , выделите верхний узел дерева ресурсов, идентичный имени проекта, в контекстном меню (или главном меню Project оболочки) выполните опцию Add Resource (Добавить ресурс)
- В диалоговом окне Add Resource дважды щелкните по ресурсу Menu
В области редактирования оболочки запустится дизайнер ресурса меню. Первое место в меню подсвечено.
Меню готово для проектирования. При задании пунктов меню вводится текст, который увидят пользователи приложения. Никакие свойства пункта не будут доступны, пока не ввести название пункта в соответствующую позицию (панель Properties будет пустой). Элементы строки меню верхнего уровня (категории) не выполняют никаких функций, кроме как раскрываются, поэтому им не нужно присваивать идентификаторы ресурсов (это же справедливо и для сепараторов).
Пункты меню можно вводить сразу в подсвеченную синим маркером область или вначале активизировать поле редактирования пункта. Горизонтальные разделители ( сепараторы ) вставляются клавишей «минус». По пунктам меню дизайнера можно передвигаться стрелками. При выходе за пределы крайних пунктов автоматически создается пустой шаблон нового пункта, который в окончательном варианте не участвует. Ненужные пункты можно удалить клавишей Delete .
Дизайнер меню поддерживается и главным меню оболочки и своим контекстным меню. Откаты редактирования дизайнер поддерживает не все, поэтому если произвести некоторое ошибочное действие, то восстанавливать первоначальный вариант нужно вручную.
Дизайнер меню автоматически формирует идентификатор ресурса пункта меню по его названию. Идентификаторы должны состоять из знаков подчеркивания, цифр и букв латинского алфавита. Если пункты меню вводить сразу на русском, то идентификаторы дизайнер будет генерировать из цифр, далеких от мнемонического смысла закрепленной за пунктом задачи. Поэтому возможны два варианта:
- Сразу вчерне присвоить пунктам названия по-английски для автоматической генерации понятных по смыслу имен идентификаторов, а затем все переписать по-русски. Здесь следует учесть, что автоматическая генерация идентификатора пункта происходит только один раз при первом заполнении названия пункта. При всех последующих изменениях названия первоначально сгенерированное имя идентификатора автоматически уже не изменяется (ну и ладно, изменим вручную).
- Писать названия пунктов сразу по-русски, затем редактировать идентификаторы ресурсов этих пунктов. Редактировать идентификаторы и названия пунктов после их создания можно через панель Properties или прямо в дизайнере меню, включив или выключив режим Edit IDs (Редактировать идентификаторы).
- Разработайте ресурс меню приложения в соответствии с таблицей
Схема ресурса меню ID Название ID Название Пусто Help ID_FILE_HELLO About Пусто ———Separator——— ID_FILE_EXIT Ehttps://intuit.ru/studies/courses/594/450/lecture/10028″ target=»_blank»]intuit.ru[/mask_link] C++. MFC. Создание меню
Меню программы — одна из важнейших частей, составляющих ее. С помощью MFC вполне реально реализовать его в своей программе, что сейчас мы и сделаем. Основное приложение не будет сложным, его задача подсчитать, сколько символов в веденной строке.
Сразу удалим все лишние элементы с диалогового окна, чтобы оно было пустым. В «Окне ресурсов» щелкнем по пустому месту правой кнопкой мыши:
В открывшемся окне выбираем «Меню», нажимаем «Создать». Теперь в закладке «Окно ресурсов» мы имеем файл IDR_MENU1 отвечающий за меню (рис. — область 1) и собственно область для работы с ним (рис. — область 2).
Нажатие левой кнопкой мыши по этой области позволит задать название пункта меню. Первое название мы зададим « подчеркивает имя пункта, и дает возможность обратится к нему при помощи сочетания клавиш ALT+F. Клавиша Enter подтверждает ваше действие. Как видите, прослеживается иерархия, которую мы можем продолжить, как на более низкие уровни, так и тождественные созданному. Добавим под меню «Файл» пункт «Посчитать», так как это показано на скриншоте.
В свойствах последнего, написан его ID (у меня это ID_32771), позже с его помощью мы свяжем пункт меню «Посчитать» с событием. А сейчас в ветке «Файл» задайте последний раздел «Помощь», а под ним пункт «Проект>Мастер классов) и найдите там сообщение EN_CHANGE.
Нажмите «Добавить обработчик…» всплывет окно, в котором следует нажать OK, и наконец изменить код функции на следующий:
1
2
3
4
5
6
7
8
9void CSymbolsDlg :: OnChangeSymbEdit ( )
<
// TODO: Если это элемент управления RICHEDIT, то элемент управления не будет
// send this notification unless you override the CDialogEx::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
UpdateData ( TRUE ) ;
// TODO: Добавьте код элемента управления
>После выполнения этого оператора переменной m_S будет присвоено значение содержимого окна редактирования.
Зададим пункту меню «Посчитать» действия, необходимые для работы нашей программы. Как помните его ID — ID_32771. Зайдем в «Мастер классов…» и добавим обработчик, выделив сообщение COMMAND идентификатора объектов ID_32771.
Теперь нажмите «Изменить код» и впишите в тело функции следующие строки.
1
2
3
4
5
6void CSymbolsDlg :: On32771 ( )
<
char str [ 1000 ] ;
itoa ( strlen ( m_S ) ,str, 10 ) ;
MessageBox ( str, «Всего символов» ) ;
>Программа обрабатывает строку, введенную в поле ввода, после чего возвращает количество символов составляющих ее. Осталось назначить работу еще не задействованных пунктов меню: «Выход» и «О программе». Начнем с первого.
Для пункта «Посчитать» мы добавляли обработчик событий непосредственно через «Мастера классов». Альтернативный способ связывания кода с нужным событием заключается в следующем:
- открываем окно для работы с меню;
- щелкаем правой кнопкой мыши по пункту «Выход»;
- выбираем «Добавить обработчик событий…»;
- в появившемся окне в поле «Список классов» устанавливаем значение CSymbolsDlg, а в поле «Тип сообщения» COMMAND;
- жмем «Добавить/править».
Изменим код функции, добавив следующий оператор:
void CSymbolsDlg :: On32772 ( )
<
OnOK ( ) ;
>Приступим к последнему этапу: свяжем код с пунктом «О программе». Аналогично предыдущему шагу добавим к нему обработчик COMMAND, изменим функцию таким образом:
void CSymbolsDlg :: On32773 ( )
<
CAboutDlg dlg ;
dlg. DoModal ( ) ;
>Оператор CAboutDlg dlg создает объект класса CAboutDlg именованный dlg, а dlg.DoModal() выводит диалоговую панель.
Программа создана! Файлы ее исходного кода Вы можете скачать по ссылке.
Источник: kvodo.ru
Игровое меню SFML C++
Меню один из неотъемлемых элементов игровой разработки. Благодаря ему мы можем насытить игру множественными разделами такими важными как настройка игры или смена пользователя. Без игрового меню, проект выглядит путешествием через туннель, в котором есть вход и есть выход, а между ними игровой процесс без права выбора.
В этой статье я познакомлю Вас с моей разработкой простого игрового меню на базе мультимедийной библиотеки SFML и языка программирования С++.
Инструментарий разработчика
Перед тем как я познакомлю Вас с прототипом моего игрового меню. Я обязан посвятить Вас в перечень софта, который использовался мною для данной разработки.
Для разработки кода я использовал:
Интегрированную среду разработки Visual Studio 2022 c установленной рабочей нагрузкой «Разработка классических приложений на С++».
Начинаем работу
Пишем класс игрового меню
#pragma once #include namespace game < class GameMenu < float menu_X; // Координаты меню по X float menu_Y; // Координаты меню по Y int menu_Step; // Расстояние между пунктами меню int max_menu; // Максимальное количество пунктов меню int size_font; // Размер шрифта int mainMenuSelected; // Номер текущего пункта меню sf::Font font; // Шрифт меню // Динамический массив текстовых объектов названий пунктов меню sf::Text* mainMenu; sf::Color menu_text_color = sf::Color::White; // Цвет пунктов меню sf::Color chose_text_color = sf::Color::Yellow; // Цвет выбора пункта меню sf::Color border_color = sf::Color::Black; // Цвет обводки текста пунктов меню // Настройка текста пунктов меню // Параметры: ссылка на текстовый объект, текст, координаты текста void setInitText(sf::Text // Ссылка на графическое окно sf::RenderWindow public: // Конструктор // Параметры: ссылка на графическое окно, координаты игрового меню по x и y // количество пунктов меню, массив названий пунктов меню, размер шрифта, шаг между пунктами меню GameMenu(sf::RenderWindow ~GameMenu() < delete[] mainMenu; >void draw(); // Рисуем меню void MoveUp(); // Перемещение выбора меню вверх void MoveDown(); // Перемещение выбора меню вниз // Цвет элементов игрового меню void setColorTextMenu(sf::Color menColor, sf::Color ChoColor, sf::Color BordColor); void AlignMenu(int posx); // Выравнивание положения меню int getSelectedMenuNumber() // Возвращает номер выбранного элемента меню < return mainMenuSelected; >>; >
#include «GameMenu.h» // метод настройки текстовых объектов пунктов игрового меню void game::GameMenu::setInitText(sf::Text text.setFont(font); // шрифт text.setFillColor(menu_text_color); // цвет text.setString(str); // текст text.setCharacterSize(size_font); // размер шрифта text.setPosition(xpos, ypos); // координаты текстового объекта text.setOutlineThickness(3); // толщина контура обводки текста text.setOutlineColor(border_color); // цвет контура обводки текста >// Выравнивание пунктов меню по левому по правому по центру void game::GameMenu::AlignMenu(int posx) < float nullx = 0; for (int i = 0; i < max_menu; i++) < switch (posx) < case 0: nullx = 0; // выравнивание по правому краю от установленных координат break; case 1: nullx = mainMenu[i].getLocalBounds().width; // по левому краю break; case 2: nullx = nullx = mainMenu[i].getLocalBounds().width / 2; // по центру break; >mainMenu[i].setPosition(mainMenu[i].getPosition().x — nullx, mainMenu[i].getPosition().y); > > // Конструктор game::GameMenu::GameMenu(sf::RenderWindow // Загрузка шрифта if (!font.loadFromFile(«font/troika.otf»)) exit(32); max_menu = index; // Количество єлементов меню mainMenu = new sf::Text[max_menu]; // Динамический массив пунктов меню // Выстраиваем элементы меню for (int i = 0, ypos = menu_Y; i < max_menu; i++, ypos += menu_Step) setInitText(mainMenu[i], name[i], menu_X, ypos); mainMenuSelected = 0; // Задаём начальное положения выбраного пункта меню // цвет выбраного пункта меню mainMenu[mainMenuSelected].setFillColor(chose_text_color); >// перемещение выбора меню вверх void game::GameMenu::MoveUp() < mainMenuSelected—; // подсвечиваем выбранный пункт меню if (mainMenuSelected >= 0) < mainMenu[mainMenuSelected].setFillColor(chose_text_color); mainMenu[mainMenuSelected + 1].setFillColor(menu_text_color); >else < mainMenu[0].setFillColor(menu_text_color); mainMenuSelected = max_menu — 1; mainMenu[mainMenuSelected].setFillColor(chose_text_color); >> // перемещение выбора меню вниз void game::GameMenu::MoveDown() < mainMenuSelected++; // подсвечиваем выбранный пункт меню if (mainMenuSelected < max_menu) < mainMenu[mainMenuSelected — 1].setFillColor(menu_text_color); mainMenu[mainMenuSelected].setFillColor(chose_text_color); >else < mainMenu[max_menu — 1].setFillColor(menu_text_color); mainMenuSelected = 0; mainMenu[mainMenuSelected].setFillColor(chose_text_color); >> // рисуем элементы меню в графическом окне void game::GameMenu::draw() < // перебираем для отрисовки существующие текстовые объекты пунктов меню for (int i = 0; i < max_menu; i++) mywindow.draw(mainMenu[i]); >// назначение цвета элементам пунктов меню void game::GameMenu::setColorTextMenu(sf::Color menColor, sf::Color ChoColor, sf::Color BordColor) < menu_text_color = menColor; // цвет пунктов меню chose_text_color = ChoColor; // цвет выбраного пункта меню border_color = BordColor; // цвет контура пунктов меню for (int i = 0; i < max_menu; i++) < mainMenu[i].setFillColor(menu_text_color); mainMenu[i].setOutlineColor(border_color); >mainMenu[mainMenuSelected].setFillColor(chose_text_color); >
#include «GameMenu.h» using namespace sf; // функция настройки текста void InitText(Text // Функция перехода к игре void GamеStart() < RenderWindow Play(VideoMode::getDesktopMode(), L»Уровень 1″, Style::Fullscreen); RectangleShape background_play(Vector2f(1920, 1080)); Texture texture_play; if (!texture_play.loadFromFile(«image/menu4.jpg»)) exit(1); background_play.setTexture( while (Play.isOpen()) < Event event_play; while (Play.pollEvent(event_play)) < if (event_play.type == Event::KeyPressed) < if (event_play.key.code == Keyboard::Escape) < Play.close(); >> > Play.clear(); Play.draw(background_play); Play.display(); > > // Функция настройки игры void Options() < RenderWindow Options(VideoMode::getDesktopMode(), L»Настройки», Style::Fullscreen); RectangleShape background_opt(Vector2f(1920, 1080)); Texture texture_opt; if (!texture_opt.loadFromFile(«image/menu1.jpg»)) exit(2); background_opt.setTexture( while (Options.isOpen()) < Event event_opt; while (Options.pollEvent(event_opt)) < if (event_opt.type == Event::Closed) Options.close(); if (event_opt.type == Event::KeyPressed) < if (event_opt.key.code == Keyboard::Escape) Options.close(); >> Options.clear(); Options.draw(background_opt); Options.display(); > > // Функция с описанием игры void About_Game() < RenderWindow About(VideoMode::getDesktopMode(), L»О игре», Style::Fullscreen); RectangleShape background_ab(Vector2f(VideoMode::getDesktopMode().width, VideoMode::getDesktopMode().height)); Texture texture_ab; if (!texture_ab.loadFromFile(«image/menu2.jpg»)) exit(3); background_ab.setTexture( while (About.isOpen()) < Event event_play; while (About.pollEvent(event_play)) < if (event_play.type == Event::Closed) About.close(); if (event_play.type == Event::KeyPressed) < if (event_play.key.code == Keyboard::Escape) About.close(); >> About.clear(); About.draw(background_ab); About.display(); > > int main() < // Создаём окно windows RenderWindow window; // Параметры: размер окна установить согласно текущему разрешению экрана // название моя игра, развернуть графическое окно на весь размер экрана window.create(VideoMode::getDesktopMode(), L»Моя игра», Style::Fullscreen); //отключаем видимость курсора window.setMouseCursorVisible(false); // получаем текущий размер экрана float width = VideoMode::getDesktopMode().width; float height = VideoMode::getDesktopMode().height; // Устанавливаем фон для графического окна // Создаём прямоугольник RectangleShape background(Vector2f(width, height)); // Загружаем в прямоугольник текстуру с изображением menu9.jpg Texture texture_window; if (!texture_window.loadFromFile(«image/menu9.jpg»)) return 4; background.setTexture( // Устанавливаем шрифт для названия игры Font font; if (!font.loadFromFile(«font/troika.otf»)) return 5; Text Titul; Titul.setFont(font); // Текст с названием игры InitText(Titul, 480, 50, L»Апокалипсис», 150, Color(237, 147, 0), 3); // Название пунктов меню String name_menu[]< L»Старт»,L»Настройки», L»О игре»,L»Выход»>; // Объект игровое меню game::GameMenu mymenu(window, 950, 350, 4, name_menu, 100, 120); // Установка цвета элементов пунктов меню mymenu.setColorTextMenu(Color(237, 147, 0), Color::Red, Color::Black); // выравнивание по центру пунктов меню mymenu.AlignMenu(2); while (window.isOpen()) < Event event; while (window.pollEvent(event)) < if (event.type == Event::KeyReleased) < // События выбра пунктов меню // нажати на клавиатуре стрелки вверх if (event.key.code == Keyboard::Up) < mymenu.MoveUp(); >// нажати на клавиатуре стрелки вниз if (event.key.code == Keyboard::Down) < mymenu.MoveDown(); >// нажати на клавиатуре клавиши Enter if (event.key.code == Keyboard::Return) < // Переходим на выбранный пункт меню switch (mymenu.getSelectedMenuNumber()) < case 0:GamеStart(); break; case 1:Options(); break; case 2:About_Game(); break; case 3:window.close(); break; >> > > window.clear(); window.draw(background); window.draw(Titul); mymenu.draw(); window.display(); > return 0; > // функция настройки текста void InitText(TextИгровое меню SFML C++ «.Источник: habr.com
Загрузка ...