Программа алгоритм создание меню

На первый взгляд кажется, что в записи любого такого диска нет ничего сложного — нужно лишь взять подходящую программу и скопировать нужные папки и файлы. Однако не все так просто: вставив такой диск в CD-ROM или DVD-ROM, пользователю придется самому найти и запустить нужные файлы, а это предполагает наличие у пользователя определенной подготовки, что бывает далеко не всегда.

К тому же на запуск файла, открытие документа и т.п. затрачивается гораздо больше времени, поскольку требуется внимательно изучить файловую структуру диска и сориентироваться. А если предположить, что на диске находится презентация компании, электронный каталог или рекламный букет, которые нужно представить потенциальным клиентам, либо иллюстративный материал для публичного выступления на конференции, семинаре и т.п., то в этом случае очень важно произвести впечатление на аудиторию, что окажется весьма сложным, если в момент диалога с клиентом или в процессе выступления приходится прерваться для того, чтобы вставить диск, открыть его (например, в проводнике Windows), перейти в нужную папку и загрузить нужный файл.

C++. СУПЕР-МЕНЮ

А уж если предполагается демонстрировать несколько документов, иллюстраций, презентаций, слайд-шоу и пр., то тогда многочисленные операции по открытию и запуску придется повторять неоднократно. Весьма сомнительно, что при современном развитии информационных технологий такая суета произведет благоприятное впечатление на зрителя. И совсем уж полный провал гарантирован, если подобные диски продаются пользователям (например, диски с ПО или с образовательными программами) либо раздаются потенциальным клиентам или заказчикам на профильных выставках и ярмарках (диски с информацией о компании и/или ее разработках): в первом случае пользователи, наконец-то разобравшись с установкой программных продуктов, будут обижены на вас из-за напрасно потраченного на это времени и, вполне возможно, в следующий раз отдадут предпочтение другому разработчику, а во втором — вовсе не исключено, что потенциальные клиенты вообще не ознакомятся с вашими материалами, ведь им совсем не захочется тратить время на выяснение того, что конкретно нужно загружать. Так что вы потеряете шанс получить новых клиентов.

Отсюда следует закономерный вывод: требуется не просто скопировать на CD- или DVD-диск нужную информацию, а обеспечить к ней удобный интерактивный доступ, ибо не стоит заставлять пользователей и клиентов тратить время на чтение прилагаемого руководства к диску. На деле это означает, что после помещения диска в накопитель на экране монитора должно автоматически появляться интерактивное меню, обеспечивающее навигационный доступ ко всем материалам диска. Реализовать такую возможность совсем не сложно: достаточно снабдить диск автозагружающейся графической оболочкой (загрузочным меню — autorun), при наличии которой диск станет удобным инструментом для установки ПО или драйверов, внятным учебным пособием, иллюстрацией ваших личных разработок, визитной карточкой компании, информационным бюллетенем и т.п. (автозагружающиеся диски могут с не меньшим удобством представлять и иную информацию). Загрузочные меню позволяют ускорить доступ к хранящимся на диске дистрибутивам, превратить обычные диски с фотографиями в эффектные слайд-шоу, четко организовать итоговые документы компании, ускорить доступ к хранящимся на диске электронным книгам или видеозаписям и т.п. Загрузочные меню необходимы и для осуществления автозапуска различных мультимедийных презентаций, для составления обзоров, инструкций по эксплуатации и аналогичных материалов, в особенности если они не относятся к компьютерной сфере и их загрузка создает потенциальные проблемы для пользователей.

Изучение Qt Creator | Урок #7 — Создание меню с QAction, QMenu и QToolBar

Приложения для разработки самозагружающихся графических оболочек к дискам представляют огромный интерес для самых разных специалистов: разработчиков ПО и обучающих программных продуктов, продавцов видео и аудио, фотографов, проектировщиков и пр. Интересны такие приложения и для домашних пользователей, которые могут использовать их для управления дисками с софтом, для организации фотоальбомов и домашнего видео и т.п.

Практическое задание№1

Ответить на вопросы

1. Какова структура CD дисков?

2. Что означает CD-ROM и DVD-ROM?

Читайте также:
Программа настройки omvl dream xxi

3. Как записываются данные на носителях CD-ROM и CD-RW?

4. За счёт чего ёмкость DVD больше ёмкости дисков CD?

5. Назвать и охарактеризовать форматы DVD дисков.

6. Какая файловая система используется в DVD носителях?

7. Для чего предназначена программа Nero?

8. Как устроен привод для чтения оптических дисков?

Практическое задание№2

Создание меню диска

С помощью программы Power point, создать на слайде меню компакт диска, которое будет отображать содержимое диска. Содержимое диска и его тематику вы выбираете самостоятельно, это могут быть сборник программ, фильмы, музыка, игры и т.д…

Ответы на вопросы оформить в MicrosoftWord. Работы оформить в соответствии ГОСТ!

Выполненное задание отправить личным сообщением вк.

Работа (файл) подписывается в формате;

Фамилия И.О._дата выдачи задания

Работы принимаются до 13:00

Дата добавления: 2020-12-12 ; просмотров: 419 ; Мы поможем в написании вашей работы!

Источник: studopedia.net

Лекция 7

Меню используют для выбора команд и изменения режимов работы приложения. Если строка меню связана с командой, при ее выборе приложение получает сообщение WM_COMMAND и идентификатор этой команды. Основным элементом меню являются строки или графические объекты. Главное меню находится ниже заголовка окна, и его строки расположены в одну или несколько линий.

При выборе строки главного меню, как правило активизируется раздел меню. Раздел меню представляет собой временное меню. Контекстное (плавающее) меню – временное меню, которое может появится в любой точке рабочей области (как правило при нажатии правой кнопки мыши). Системное меню – меню, расположенное слева от текста заголовка окна.

По способу создания различают статическое и динамическое меню.

Статическое меню создают до запуска и не изменяют в процесса работы приложения. Динамическое меню создают в процессе работы приложения и после создания оно может быть изменено.

Элементы меню

Любой элемент меню может быть описан с помощью структуры MENUITEMINFO: typedef struct tagMENUITEMINFO <

UINT cbSize; //Размер структуры
UINT fMask; //Маска параметров меню
UINT fType; //Тип элемента меню
UINT fState; //Состояние элемента меню
UINT wID; //Идентификатор команды, этого элемента
HMENU hSubMenu; //Дескриптор подменю
HBITMAP hbmpChecked; //Дескриптор изображения метки для отмеч.
элемента
HBITMAP hbmpUnchecked; //Дескриптор изображения метки для неотмеч.
элемента //Определяемое приложением значение, связанное
ULONG_PTR dwItemData;
с
//элементом //Содержание отображения меню
LPTSTR dwTypeData;
UINT cch; //Длина текста элемента меню или 0
HBITMAP hbmpItem; //Дескриптор изображения элемента

> MENUITEMINFO, *LPMENUITEMINFO;

Значения поля fMask

Значения поля fType
Константа Пояснение
Элемент меню отображать графическим объектом,
MFT_BITMAP дескриптор которого находится в младшем слове
dwTypeData, а поле cch игнорировать.
Элемент меню отображать в начале новой строки или
MFT_MENUBARBREAK нового столбца. Между столбцами появится вертикальная
линия.
MFT_MENUBREAK Тоже самое, но между столбцами не появляется
вертикальная линия.
MFT_RADIOCHECK Если hbmpChecked==NULL, то элемент помечать как
радиокнопку
MFT_RIGHTJUSTIFY Выравнивать этот и последующие элементы по правому
краю
MFT_SEPARATOR В качестве элемента отобразить разделитель в виде
горизонтальной линии
MFT_STRING Элемент меню отображать в виде строки, содержащейся в
dwTypeData
Значения поля fState
Значение Состояние элемента меню
MFS_CHECKED Отмечен
MFS_DEFAULT Элемент по умолчанию
MFS_DISABLED Заблокирован
MFS_ENABLED В активном состоянии
MFS_GRAYED Заблокирован
MFS_HILITE Подсвечен
MFS_UNCHECKED Не отмечен
MFS_UNHILITE Не подсвечен

Алгоритм создания меню

Алгоритм создания меню в общем случае содержит следующие шаги: 1. Создание пустого меню. 2. Вставка элемента в меню. 3. Шаг 2 повторяется столько раз, сколько элементов должно содержать меню. Алгоритм подключения главного меню к окну и отображения полосы меню: 4. Создание главного меню (аналогично предыдущему алгоритму). 5. Подключение главного меню к окну.

6. Перерисовка полосы меню окна.

Функции создания меню

Создание пустого главного меню: HMENU CreateMenu( void ); Создание пустого временного меню: HMENU CreatePopupMenu( void ); Функция подключения главного меню к окну: BOOL SetMenu(HWND hwnd, HMENU hmenu); Функция перерисовки строки меню (независимо от состояния окна): void WINAPI DrawMenuBar(HWND hwnd);

Вставка элементов в меню

Функция вставки элементов в меню: BOOL InsertMenuItem(HMENU hMenu , UINT uItem , BOOL fByPosition , LPCMENUITEMINFO lpmii ); hMenu – идентификатор меню, uItem содержит номер позиции перед которой необходимо вставить новый элемент (если fByPosition = TRUE, иначе – идентификатор команды вставляемого элемента). lpmii – указатель на заполненную структуру MENUITEMINFO.

Читайте также:
Что проходят в первом классе программа

Источник: studfile.net

Многоуровневое меню для Arduino и не только

Несколько месяцев назад на хабре появилась статья «Реализация многоуровневого меню для Arduino с дисплеем». «Но, погодите, — подумал я. — Я написал такое меню еще шесть лет назад»!

В далеком 2009 году, я написал первый проект на базе микроконтроллера и дисплея под названием «Автомат управления освещением», для которого потребовалось создать такую оболочку меню, в которую влезет тысяча конфигов, а то и более. Проект был успешно рожден, компилируется и способен работать до сих пор, а оболочка менюОС пошла кочевать из проекта в проект, используя лучшие практики Ущербно-Ориентированного программирования. «Хватит это терпеть» сказал я, и переписал код.

Подкатом вы найдете legacy-код отборного качества, сказ о том, как я его переписал, а также инструкции для тех, кто захочет это использовать.

Требования и возможности менюОС

  1. простота использования, кнопки влево-вправо, вверх-вниз, назад-вперед.;
  2. древовидная структура любой адекватной глубины (до 256);
  3. общее количество пунктов меню, которого хватит всем (10^616);
  4. редактирование настроек;
  5. запуск программ.
  6. простенький встроенный диспетчер задач.

Файловая структура


В качестве примера, будем разбирать следующую структуру меню(слева номер пункта):

0 Корень/ 1 — Папка 1/ — папка с файлами 3 — Программа 1 4 — Программа 2 5 — Папка 3/ — папка с множеством копий программы. Положение курсора будет являться параметром запуска 6 — Программа 3.1 6 — Программа 3.2 6 — Программа 3.3 6 — хххххх 6 — Программа 3.64 2 — Папка 2/ — папка с конфигами 7 — Булев конфиг 1 8 — Числовой конфиг 2 9 — Числовой конфиг 3 10 — Программа Дата/время

Главным догматом менюОС является «Все есть файл». Да будет так.
У каждого файла есть тип, название, родительская папка, прочие параметры
Опишем структурой:

struct filedata< uint8_t type; uint8_t parent; uint8_t mode1;//параметр 1 uint8_t mode2;//параметр 2 char name[20]; >;

  1. type,
  2. parent, он не очень нужен, так как вся информация есть в хлебных крошках, но остался как legacy
  3. mode1, два параметра, специфичных для каждого типа файла
  4. mode2
type == T_FOLDER

Основным файлом является папка. Она и позволяет создать древовидную структуру всего меню.
Самая главная здесь — корневая папка под номером нуль. Что бы не произошло, в итоге мы вернемся в нее.
Параметрами папки являются

mode1 = стартовый номер дочернего файла, mode2 = количество файлов в ней.

В корневой папке 0 лежат файлы 1 и 2, всего 2 штуки.
Опишем ее так:
T_FOLDER, 0, 1, 2,

type == T_DFOLDER

В Папке 3 лежит несколько копий одной и той же программы, однако с разными ключами запуска.
Например, в автомате управления освещением имеется возможность установить до 64 суточных программ, с 16 интервалами в каждой. Если описывать каждый пункт, потребуется 1024 файла. На практике достаточно двух. А хлебные крошки скормим программе в виде параметров.

mode1 = номер дочернего файла, копии которого будем плодить mode2 = количество копий файла.

Нехитрая математика подсказывает нам, что если все 256 файлов будут динамическими папками с максимальным числом копий, общее число пунктов меню в системе составит 256^256 = 3.2 x 10^616. Этого ТОЧНО хватит на любой адекватный и не очень случай.

type == T_APP

Приложение. Его задача — прописаться в диспетчере задач (встроенном или внешнем), перехватить управление кнопками и править.

mode1 = id запускаемого приложения.

type == T_CONF

Конфиг-файл, ради которого и затеян весь сыр-бор. Позволяет устанавливать булево или числовое значение какого-либо параметра. Работает с int16_t.

mode1 = id конфига

  1. Cell ID — Стартовый номер ячейки памяти для хранения данных. Все данные занимают два байта.
  2. Minimum — минимальное значение данных
  3. Maximum — максимальное значение данных.

2, -100, 150,

type == S_CONF

Интересный(но оставшийся пока только в старом коде) конфиг, работает в связке с T_SFOLDER
mode1 = id конфига

type == T_SFOLDER

Особый вид папки вынесен ближе к конфигу, так как является одной из его разновидностей.
Представьте себе, у вас в системе зашита возможность работы по RS-485 по протоколам A,B или C. Помещаем в папку кучку файлов вида S_CONF и выбираем из них необходимый. Более того, когда мы зайдем в папку вновь, курсор подсветит активный вариант.
mode1, mode2 аналогичны для T_FOLDER. Дочерними файлами являются только T_SCONF

Читайте также:
Сколько было запусков при которых программа напечатала no

Результаты рефакторинга

  1. Выделил работу с аппаратной частью как минимум в отдельные функции в отдельном файле. В HWI вошли:
  2. Переписаны модули под классы. Спрятано в private все что только можно, унифицирован внешний вид, Фишка с классами и более-менее унифицированным интерфейсом потом пригодится.
  3. «Добавлен» интерфейс для работы с RTOS. Вернее, штатный диспетчер задач довольно просто заменить на любой другой.
  4. Банально прибрался в коде, сделал его более понятнее, убрал магические числа, улучшил интерфейс. Теперь его не стыдно показать.

Создание своего проекта

Настройка проекта включает в себя следующие пункты:

Создание файлов


Создадим массивы по ранее рассмотренной структуре

//массив структуры static const uint8_t fileStruct[FILENUMB*FILEREW] PROGMEM = < T_FOLDER, 0, 1, 2, //0 T_FOLDER, 0, 3, 3, //1 T_FOLDER, 0, 7, 4, //2 T_APP, 1, 1, 0, //3 T_APP, 1, 2, 0, //4 T_DFOLDER, 1, 6, 66, //5 T_APP, 5, 2, 0, //6 T_CONF, 2, 0, 0, //7 T_CONF, 2, 1, 0, //8 T_CONF, 2, 2, 0, //9 T_APP, 2, 3, 0 //10 >; //Массив названий static PROGMEM const char file_0[] = «Root»; static PROGMEM const char file_1[] = «Folder 1»; static PROGMEM const char file_2[] = «Folder 2»; static PROGMEM const char file_3[] = «App 1»; static PROGMEM const char file_4[] = «App 2»; static PROGMEM const char file_5[] = «Dyn Folder»; static PROGMEM const char file_6[] = «App»; static PROGMEM const char file_7[] = «config 0»; static PROGMEM const char file_8[] = «config 1»; static PROGMEM const char file_9[] = «config 2»; static PROGMEM const char file_10[] = «Date and Time»; PROGMEM static const char *fileNames[] = < file_0, file_1, file_2, file_3, file_4, file_5, file_6, file_7, file_8, file_9, file_10 >;

Создадим массив для конфигов:
//number of cell(step by 2), minimal value, maximum value static const PROGMEM int16_t configsLimit[] = < 0,0,0,// config 0: 0 + 0 дадут булев конфиг 2,-8099,8096,//config 1 4,1,48,//config 2 >;

Настройка кнопок

Я предпочитаю подключать кнопки с замыканием на землю и подтягивающим резистором к питанию, который всегда в наличии в МК.

В файле hw/hwdef.h укажем названия регистров и расположение кнопок:

#define BUTTONSDDR DDRB #define BUTTONSPORT PORTB #define BUTTONSPIN PINB #define BUTTONSMASK 0x1F #define BSLOTS 5 /**Button mask*/ enum< BUTTONRETURN = 0x01, BUTTONLEFT = 0x02, BUTTONRIGHT = 0x10, BUTTONUP = 0x08, BUTTONDOWN = 0x04 >;

Настройка дисплея

Сейчас проект тащит за собой библиотеку GLCDv3, что не есть хорошо. Исторически так сложилось.
Ссылка на google-code — https://code.google.com/p/glcd-arduino

Создание приложения

Рассмотрим пример приложения, использующий базовые функции меню.
menuos/app/sampleapp.cpp

Создадим класс со следующей структурой:

#ifndef __SAMPLEAPP_H__ #define __SAMPLEAPP_H__ #include «hw/hwi.h» #include «menuos/MTask.h» #include «menuos/buttons.h» class sampleapp < //variables public: uint8_t Setup(uint8_t argc, uint8_t *argv);//запуск приложения. В качестве параметров — текущий уровень и массив хлебных крошек uint8_t ButtonsLogic(uint8_t button);//обработчик кнопок uint8_t TaskLogic(void);//обработчик таймера protected: private: uint8_t tick; void Return();//возврат в главное меню //functions public: sampleapp(); ~sampleapp(); protected: private: >; //sampleapp extern sampleapp SampleApp; //Сишные костылиобертки для обработчика кнопок и диспетчера void SampleAppButtonsHandler(uint8_t button); void SampleAppTaskHandler(); #endif //__SAMPLEAPP_H__

И набросаем основные функции:
uint8_t sampleapp::Setup(uint8_t argc, uint8_t *argv) < tick = 0; //пропишем себя в системных модулях Buttons.Add(SampleAppButtonsHandler);//add button handler Task.Add(1, SampleAppTaskHandler, 1000);//add task ha GLCD.ClearScreen();//очистим экран //и на самом видном месте напишем GLCD.CursorTo((HwDispGetStringsLength()-11)/2, HwDispGetStringsNumb()/2); GLCD.Puts(«Hello Habr»); return 0; >
void SampleAppButtonsHandler(uint8_t button) < SampleApp.ButtonsLogic(button); >void SampleAppTaskHandler()
uint8_t sampleapp::ButtonsLogic(uint8_t button) < switch (button)< case BUTTONLEFT: break; case BUTTONRIGHT: break; case BUTTONRETURN: Return(); break; case BUTTONUP: break; case BUTTONDOWN: break; default: break; >return 0; >

И функция, которая будет вызываться каждую секунду:
uint8_t sampleapp::TaskLogic(void) < GLCD.CursorTo((HwDispGetStringsLength()-11)/2, HwDispGetStringsNumb()/2+1); GLCD.PrintNumber(tick++); >

Теперь в menu.cpp пропишем, что по номеру 2 будет вызываться наша программа:
void MMenu::AppStart(void) < if (file.mode2 != BACKGROUND)< Task.Add(MENUSLOT, MenuAppStop, 10);//100 ms update Task.ActiveApp = 1;//app should release AtiveApp to zero itself >switch (file.mode1) >

Соберем проект и посмотрим, что у нас получилось:

То же самое для визуалов

Подробная и слегка занудная инструкция по файловой структуре и архитектуре, а также пример работы в видеоматериале.

Ссылки и репозитории

  1. Репозиторий на GitHub: https://github.com/radiolok/menuosv1
  2. Репозиторий на Bitbucket: https://bitbucket.org/radiolok/menuosv1
  3. GLCDv3: https://code.google.com/p/glcd-arduino/
  4. openLCD:https://bitbucket.org/bperrybap/openglcd/

Источник: habr.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru