Мазмуну:

Камтылган терезе менеджери: 10 кадам
Камтылган терезе менеджери: 10 кадам

Video: Камтылган терезе менеджери: 10 кадам

Video: Камтылган терезе менеджери: 10 кадам
Video: Где скачать Microsoft PC Manager? Как запустить? 2024, Ноябрь
Anonim
Камтылган терезе менеджери
Камтылган терезе менеджери
Камтылган терезе менеджери
Камтылган терезе менеджери
Камтылган терезе менеджери
Камтылган терезе менеджери
Камтылган терезе менеджери
Камтылган терезе менеджери

Бул долбоор ЖК панели жана сенсордук экраны бар камтылган микроконтроллерде кыймылдуу капталган терезелери бар терезе башкаруучусун кантип ишке ашырууну көрсөтөт. Бул үчүн коммерциялык жактан жеткиликтүү программалык пакеттер бар, бирок алар акчага турат жана жабык булак. MiniWin деп аталган бул бекер жана ачык булак. Бул толугу менен шайкеш C99 тилинде жазылган жана C же C ++ тиркемесинде колдонулушу мүмкүн. MiniWinдин максаттары - колдонууга оңой, өзгөртүүгө оңой, кеңейтиле турган, жабдуулардын кеңири спектрине портативдүү жана ресурстарга ач эмес.

Терезелериңизди башкаруу кодун берүү менен катар MiniWinде колдонуучу интерфейсинин башкаруу элементтеринин жыйнагы бар - баскычтар, слайдерлер, прогресс тилкелери, дарактар ж. Терезелерди жылдырууга, өлчөмүн өзгөртүүгө, чоңойтууга, минималдаштырууга, жабууга болот - чоңураак терезе башкаруучуларынын терезелери менен кылган адаттагы нерселердин баары. TrueType шрифти кернинг жана лакапка каршы (текстти smooooooth кылып көрсөтөт), ошондой эле жагымдуу текстти көрсөтүү үчүн колдоого алынат.

Ар бир терезеде сизде кардар аймагы бар (сиздин мейкиндик чек аранын ичинде жана үстүнкү тилкенин астында). Мында диалог түзүү үчүн башкаруу элементтерин кошсоңуз болот же сиз каалаган нерсени тартуу үчүн камтылган графикалык китепкананы колдоно аласыз. Графикалык китепкананын бардык функциялары терезеден кабардар. Терезеңиз кайда, эмне үстөлдөп жатат же минималдаштырылганбы деп тынчсыздануунун кажети жок.

Өзүңүздүн терезелериңизди жасоодон тышкары, кээ бир стандарттык диалогдор да бар, мисалы, ырастоо диалогдору (жөн гана ОК же Ооба/Жок баскычтары), убакыт/күндү жөндөгүчтөр, файл тандоочулар, түс тандоочулар ж.

MiniWin стандарттык терезе менеджеринин дизайн кабарлар системасын колдонот. Windows бири -бири менен жана терезе башкаруучусу менен билдирүүлөр аркылуу байланышта болот. Сиз функцияларды түздөн -түз жасоого чакырбайсыз, кезекке билдирүү кошосуз жана терезе менеджери аны сиз үчүн кабыл алат.

MiniWin ST, NXP жана Renesas микро контроллерлорунун сенсордук экрандары бар стандарттык өнүктүрүү такталарына жеткирилген. Бул түзмөктөрдүн баардык аппараттык драйверлери жана мисалдары бар. Мындан тышкары, MiniWin Windows же Linux үчүн курулган болушу мүмкүн, андыктан сиз камтылган жабдууну алганга чейин колдонуучу интерфейсинин кодун окшоштура аласыз.

MiniWinде код генератору бар. Сиз окуй турган JSON файлын түзүү үчүн терезелериңизди жана башкаруу элементтериңизди жөнөкөйлөтө аласыз жана код генератору файлды талдайт жана сиз үчүн кодду түзөт (ээрчиш керек көптөгөн мисалдар бар). Бул жөн эле курула турган Windows же Linuxтун толук симулятор тиркемелерин түзөт жана MiniWin терезелериңиз менен симуляцияланган LCD дисплейиңиз бар. Сиз так ошол эле түзүлгөн кодду алып, аны камтылган долбоорго түшүрө аласыз жана ошол эле кодду ошол эле терезелерди жана башкаруучу моменттерди кийинчерээк камтылган жабдууларыңызда көрсөтө аласыз.

MiniWin камтылган түзмөктө операциялык колдоону талап кылбайт. Мунун баары бир жип менен иштейт. MiniWin камтылган процессордо иштеген RTOS менен интеграцияланат жана MiniWinди FreeRTOS менен бириктирген мисалдар бар.

Бул көрсөтмө QWGA сенсордук экраны тиркелген арзан STM32F429 Discovery тактасын колдонуп MiniWinди STM32 M4 процессорунда кантип иштетүү керектигин көрсөтөт. Булар сиздин электроника компоненттериңизден оңой жеткиликтүү.

MiniWin орто класстагы микро контроллерлерде жана андан жогору иштейт.

Жабдуулар

STM32F429I-DISC1 өнүктүрүү тактасы жана микро USB кабели

STM32CubeIDE жүктөө бекер.

1 -кадам: Кодду алуу

Кодду алуу
Кодду алуу

Биринчи кезекте сизге STM32CubeIDE орнотулушу керек. Сиз муну СТнын веб -сайтынан аласыз. Сиз каттоодон өтүшүңүз керек жана аны жүктөө жана орнотуу үчүн бир аз убакыт керек. Мунун баары бекер.

Бул орнотуу учурунда MiniWin булагын жүктөп алып, ачыңыз. Бул чоң, бирок сиз анын кичине бөлүгүн гана колдоносуз. Жашыл 'Clone or Download' баскычын басыңыз бул жерде…

github.com/miniwinwm/miniwinwm

андан кийин Zip жүктөөнү тандаңыз. Мазмунду ачыңыз.

2 -кадам: Мисал долбоорун куруу

Мисал долбоорун куруу
Мисал долбоорун куруу
Мисал долбоорун куруу
Мисал долбоорун куруу

Адегенде мисал долбоорлордун бирин түзөлү. Жакшы MiniWinSimple деп аталат. STM32CubeIDE иштетип, андан кийин муну аткарыңыз:

  1. Файлды тандоо | Импорттоо…
  2. Жалпыды ачып, Иш мейкиндигине Учурдагы долбоорду тандаңыз. Кийинки.
  3. "Browse" баскычын чыкылдатыңыз жана MiniWinди чыгарган жериңизге өтүңүз. Андан кийин STM32CubeIDE / MiniWinSimple / STM32F429 папкасына өтүңүз. Папканы тандоо дегенди басыңыз.
  4. Долбоордо: MiniWinSimple_STM32F429 дегенди белгилеп, андан соң "Аяктоо" баскычын чыкылдатыңыз.
  5. MiniWinSimple_STM32F429 долбоору сиздин Project Explorerде пайда болот. Аны тандап, андан кийин Project | Build Project менен куруңуз.
  6. Эми USB кабелиңизди тактага жана компьютериңизге туташтырыңыз жана Run | Debug аркылуу иштетип, ал жүктөлүп алынганда Run | Resume тандаңыз. Сиз экрандын калибрлөө дисплейин биринчи жолу аласыз, андыктан LCD дисплейдеги 3 кресттин ортосуна тийип коюңуз. Эми сиз дисплейдеги терезе менен иштей аласыз.

Терезени жылдыруу үчүн аны аталыш тилкесине сүйрөңүз. Терезенин өлчөмүн өзгөртүү үчүн аталыш тилкесинин сол жагындагы ак үч бурчтуктун сөлөкөтүн колдонуңуз. MiniWin терезелеринин чектерин сүйрөө менен өлчөмүн өзгөртүүгө болбойт, анткени MiniWin колдонулган дисплейлер өтө кичине. Терезени кичирейтүү, чоңойтуу же жабуу үчүн аталыш тилкесинин оң жагындагы сүрөтчөлөрдү колдонуңуз (жабуу өчүрүлүшү мүмкүн). Терезе кичирейтилгенде, сиз минималдаштырылган сүрөтчөлөрдү жылдыра албайсыз. Алар ылдыйдан солго карай түзүлөт.

3 -кадам: Код генераторун иштетүү

Код генераторун иштетүү
Код генераторун иштетүү

Эми биз өзүбүздүн кээ бир терезелерибизди түзүү жана жаңы кодду түшүрүү аркылуу мисал долбоорун өзгөртөбүз. Бул үчүн биз код генераторун иштетебиз.

  1. Командалык кеңешти ачыңыз жана MiniWinди ачкан папкаңызга, андан кийин Tools / CodeGen папкасына өтүңүз.
  2. Windows CodeGen.exe үчүн аткарылуучу файл мурунтан эле бар. Linux үчүн сиз аны make терүү менен курушуңуз керек. (Ошондой эле, эгер сиз жүктөлүп жаткан аткарылуучу файлды иштетип жатканыңызга тынчсызданып жатсаңыз, аны Windows үчүн булактан курсаңыз болот, бирок сизге компилятор жана иштеп чыгуу чөйрөсү орнотулган болушу керек. Чоо -жайын билүү үчүн docs папкасындагы MiniWin документтерин караңыз).
  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 папкасын ачкан папкага өтүңүз. Эми бул файлдардын бардыгын тандап, долбооруңуздун MiniWinSimple_Common папкасындагы STM32CubeIDEге сүйрөп барып таштаңыз.
  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}

жана аны 2 аныктаманы бөлүп турган үтүр менен кайра чаптаңыз.

3. "W1" "W2" жана "Window 1" "Window 2" деп өзгөртүңүз. "X", "Y", "Width" жана "Height" параметрлерин экрандын 240 туурасы 320 бийиктигин эске алуу менен башка баалуулуктарга өзгөртүңүз.

4. Файлды сактап, код генераторун кайра иштетиңиз.

5. Мурунку кадамдагыдай файлдарды көчүрүү, кайра куруу жана кайра иштетүү. Эми дисплейиңизде 2 терезе болот.

5 -кадам: Control кошуу

Контролду кошуу
Контролду кошуу

Эми биз сиздин жаңы терезеңизге кээ бир башкаруу элементтерин кошобуз. Мурунку кадамдагыдай эле файлды түзөтүңүз.

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 *билдирүү) {MW_ASSERT (билдирүү! = (боштук *) 0, "Болбогон көрсөткүч параметри"); / * Кийинки сап компилятордун эскертүүлөрүн токтотот, анткени өзгөрмө учурда колдонулбайт */ (void) window_W1_data; switch (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Бул жерге каалаган терезенин инициализация кодун кошуу * / break; case MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Бул жерге терезе менюсун иштетүү кодун кошуу * / break; case MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Бул көзөмөл үчүн иштетүүчү кодуңузду бул жерге кошуңуз / /} тыныгуу; демейки: / * MISRA бактылуу болсун * / тыныгуу; }}

Бул терезе башкаруучусу тарабынан терезенин башкаруучусу терезеге бир нерсе болгонун билдириши керек болгондо чакырылат. Бул учурда биз терезенин жалгыз баскычы басылганын билүүгө кызыкдарбыз. Билдирүүнүн түрлөрү боюнча которуу билдирүүсүндө сиз MW_BUTTON_PRESSED_MESSAGE үчүн бир ишти көрөсүз. Бул код баскыч басылганда иштейт. Бул терезеде бир гана баскыч бар, бирок дагы болушу мүмкүн, андыктан ал кайсы баскыч экени текшерилет. Бул учурда ал B1 баскычы гана болушу мүмкүн (ат кайра JSON файлындагы баскычтын атына туура келет).

Ошентип, бул иштин этикеткасынан кийин, түстү тандагыч диалогун ачуу үчүн кодду кошуңуз, бул:

mw_create_window_dialog_colour_chooser (10, 10, "Түс", MW_HAL_LCD_RED, жалган, кабар-> алуучунун_колу);

Параметрлер төмөнкүдөй:

  • 10, 10 - диалогдун экранында жайгашкан жер
  • "Түс" - диалогдун аталышы
  • MW_HAL_LCD_RED - диалог баштала турган демейки түс
  • жалган каражаттар чоң өлчөмдү көрсөтпөйт (аны чындыкка коюп, айырмасын көрүңүз)
  • message-> алуучунун туткасы бул диалогдун ээси, бул учурда бул терезе. Терезенин туткасы функциянын билдирүү параметринде. Бул диалог жообу жөнөтүлө турган терезе.

Колдонуучу терезенин менеджери тандаган түстүн баалуулугун билүү үчүн, колдонуучу диалогдогу OK баскычын басканда биздин терезеге тандалган түс менен билдирүү жөнөтөт. Ошондуктан, биз бул билдирүүнү дагы окшош которуу билдирүүсүндө кармашыбыз керек:

учурда MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE:

{mw_hal_lcd_colour_t selected_colour = message-> message_data; (жараксыз) selected_colour; } тыныгуу;

Биз тандалган түс менен эч нерсе кылбайбыз, андыктан компилятордун эскертүүсүнө жол бербөө үчүн аны жокко чыгарабыз. Бул функциянын акыркы коду азыр мындай көрүнөт:

void window_W1_message_function (const mw_message_t *билдирүүсү)

{MW_ASSERT (билдирүү! = (Жараксыз*) 0, "Нөл көрсөткүчүнүн параметри"); / * Кийинки сап компилятордун эскертүүлөрүн токтотот, анткени өзгөрмө учурда колдонулбайт */ (void) window_W1_data; switch (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Бул жерге терезенин инициализация кодун кошуу * / break; case MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Бул жерге терезе менюсун иштетүү кодун кошуу * / break; case MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Бул көзөмөл үчүн иштетүүчү кодуңузду бул жерге кошуңуз / / mw_create_window_dialog_colour_chooser (10, 10, "Түс", MW_HAL_LCD_RED,) } тыныгуу; case MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE: {mw_hal_lcd_colour_t selected_colour = message-> message_data; (жараксыз) selected_colour; } тыныгуу; демейки: / * MISRA бактылуу болсун * / тыныгуу; }}

Кодду иштетүү жогорудагы сүрөттө көрсөтүлгөн. Сиз диалог көрсөтүлүп жатканда, ага жооп берип, башка эч нерсе кылардан мурун аны жокко чыгарышыңыз керек экенин байкасаңыз болот. Бул модалдык жүрүм -турум деп аталат. MiniWin диалогдору жана ар дайым глобалдык модалдык жана сиз бир эле учурда бир гана көрсөтө аласыз. Бул жерде дагы түшүндүрмө бар …

en.wikipedia.org/wiki/Modal_window

7 -кадам: Терезеде сүрөт тартуу

Терезеде сүрөт тартуу
Терезеде сүрөт тартуу

Азырынча биз көзөмөлдү гана колдондук, алар өзүлөрүн тартат. Биздин терезеге атайын сүрөт тартуу убактысы келди. Сиз тарта турган бөлүк чектердин ичинде (эгер бар болсо, алар милдеттүү эмес), жылдыруу тилкелеринин ичинде (эгер аныкталса, ошондой эле милдеттүү эмес) жана аталыш тилкесинин астында (эгер бар болсо, бул дагы милдеттүү эмес). Терезе терминологиясында ал кардар аймагы деп аталат.

MiniWinде колдоно турган графикалык буйруктардын китепканасы бар. Алардын баары терезеден кабардар. Бул терезе көрүнүп турса, жарым -жартылай башка терезелер тарабынан көмүскөдө, экранда, жарым -жартылай өчүрүлгөн же толугу менен өчүрүлгөндө, же сиз тарткан жердин координаты кардар аймагында же анын чегинен тышкары болсо, кабатыр болбоңуз дегенди билдирет.. Мунун баары сиз үчүн кам көрүлгөн. Сиз кардар зонаңыздын чегинен чыга албайсыз.

Терезелердин терминологиясындагы кардарлардын аймактарына сүрөт тартуу живопись деп аталат жана ар бир терезеде сиз сүрөт тарткан боек функциясы бар. Сиз боёк функциясын чакырбайсыз, терезе менеджери муну сиз үчүн керек болгондо жасайт. Бул терезе жылдырылганда же үстүндөгү башка терезенин орду же көрүнүшү өзгөргөндө керек. Эгерде сизге терезеңизди сырдоо керек болсо, анткени терезенин мазмуну көз каранды болгон кээ бир маалыматтар өзгөрүп кеткен (б.а. терезенин менеджерине караганда, сырдоо талап кылынарын билесиз), анда сиз терезенин менеджерине сырдоо керектигин айтасыз жана ал чакырат сиздин боек функциясы. Сиз муну өзүңүз айтпайсыз. (Мунун баары кийинки бөлүмдө көрсөтүлгөн).

Биринчиден, сиз боёк функциясын табышыңыз керек. Код генератору аны сиз үчүн жаратат жана ал мурунку бөлүмдө өзгөртүлгөн билдирүүлөрдү иштетүү функциясынын үстүндө. Долбооруңузга барып, W1.c файлын кайра ачыңыз.

Бул файлда сиз window_W1_paint_function () функциясын таба аласыз. Бул мындай көрүнөт:

void window_W1_paint_function (mw_handle_t window_handle, const mw_gl_draw_info_t *draw_info)

{MW_ASSERT (draw_info! = (Жараксыз*) 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).бийиктик); / * Бул жерге терезе сүрөтүнүн кодун кошуңуз */}

Бул код катары түзүлгөн жана ал кардардын аймагын ак түстө толтуруу. Келгиле, кардар аянтына сары толтурулган тегеректи чийели. Биринчиден, биз графикалык контексттин түшүнүгүн түшүнүшүбүз керек (башка терезе нерсеси). Биз графикалык контекстте чийме параметрлерин коебуз, андан кийин жалпы тегерек чийме тартибин чакырабыз. Бул мисалда биз белгилей турган нерселер - бул тегеректин чеги барбы, чек ара сызыгынын стили, чекиттин түсү, тегеректин толтурулгандыгы, түсүн толтуруу жана толтуруу үлгүсү. Сиз жогорудагы кодду көрө аласыз, ал кардар аймагын чексиз катуу толтурулган ак тик бурчтук менен толтурууга окшош нерсени кылат. Графикалык контексттеги баалуулуктар боёк функциясынын ар бир чакыруусунун ортосунда эсте калбайт, андыктан сиз баалуулуктарды ар дайым орнотушуңуз керек (бирок алар боёк функциясы менен эсте калат).

Жогорудагы коддо толтуруу күйгүзүлгөнүн жана толтуруу үлгүсү өчүрүлгөнүн көрө аласыз, андыктан аларды кайра коюунун кереги жок. Биз чек араны, чек ара линиясынын стилин катуу, чектин алдыңкы түсүн кара кылып, түсүн сарыга толтурушубуз керек:

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; static window_W1_data_t window_W1_data;

Бул жерде биз маалыматыбызды кэштейбиз, ошондуктан ал чалууларда сакталат жана терезе маалыматы катары белгилүү. Биз бул жерде тандалган түстү гана сакташыбыз керек:

typedef структурасы

{ / * Дайындар мүчөлөрүңүздү бул жерге кошуңуз * / mw_hal_lcd_colour_t selected_colour; } window_W1_data_t; static window_W1_data_t window_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 тандалган_түс; } window_W1_data_t; static window_W1_data_t window_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).бийиктик); / * Бул жерге терезе сүрөтүнүн кодун кошуңуз */ 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 *билдирүү) {MW_ASSERT (билдирүү! = (боштук *) 0, "Бош көрсөткүч параметри"); / * Кийинки сап компилятордун эскертүүлөрүн токтотот, анткени өзгөрмө учурда колдонулбайт */ (void) window_W1_data; switch (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Бул жерге терезенин инициализация кодун кошуу * / break; case MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Бул жерге терезе менюсун иштетүү кодун кошуу * / break; case MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Бул көзөмөл үчүн иштетүүчү кодуңузду бул жерге кошуңуз / / mw_create_window_dialog_colour_chooser (10, 10, "Түс", MW_HAL_LCD_RED,) } тыныгуу; case MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE: {window_W1_data.chosen_colour = message-> message_data; mw_paint_window_client (билдирүү-> алуучунун_колу); } тыныгуу; демейки: / * MISRA бактылуу болсун * / тыныгуу; }}

Кайра куруңуз жана чуркаңыз, анда сиз тегеректин толтуруу түсүн орното алышыңыз керек.

Терезе маалыматтарынын бул мисалы булак файлынын үстүндөгү статикалык маалымат структурасында сакталган маалыматтарды колдонот. Бул мисалдагыдай сизде терезенин бир гана мисалы болсо, бул жакшы, бирок эгерде сизде бир нече инстанция болсо, анда алар бир эле маалымат структурасын бөлүшүшөт. Ар бир инстанциянын маалыматы болушу мүмкүн, ошондуктан бир эле терезе түрүндөгү бир нече инстанциянын өз маалыматы бар. Бул docs каталогунда жайгашкан MiniWin документтеринде түшүндүрүлөт. Файлдын мисалы аны бир эле терезе түрүндө бир нече сүрөттөрдү көрсөтүү үчүн колдонот (бул көрсөтмөнүн эң башындагы башкы сүрөттө көрүнүп тургандай).

9 -кадам: Кээ бир Final Font Fun

Кээ бир Final Font Fun
Кээ бир Final Font Fun

MiniWin TrueType шрифтин көрсөтүүнү колдойт. Колдонуучу интерфейсиңизди жакшы кылган бир нерсе бар болсо, бул жагымдуу шрифттер. Бул акыркы кадам MiniWin терезесинде TrueType шрифтин кантип көрсөтүүнү көрсөтөт.

TrueType шрифттерин көрсөтүүнүн эки жолу бар. Бири - аларды мурунку чөйрө үчүн түздөн -түз кардарлар чөйрөсүнө тартуу, экинчиси - терезеңизге текст кутусунун көзөмөлүн кошуу. Биз экинчисин жасайбыз, анткени бул оңой.

Эми биз JSON конфигурация файлына текст кутусун башкарууну кошобуз. Аны 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", "Алдыңкы Түс": "MW_HAL_LCD_BLACK", "Шрифт": "mf_rlefont_BLKCHCRY16", "Иштетилген": чыныгы, "} Көрүнөт":

MiniWinдеги TrueType ариптери жөнүндө кыска сөз. Ариптер.ttf файлдарына келет. Чоңураак компьютерлердеги терезе менеджерлеринде булар керек болгондо дисплейиңизге чыгарылат. Бул көп иштетүү күчүн жана эс тутумун талап кылат жана кичинекей түзмөктөргө ылайыктуу эмес. MiniWin-де алар алдын ала битмаптарга иштетилет жана компиляциянын убагында белгиленген ариптин өлчөмү жана стили менен байланыштырылат (жоон, курсив ж.б.), башкача айтканда, компиляция убагында кандай өлчөмдө жана стильде кандай шрифттерди колдонууну чечишиңиз керек. Бул сиз жүктөгөн MiniWin zip файлындагы эки мисал шрифт үчүн жасалды. Эгерде сиз башка шрифттерди башка өлчөмдө жана стилде колдонууну кааласаңыз, docs папкасындагы MiniWin документтерин караңыз. Windows жана Linux үчүн MiniWinде куралдар бар.ttf файлдарын баштапкы коддук файлдарга алдын ала иштетүү үчүн сиз долбооруңузга түшүрө аласыз.

Экинчи ыкчам сөз - көпчүлүк шрифттер автордук укук, анын ичинде Microsoft Windowsто таба аласыз. Аларды жеке колдонуу үчүн каалагандай колдонуңуз, бирок сиз жарыялаган нерселердин баары, лицензиялар шрифттер менен басылганына, MiniWin'ге кирген 2 шрифтке окшоп, уруксат бергенине кепилдик беришиңиз керек, бирок Microsoftтун шрифти эмес!

Кайра кодго! Файлдарды жаратыңыз, таштаңыз, куруңуз жана мурункудай кайра иштетиңиз, ошондо сиз 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, message-> алуучунун_колу, text_box_TB1_handle, 0UL, "Караңгы жана бороондуу түн болду …", MW_CONTROL_MESSAGE); тыныгуу;

Бул параметрлер:

  • MW_TEXT_BOX_SET_TEXT_MESSAGE - Бул биз көзөмөлгө жөнөтүп жаткан билдирүүнүн түрү. Алар miniwin.h тизмесине киргизилген жана документтерде документтештирилген.
  • message-> receiver_handle - Бул кимден келген билдирүү - бул терезе - анын туткасы билдирүү иштетүүчү функциясына берилген билдирүү параметринде.
  • text_box_TB1_handle - Биз кимге билдирүү жөнөтүп жатабыз - текст кутусун башкаруу туткасы. Булар түзүлгөн miniwin_user.h файлында көрсөтүлгөн.
  • 0UL - Маалыматтын мааниси, бул учурда эч нерсе жок.
  • "Караңгы жана бороондуу түн болду …" - Көрсөткүчтүн мааниси - жаңы текст.
  • MW_CONTROL_MESSAGE - Алуучу түрү, бул башкаруу.

Дал ушул. Калыбына келтирүү жана адаттагыдай эле кайра иштетүү жана сиз жогорудагы сүрөттө көрсөтүлгөндөй текст кутучасын аласыз.

Билдирүүлөрдү жөнөтүү MiniWin үчүн маанилүү (бардык терезе башкаруучуларында болгондой). Көбүрөөк мисалдар үчүн zip файлындагы долбоорлордун мисалын караңыз жана кеңири түшүндүрүү үчүн документтердеги MiniWin билдирүүлөр бөлүмүн окуңуз.

10 -кадам: Мындан ары

Image
Image

Бул MiniWinге негизги киришүү үчүн. MiniWin бул жерде көрсөтүлгөндөн алда канча көптү кыла алат. Мисалы, бул көрсөтмөдө колдонулган тактадагы экран кичинекей, ал эми башкаруу элементтери кичинекей болгондуктан, аларды диббер менен колдонуу керек. Бирок, башка мисалдар жана жабдыктар чоң дисплейлерде чоңураак башкаруу элементтерин (2 өлчөмү бар) колдонушат жана муну манжалар менен иштетсе болот.

Бул жерде көрсөтүлгөндөн башка дагы көптөгөн көзөмөл түрлөрү бар. Андан ары көзөмөлдөө үчүн код генераторунун папкасындагы JSON файлдарынын ар кандай мисалын карап көрүңүз. Бардык башкаруу түрлөрү бул мисалдарда камтылган.

Windowsтун көптөгөн варианттары бар. Чек ара, титул тилкеси жана сүрөтчөлөр конфигурацияланат. Сизде жылдыруу тилкелери жана терезелердин кардар аянттары болушу мүмкүн, бир эле терезе түрүндөгү жана терезелердин бир нече жолу жылаңач болушу мүмкүн (бир гана кардар аймагы, чек же титул тилкеси жок), бул алар дисплейде компиляция убагында бекитилгендигин билдирет (чоң иконалар менен бул бөлүмдөгү сүрөттү караңыз - бул чынында 6 жылаңач терезе).

MiniWin динамикалык эс тутумун колдонбойт. Бул кичинекей чектелген түзмөктөргө ылайыктуу кылат жана кээ бир камтылган долбоорлор үчүн талап болуп саналат. MiniWin жана ал жараткан код дагы MISRA 2012ге "талап кылынган" деңгээлге ылайык келет.

Көбүрөөк маалымат алуу үчүн документтер үчүн docs папкасын жана zip файлындагы башка колдонмо мисалдарын карап көрүңүз. Бул жерде MiniWinдин бардык мүмкүнчүлүктөрүн кантип колдонууну жана MiniWinди FatFS жана FreeRTOS менен кантип бириктирүү керектигин көрсөткөн мисалдар бар.

Сунушталууда: