Съдържание:

Вграден мениджър на прозорци: 10 стъпки
Вграден мениджър на прозорци: 10 стъпки

Видео: Вграден мениджър на прозорци: 10 стъпки

Видео: Вграден мениджър на прозорци: 10 стъпки
Видео: Исправлена проблема с драйвером USB для Windows 8.1 и Windows 10 - Robojax 2024, Юли
Anonim
Вграден мениджър на прозорци
Вграден мениджър на прозорци
Вграден мениджър на прозорци
Вграден мениджър на прозорци
Вграден мениджър на прозорци
Вграден мениджър на прозорци
Вграден мениджър на прозорци
Вграден мениджър на прозорци

Този проект показва как да се внедри мениджър на прозорци с подвижни припокриващи се прозорци на вграден микроконтролер с LCD панел и сензорен екран. Има налични търговски софтуерни пакети за това, но те струват пари и са със затворен код. Тази, наречена MiniWin, е безплатна и с отворен код. Написано е в напълно съвместим C99 и може да се използва в приложение на C или C ++. Целите на MiniWin са да бъдат лесни за използване, лесни за модифициране, разширяващи се, преносими към широк спектър от хардуер и не прекалено гладни за ресурси.

Освен че предоставя код за управление на вашите прозорци, MiniWin има колекция от контроли за потребителски интерфейс - бутони, плъзгачи, ленти за напредък, дървета и др. Можете да имате множество прозорци от различни типове или множество екземпляри от един и същи тип. Windows може да се премества, преоразмерява, увеличава, минимизира, затваря - всички обичайни неща, които правите с прозорци в по -големи мениджъри на прозорци. Шрифтовете TrueType с кернинг и сглаждане (прави текста да изглежда гладко) също се поддържат за атрактивно изобразяване на текст.

Във всеки прозорец имате клиентска зона (вашето пространство вътре в границата и под горната лента). Тук можете да добавите контроли, за да направите диалог, или можете да използвате вградената графична библиотека, за да нарисувате каквото искате. Всички функции на графичната библиотека са с прозорци. Не е нужно да се притеснявате къде е вашият прозорец, какво го припокрива или дали е сведено до минимум.

В допълнение към създаването на свои собствени прозорци, има и някои стандартни диалогови прозорци, които са много лесни за създаване - например диалогови диалози за потвърждение (само бутони OK или Да/Не), настройки за час/дата, избор на файлове, избор на цвят и т.н.

MiniWin използва стандартна система за опашки за съобщения за проектиране на Windows Manager. Windows може да взаимодейства помежду си и с мениджъра на прозорци чрез съобщения. Не извиквате функции, за да правите неща директно, добавяте съобщение към опашката и мениджърът на прозорци ще го активира вместо вас.

MiniWin е пренесен към стандартни дъски за разработка с дисплеи със сензорен екран от доставчиците на микроконтролери ST, NXP и Renesas. Има хардуерни драйвери и примерни проекти за всички тези устройства. В допълнение MiniWin може да бъде изграден за Windows или Linux, така че да можете да симулирате кода на потребителския интерфейс, преди да получите вградения хардуер.

MiniWin има генератор на кодове. Можете да посочите вашите прозорци и контроли в лесен за създаване на читаем за хора JSON файл и генераторът на код анализира файла и създава кода за вас (има много примери за следване). Той създава Windows или Linux пълни симулаторни приложения, които могат просто да бъдат изградени и има вашият симулиран LCD дисплей с вашите прозорци MiniWin, работещи. Можете да вземете точно същия генериран код и да го пуснете във вграден проект и да имате същия код, показващ същите прозорци и контролни моменти по -късно на вашия вграден хардуер.

MiniWin не изисква оперативна поддръжка на вграденото устройство. Всичко работи в една нишка. MiniWin може да бъде интегриран с RTOS, работещ на вграден процесор и има примери за интегриране на MiniWin с FreeRTOS.

Тази инструкция показва как да стартирате и стартирате MiniWin на STM32 M4 процесор, използвайки евтината STM32F429 Discovery платка, която се доставя с вече свързан QVGA сензорен дисплей. Те са лесно достъпни от вашия доставчик на електронни компоненти.

MiniWin работи на микроконтролери от среден клас и по-нови.

Консумативи

STM32F429I-DISC1 платка за разработка и микро USB кабел

STM32CubeIDE изтегляне, което е безплатно.

Стъпка 1: Получаване на кода

Получаване на кода
Получаване на кода

На първо място имате нужда от инсталиран STM32CubeIDE. Можете да получите това от уебсайта на ST. Трябва да се регистрирате и изтеглянето и инсталирането отнема известно време. Всичко е безплатно.

Докато това се инсталира, изтеглете източника на MiniWin и го разархивирайте. Той е голям, но ще използвате само малка част от него. Щракнете върху зеления бутон „Клониране или изтегляне“тук…

github.com/miniwinwm/miniwinwm

след това изберете Download Zip. Разархивирайте съдържанието.

Стъпка 2: Изграждане на примерен проект

Изграждане на примерен проект
Изграждане на примерен проект
Изграждане на примерен проект
Изграждане на примерен проект

Първо нека изградим един от примерните проекти. Един добър се нарича MiniWinSimple. Стартирайте STM32CubeIDE и направете следното:

  1. Изберете Файл | Импортиране …
  2. Отворете Общи и изберете Съществуващ проект в работното пространство. Следващия.
  3. Щракнете върху Преглед и отидете до мястото, където сте разархивирали MiniWin. След това отидете в папката STM32CubeIDE / MiniWinSimple / STM32F429. Щракнете върху Избор на папка.
  4. В Project: маркирайте MiniWinSimple_STM32F429, след което щракнете върху Finish.
  5. Проектът MiniWinSimple_STM32F429 ще се появи във вашия Project Explorer. Изберете го и го изградете с Project | Build Project.
  6. Сега включете вашия USB кабел към дъската и компютъра си и го стартирайте с помощта на Run | Debug и когато бъде изтеглен изберете Run | Resume. Ще получите дисплей за калибриране на екрана за първи път, така че докоснете центъра на трите кръста на LCD дисплея. Вече можете да взаимодействате с прозореца на дисплея.

За да преместите прозорец, плъзнете го по заглавната лента. За да промените размера на прозорец, използвайте иконата на бял триъгълник вляво от заглавната лента. Прозорците на MiniWin не могат да бъдат преоразмерени чрез плъзгане на границите, тъй като дисплеите, на които се използва MiniWin, са твърде малки. За да намалите, увеличите или затворите прозорец, използвайте иконите в десния край на заглавната лента (затварянето може да бъде забранено). Когато прозорецът е минимизиран, не можете да премествате минимизираните икони наоколо. Те се натрупват от долу наляво надясно.

Стъпка 3: Стартирайте Генератора на кодове

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

Сега ще променим примерния проект, като генерираме някои наши прозорци и пуснем новия код. За да направим това, ще стартираме генератора на код.

  1. Отворете командния ред и отидете в папката, където сте разархивирали MiniWin, а след това в папката Tools / CodeGen.
  2. Изпълнимият файл за Windows CodeGen.exe вече е наличен. За Linux трябва да го изградите, като напишете make. (Можете също така да го създадете от източник за Windows, ако се притеснявате, че изпълнявате изтеглен изпълним файл, но имате нужда от инсталиране на компилатора и среда за разработка. Вижте документацията на MiniWin в папката docs за подробности).
  3. В тази папка има някои примерни JSON файлове. Ще използваме example_empty.json. Първо трябва да го редактирате, за да го настроите за Windows или Linux. Отворете го в редактор и в горната част, където ще намерите „TargetType“, променете стойността „Linux“или „Windows“на това, на което използвате генератора на код.
  4. Сега въведете codegen example_empty.json в командния ред.
  5. Отидете на вашия проект в STM32CubeIDE и отворете папката MiniWinSimple_Common. Изтрийте всички файлове там.
  6. Оставихме „TargetName“в JSON файла по подразбиране в „MiniWinGen“, така че това е името на нашата папка с генериран код. Отидете в папката, в която сте разархивирали MiniWin и след това в папката MiniWinGen_Common. Сега изберете всички тези файлове и плъзнете и пуснете след това в STM32CubeIDE в папката MiniWinSimple_Common на вашия проект.
  7. Сега възстановете и стартирайте отново проекта в STM32CubeIDE и ще се появи вашият нов прозорец за дизайн. Бутонът в прозореца е изчезнал, защото example_empty.json не дефинира нито един.

Стъпка 4: Добавяне на прозорец

Добавяне на прозорец
Добавяне на прозорец

Сега ще добавим втори прозорец към конфигурационния файл на JSON и ще регенерираме кода.

1. Отворете example_empty.json в текстов редактор.

2. В секцията „Windows“има масив от дефиниции на прозорци, който в момента има само един прозорец. Копирайте всичко това …

{

"Name": "W1", "Title": "Window 1", "X": 10, "Y": 15, "Width": 200, "Height": 180, "Border": true, "TitleBar": true, "Visible": true, "Minimized": false}

и го поставете отново със запетая, разделяща двете дефиниции.

3. Променете „W1“на „W2“и „Window 1“на „Window 2“. Променете "X", "Y", "Width" и "Height" на някои различни стойности, като имате предвид, че разделителната способност на екрана е 240 широки на 320 високи.

4. Запишете файла и стартирайте генератора на кодове отново.

5. Копирайте файловете както в предишната стъпка, възстановете и повторете. Сега ще имате 2 прозореца на дисплея си.

Стъпка 5: Добавяне на контрола

Добавяне на контрола
Добавяне на контрола

Сега ще добавим някои контроли към новия ви прозорец. Редактирайте същия файл като в предишната стъпка.

1. В спецификацията за прозорец W1 добавете запетая след последната настройка ("Минимизиран": невярно) след това добавете този текст

"MenuBar": вярно, "MenuBarEnabled": true, "MenuItems": ["Fred", "Bert", "Pete", "Alf", "Ian"], "Buttons": [{"Name": "B1", "Label": "Button1", "X": 10, "Y": 10, "Enabled": true, "Visible": true}]

Този раздел добавя лента с меню с 5 елемента и я активира (лентите с менюта могат да бъдат деактивирани глобално, опитайте). Той също така добавя бутон, който е активиран и видим (те могат да бъдат създадени невидими и след това да станат видими в кода по -късно).

2. Регенерирайте кода, копирайте го, възстановете, повторете всичко както преди.

Стъпка 6: Накарайте контролите да направят нещо

Накарайте контролите да направят нещо
Накарайте контролите да направят нещо

Сега имаме основния потребителски интерфейс, от който се нуждаем, за да го накараме да направи нещо. За този пример ще изскочим диалогов прозорец за избор на цвят, когато бутонът в прозорец 1 е натиснат.

Отидете на вашия проект в STM32CubeIDE и отворете папката MiniWinSimple_Common и след това отворете файла W1.c (името на този файл съответства на полето "Име" на прозореца в JSON файла, когато кодът е генериран).

В този файл ще намерите функция window_W1_message_function (). Изглежда така:

void window_W1_message_function (const mw_message_t *message) {MW_ASSERT (message! = (void *) 0, "Параметър на нулевия указател"); / * Следващият ред спира предупрежденията на компилатора, тъй като променливата в момента не се използва */ (void) window_W1_data; превключвател (съобщение-> съобщение_идентификатор) {случай MW_WINDOW_CREATED_MESSAGE: / * Добавете всеки код за инициализация на прозорец тук * / break; случай MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Добавете код за обработка на менюто на прозореца тук * / break; случай MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Добавете кода на манипулатора за този контрол тук * /} break; по подразбиране: / * Дръжте MISRA щастлив * / break; }}

Това се извиква от прозоречния мениджър за този прозорец винаги, когато мениджърът на прозорци трябва да уведоми прозореца, че нещо се е случило. В този случай се интересуваме, че е натиснат единственият бутон на прозореца. В оператора switch за типове съобщения ще видите калъф за MW_BUTTON_PRESSED_MESSAGE. Този код се изпълнява, когато бутонът е натиснат. В този прозорец има само един бутон, но може да има повече, така че се проверява кой е този бутон. В този случай това може да бъде само бутон B1 (името отново съответства на името на бутона в JSON файла).

Така че след този етикет на случая добавете кода, за да изскочите диалогов прозорец за избор на цвят, който е следният:

mw_create_window_dialog_colour_chooser (10, 10, "Цвят", MW_HAL_LCD_RED, невярно, съобщение-> получател_ръчка);

Параметрите са следните:

  • 10, 10 е местоположението на екрана на диалоговия прозорец
  • "Цвят" е заглавието на диалога
  • MW_HAL_LCD_RED е цветът по подразбиране, с който диалогът ще започне
  • false означава, че не показват голям размер (опитайте да го настроите на true и вижте разликата)
  • съобщение-> получател е този, който притежава този диалог, в този случай това е този прозорец. Дръжката на прозореца е в параметъра на съобщението на функцията. Това е прозорецът, към който ще бъде изпратен отговорът на диалога.

За да разбере стойността на цвета, който потребителят е избрал, мениджърът на прозорци ще изпрати на нашия прозорец съобщение с избрания цвят, когато потребителят натисне бутона OK в диалоговия прозорец. Затова трябва да прихванем и това съобщение с друг случай в оператора switch, който изглежда така:

случай MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE:

{mw_hal_lcd_colour_t selected_colour = message-> message_data; (невалидно) selected_colour; } почивка;

Все още не правим нищо с избрания цвят, така че просто го прехвърляме на void, за да предотвратим предупреждение на компилатора. Крайният код на тази функция сега изглежда така:

void window_W1_message_function (const mw_message_t *съобщение)

{MW_ASSERT (message! = (Void*) 0, "Параметър за нулев указател"); / * Следващият ред спира предупрежденията на компилатора, тъй като променливата в момента не се използва */ (void) window_W1_data; превключвател (съобщение-> съобщение_идентификатор) {случай MW_WINDOW_CREATED_MESSAGE: / * Добавете всеки код за инициализация на прозорец тук * / break; случай MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Добавете код за обработка на прозоречното меню тук * / break; случай MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Добавете кода на манипулатора за тази контрола тук * / mw_create_window_dialog_colour_chooser (10, 10, "Color", MW_HAL_LCD_RED_), false, message- } почивка; случай MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE: {mw_hal_lcd_colour_t selected_colour = message-> message_data; (невалидно) selected_colour; } почивка; по подразбиране: / * Дръжте MISRA щастлив * / break; }}

Изпълнението на кода е показано на изображението по -горе. Може да забележите, че когато се показва диалогов прозорец, трябва да отговорите на него и да го отхвърлите, преди да направите нещо друго. Това се нарича модално поведение. Диалози в MiniWin и всички винаги глобално модални и можете да имате само едно показване наведнъж. Тук има още обяснения …

en.wikipedia.org/wiki/Modal_window

Стъпка 7: Рисуване в прозореца

Рисуване в прозореца
Рисуване в прозореца

Досега сме използвали само контроли и те се чертаят сами. Време е да направим някаква персонализирана рисунка на нашия прозорец. Частта, върху която можете да рисувате, е вътре в границите (ако има такива, те са незадължителни), вътре в лентите за превъртане (ако са определени, също по избор) и под заглавната лента (ако има такава, това също е по избор). В терминологията на прозореца се нарича клиентска област.

В MiniWin има библиотека с графични команди, които можете да използвате. Всички те са наясно с прозореца. Това означава, че не е нужно да се притеснявате дали прозорецът е видим, частично затъмнен от други прозорци, включен, частично изключен или напълно извън екрана, или ако координатата на мястото, където рисувате, е върху клиентската област или извън нея. Всичко е решено за вас. Не можете да рисувате извън клиентската зона.

Рисуването върху клиентски области в терминологията на windows се нарича рисуване и всеки прозорец има функция за рисуване, където рисувате. Вие не извиквате функцията си за боядисване, а мениджърът на прозорци го прави вместо вас, когато е необходимо. Това е необходимо, когато прозорец е преместен или друг прозорец отгоре има промяна на позицията или видимостта. Ако се нуждаете от пребоядисване на прозореца, защото някои от данните, от които зависи съдържанието на прозореца, са се променили (т.е. знаете, че е необходимо пребоядисване, а не мениджърът на прозорци да знае), тогава казвате на мениджъра на прозорци, че е необходимо пребоядисване и той извиква вашата функция за боядисване. Вие сами не го наричате. (Всичко това е показано в следващия раздел).

Първо, трябва да намерите функцията си за боядисване. Генераторът на код го създава за вас и е точно над функцията за обработка на съобщения, променена в предишния раздел. Отидете на вашия проект и отворете отново файла W1.c.

В този файл ще намерите функция window_W1_paint_function (). Изглежда така:

невалиден window_W1_paint_function (mw_handle_t window_handle, const mw_gl_draw_info_t *draw_info)

{MW_ASSERT (draw_info! = (Void*) 0, "Параметър за нулев указател"); / * Попълнете клиентската област на прозореца с плътно бяло */ mw_gl_set_fill (MW_GL_FILL); mw_gl_set_solid_fill_colour (MW_HAL_LCD_WHITE); mw_gl_set_border (MW_GL_BORDER_OFF); mw_gl_clear_pattern (); mw_gl_rectangle (draw_info, 0, 0, mw_get_window_client_rect (window_handle).width, mw_get_window_client_rect (window_handle).height); / * Добавете кода за боядисване на прозорци тук */}

Това е голият генериран код и всичко, което прави, е да запълни клиентската област с плътно бяло. Нека нарисуваме запълнен с жълт кръг върху клиентската област. Първо трябва да разберем концепцията за графичен контекст (друго нещо с Windows). Ние задаваме параметри за рисуване в графичния контекст и след това извикваме обща рутина за рисуване на кръг. Нещата, които трябва да зададем в този пример, са дали кръгът има рамка, стил на гранична линия, цвят на рамката, дали кръгът е запълнен, цвят на запълване и модел на запълване. Можете да видите кода по -горе, който прави нещо подобно за запълване на клиентската област с плътен бял правоъгълник без полета. Стойностите в графичния контекст не се запомнят между всяко извикване на функцията за рисуване, така че трябва да настройвате стойностите всеки път (те обаче се запомнят с функцията за рисуване).

В горния код можете да видите, че запълването е включено и моделът за попълване е изключен, така че не е нужно да ги задаваме отново. Трябва да зададем граница, стил на гранична линия на плътен, цвят на границата на преден план на черен и цвят на запълване до жълт по следния начин:

mw_gl_set_fg_colour (MW_HAL_LCD_BLACK);

mw_gl_set_solid_fill_colour (MW_HAL_LCD_YELLOW); mw_gl_set_line (MW_GL_SOLID_LINE); mw_gl_set_border (MW_GL_BORDER_ON); mw_gl_circle (draw_info, window_simple_data.circle_x, window_simple_data.circle_y, 25);

Добавете този код към коментара в тази функция, където той казва да добавите вашия код. След това трябва да нарисуваме кръг, който се прави така:

mw_gl_circle (draw_info, 30, 30, 15);

Това изчертава кръг с координати 30, 30 с радиус 15. Повторно създайте кода и го стартирайте отново и ще видите кръг в прозореца, както е показано по -горе. Ще забележите, че кръгът и бутонът се припокриват, но бутонът е отгоре. Това е по дизайн. Контролите винаги са над всичко, което рисувате в клиентската област.

Стъпка 8: Данни на прозореца

Прозоречни данни
Прозоречни данни

Досега сме внедрили собствен код в функцията за съобщения на прозорец 1 (за обработка на входящи съобщения) и функцията му за рисуване (за рисуване върху клиентската област на прозореца). Сега е време да свържете двете. Нека запълним кръга, нарисуван във функцията за боя, с цвета, който потребителят избира от инструмента за избор на цвят при натискане на бутона. Не забравяйте, че ние не извикваме функцията за боядисване, а мениджърът на прозорци го прави, така че нашата функция за съобщения (която познава избрания цвят) не може да извика директно функцията за боядисване. Вместо това трябва да кешираме данните и да уведомим мениджъра на прозорци, че е необходимо пребоядисване. След това мениджърът на прозорци ще извика функцията за боядисване, която може да използва кешираните данни.

В горната част на W1.c ще видите празна структура от данни и обект от този тип, деклариран от генератора на код по следния начин:

typedef структура

{ / * Добавете членовете си на данни тук * / char dummy; /* Някои компилатори се оплакват от празни структури; премахнете това, когато добавите вашите членове */} window_W1_data_t; статичен window_W1_data_t window_W1_data;

Тук кешираме данните си, така че да бъдат запазени при повиквания и са известни като прозоречни данни. Трябва само да съхраним избрания цвят тук, по следния начин:

typedef структура

{ / * Добавете членовете си на данни тук * / mw_hal_lcd_colour_t selected_colour; } window_W1_data_t; статичен прозорец_W1_данни_t прозорец_W1_data = {MW_HAL_LCD_YELLOW};

Ще му дадем начален цвят жълт. Сега във функцията за съобщения ще променим кода леко, за да запазим избрания цвят тук така:

случай MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE:

{window_W1_data.chosen_colour = message-> message_data; } почивка;

След това ще променим функцията за рисуване, за да използва тази стойност, когато тя очертава кръга по следния начин:

mw_gl_set_solid_fill_colour (window_W1_data.chosen_colour);

Сега сме променили данните, от които зависи съдържанието на прозореца, така че трябва да уведомим мениджъра на прозорци, че прозорецът се нуждае от пребоядисване. Правим го във функцията за съобщения, когато се получи диалоговото съобщение OK, по следния начин:

mw_paint_window_client (съобщение-> дръжка на получателя);

Това не води до директно боядисване на прозореца. Това е помощна функция, която изпраща съобщение до мениджъра на прозорци, че прозорецът трябва да бъде пребоядисан (ако влезете в него, можете да видите как се случва това). В този случай прозорецът, който трябва да бъде пребоядисан, е самият, а дръжката на прозореца е в параметъра на съобщението към функцията за обработка на съобщения.

Целият файл сега изглежда така, ако не сте сигурни къде отиват някои от кодовите фрагменти по -горе:

#включва

#include "miniwin.h" #include "miniwin_user.h" #include "W1.h" typedef struct { / * Добавете вашите членове с данни тук * / mw_hal_lcd_colour_t selected_colour; } window_W1_data_t; статичен прозорец_W1_данни_t прозорец_W1_data = {MW_HAL_LCD_YELLOW}; void window_W1_paint_function (mw_handle_t window_handle, const mw_gl_draw_info_t *draw_info) {MW_ASSERT (draw_info! = (void *) 0, "Параметър за нулева указател"); / * Попълнете клиентската област на прозореца с плътно бяло */ mw_gl_set_fill (MW_GL_FILL); mw_gl_set_solid_fill_colour (MW_HAL_LCD_WHITE); mw_gl_set_border (MW_GL_BORDER_OFF); mw_gl_clear_pattern (); mw_gl_rectangle (draw_info, 0, 0, mw_get_window_client_rect (window_handle).width, mw_get_window_client_rect (window_handle).height); / * Добавете кода за боядисване на прозорци тук */ mw_gl_set_fg_colour (MW_HAL_LCD_BLACK); mw_gl_set_solid_fill_colour (window_W1_data.chosen_colour); mw_gl_set_line (MW_GL_SOLID_LINE); mw_gl_set_border (MW_GL_BORDER_ON); mw_gl_circle (draw_info, 30, 30, 15); } void window_W1_message_function (const mw_message_t *message) {MW_ASSERT (message! = (void *) 0, "Параметър за нулев указател"); / * Следващият ред спира предупрежденията на компилатора, тъй като променливата в момента не се използва */ (void) window_W1_data; превключвател (съобщение-> съобщение_идентификатор) {случай MW_WINDOW_CREATED_MESSAGE: / * Добавете всеки код за инициализация на прозорец тук * / break; случай MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Добавете код за обработка на прозоречното меню тук * / break; случай MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Добавете кода на манипулатора за тази контрола тук * / mw_create_window_dialog_colour_chooser (10, 10, "Color", MW_HAL_LCD_RED_), false, message- } почивка; случай MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE: {window_W1_data.chosen_colour = message-> message_data; mw_paint_window_client (съобщение-> дръжка на получателя); } почивка; по подразбиране: / * Дръжте MISRA щастлив * / break; }}

Изградете и стартирайте отново и трябва да можете да зададете цвета на запълване на кръга.

Този пример за прозоречни данни използва данни, които се съхраняват в статична структура от данни в горната част на изходния файл. Това е добре, ако имате само един екземпляр на прозореца, както правим в този пример, но ако имате повече от един екземпляр, всички те ще споделят една и съща структура от данни. Възможно е да има данни за инстанция, така че множество екземпляри от един и същ тип прозорец да имат свои собствени данни. Това е обяснено в документацията на MiniWin, намираща се в директорията docs. Примерът на файла го използва за показване на множество изображения в един и същ тип прозорец (както се вижда в основното изображение в самия връх на тази инструкция).

Стъпка 9: Няколко финални забавни шрифтове

Няколко финални забавни шрифтове
Няколко финални забавни шрифтове

MiniWin поддържа изобразяване на шрифтове TrueType. Ако има нещо, което прави вашия потребителски интерфейс да изглежда добре, това са атрактивни шрифтове. Тази последна стъпка показва как да се визуализира шрифт TrueType в прозорец MiniWin.

Има два начина за изобразяване на шрифтове TrueType. Едната е да ги нарисувате директно в клиентската зона, както беше направено за кръга по -рано, другата е да добавите контрола за текстово поле в прозореца си. Правим последното, тъй като е по -лесно.

Сега ще добавим контрола за текстово поле в нашия JSON конфигурационен файл. Добавете го в дефиницията на Window 2, така че да изглежда така:

като този:

{

"Name": "W2", "Title": "Window 2", "X": 50, "Y": 65, "Width": 100, "Height": 80, "Border": true, "TitleBar": true, "Visible": true, "Minimized": false, "TextBoxes": [{"Name": "TB1", "X": 0, "Y": 0, "Width": 115, "Height": 50, "Обосновка": "Център", "BackgroundColour": "MW_HAL_LCD_YELLOW", "ForegroundColour": "MW_HAL_LCD_BLACK", "Шрифт": "mf_rlefont_BLKCHCRY16", "Разрешено": вярно, "Видимо": вярно}]}

Накратко за шрифтовете TrueType в MiniWin. Шрифтовете идват във.ttf файлове. В мениджърите на прозорци на по -големи компютри те се изобразяват на дисплея ви, когато са необходими. Това отнема много процесорна мощност и памет и не е подходящо за малки устройства. В MiniWin те са предварително обработени в растерни изображения и свързани по време на компилиране с фиксиран размер и стил на шрифта (удебелен, курсив и т.н.), т.е. трябва да решите какви шрифтове с какъв размер и стил ще използвате по време на компилиране. Това е направено за вас за два примерни шрифта в изтегления zip файл MiniWin. Ако искате да използвате други шрифтове с други размери и стилове, вижте документацията на MiniWin в папката docs. В MiniWin за Windows и Linux има инструменти за предварителна обработка на.ttf файлове във файлове с изходен код, които можете да пуснете във вашия проект.

И втора бърза дума - повечето шрифтове са авторски, включително тези, които ще намерите в Microsoft Windows. Използвайте ги по желание за лична употреба, но всичко, което публикувате, трябва да се уверите, че лицензът, с който са публикувани шрифтовете, го позволява, както е в случая с 2 -те шрифта, включени в MiniWin, но не и с шрифтовете на Microsoft!

Обратно към кода! Генерирайте, пускайте файлове, изграждайте и стартирайте както преди и ще видите, че Window 2 вече има текст по подразбиране на жълт фон с шантав шрифт. Да променяме текста, като редактираме изходния файл на Window 2 W2.c.

Трябва да комуникираме с текстовото поле, което току -що създадохме, и начинът, по който правите това като всяка комуникация в MiniWin, е да му изпратите съобщение. Искаме да зададем текста в контролата, когато прозорецът е създаден, но преди да бъде показан, затова добавяме код в манипулатора на съобщения в случая MW_WINDOW_CREATED_MESSAGE. Това се получава от кода на прозореца точно преди прозорецът да се покаже и е предназначен за инициализации като този. Генераторът на код създаде държател на място, който изглежда така във функцията за обработка на съобщения:

случай MW_WINDOW_CREATED_MESSAGE:

/ * Добавете всеки код за инициализация на прозорец тук */ break;

Тук ще публикуваме съобщение до контрола на текстовото поле, като му казваме какъв текст искаме да показва, като използваме функцията mw_post_message по следния начин:

случай MW_WINDOW_CREATED_MESSAGE:

/ * Добавете всеки код за инициализация на прозорец тук */ mw_post_message (MW_TEXT_BOX_SET_TEXT_MESSAGE, съобщение-> получател_ръчка, text_box_TB1_handle, 0UL, "Беше тъмна и бурна нощ …", MW_CONTROL_MESSAGE); прекъсване;

Това са параметрите:

  • MW_TEXT_BOX_SET_TEXT_MESSAGE - Това е типът съобщение, което изпращаме до контролата. Те са изброени в miniwin.h и документирани в документацията.
  • съобщение-> получател_ръчка - От това е съобщението - този прозорец - чиято дръжка е в параметъра на съобщението, предаден на функцията за обработка на съобщения.
  • text_box_TB1_handle - На кого изпращаме съобщението - дръжката на контролата за текстово поле. Те са изброени в генерирания файл miniwin_user.h.
  • 0UL - стойност на данните, в този случай нищо.
  • „Беше тъмна и бурна нощ …“- Стойност на показалеца - новият текст.
  • MW_CONTROL_MESSAGE - Тип получател, който е контрола.

Това е. Повторно изграждане и повторно стартиране както обикновено и ще получите текстовото поле, показващо се на изображението по -горе.

Публикуването на съобщения е от основно значение за MiniWin (както е за всички мениджъри на прозорци). За повече примери разгледайте примерните проекти в zip файла и за изчерпателно обяснение прочетете раздела за съобщенията на MiniWin в документацията.

Стъпка 10: Продължете напред

Image
Image

Това е всичко за това основно въведение в MiniWin. MiniWin може да направи много повече, отколкото беше демонстрирано тук. Например, екранът на дъската, използван в тази инструкция, е малък, а контролите са малки и трябва да се използват с dibber. Други примери и хардуер обаче използват по -големи контроли (има 2 размера) на по -големи дисплеи и те могат да се управляват с пръст.

Има много други видове контрол от тези, демонстрирани тук. За допълнителни контроли вижте различните примерни JSON файлове в папката за генериране на код. Всички типове контроли са обхванати в тези примери.

Windows има много опции. Границата, заглавната лента и иконите се конфигурират. Можете да разполагате с ленти за превъртане и скролиращи клиентски области на прозорци, множество екземпляри от един и същ тип прозорец и прозорци могат да бъдат голи (само клиентска област, без рамка или заглавна лента), което означава, че те са фиксирани по време на компилиране на място на дисплея (вижте изображението в този раздел с големи икони с размер - това всъщност са 6 голи прозореца).

MiniWin не използва динамична памет. Това го прави подходящ за малки ограничени устройства и е изискване за някои вградени проекти. MiniWin и кодът, който генерира, също са напълно съвместими с MISRA 2012 до „необходимото“ниво.

За допълнителна информация погледнете в папката docs документацията, а също и другите примерни приложения в zip файла. Тук има примери, показващи как да използвате всички функции на MiniWin и как да интегрирате MiniWin с FatFS и FreeRTOS.

Препоръчано: