Obsah:

Vstavaný správca okien: 10 krokov
Vstavaný správca okien: 10 krokov

Video: Vstavaný správca okien: 10 krokov

Video: Vstavaný správca okien: 10 krokov
Video: 💦Blackview BV9200 ЧЕСТНЫЙ ОБЗОР ПРОТИВОУДАРНОГО 2024, Júl
Anonim
Vstavaný správca okien
Vstavaný správca okien
Vstavaný správca okien
Vstavaný správca okien
Vstavaný správca okien
Vstavaný správca okien
Vstavaný správca okien
Vstavaný správca okien

Tento projekt ukazuje, ako implementovať správcu okien s pohyblivými prekrývajúcimi sa oknami na vstavanom mikrokontroléri s panelom LCD a dotykovou obrazovkou. Existujú komerčne dostupné softvérové balíky, ktoré to robia, ale stoja peniaze a sú uzavretým zdrojom. Tento, nazývaný MiniWin, je bezplatný a open-source. Je napísaný v plne kompatibilnom jazyku C99 a je možné ho použiť v aplikácii C alebo C ++. Cieľom MiniWin je byť ľahko použiteľný, ľahko modifikovateľný, rozšíriteľný, prenosný na širokú škálu hardvéru a nie príliš hladný po zdrojoch.

Okrem poskytovania kódu na správu okien má MiniWin aj zbierku ovládacích prvkov používateľského rozhrania - tlačidlá, posuvníky, ukazovatele priebehu, stromy atď. Môžete mať viacero okien rôznych typov alebo viacero inštancií rovnakého typu. V systéme Windows je možné pohybovať, meniť jeho veľkosť, maximalizovať ho, minimalizovať, zatvárať - všetky obvyklé činnosti, ktoré s oknami vo väčších správcoch okien robíte. Písma TrueType s kerningom a vyhladzovaním (vďaka čomu vyzerá text hladko) sú podporované aj pre atraktívne vykresľovanie textu.

V každom okne máte klientsku oblasť (váš priestor vo vnútri okraja a pod hornou lištou). K tomu môžete pridať ovládacie prvky na vytvorenie dialógového okna alebo môžete použiť vstavanú grafickú knižnicu na kreslenie čo chcete. Všetky funkcie grafickej knižnice poznajú okná. Nemusíte sa starať o to, kde je vaše okno, čo ho prekrýva alebo či je minimalizované.

Okrem vytvárania vlastných okien je k dispozícii aj niekoľko štandardných dialógov, ktorých vytváranie je veľmi jednoduché - napríklad dialógové okná s potvrdením (iba tlačidlá OK alebo Áno/Nie), nastavovače času/dátumu, výber súborov, výber farieb atď.

MiniWin používa štandardný systém front správ návrhu systému Windows. Systém Windows môže interagovať navzájom a so správcom okien prostredníctvom správ. Nevoláte funkcie, aby ste robili veci priamo, pridáte správu do frontu a správca okien ju za vás uzákoní.

MiniWin bol portovaný na štandardné vývojové dosky s dotykovými displejmi od dodávateľov mikroovládačov ST, NXP a Renesas. Pre všetky tieto zariadenia existujú hardvérové ovládače a ukážkové projekty. MiniWin môže byť navyše zostavený pre Windows alebo Linux, aby ste mohli simulovať kód používateľského rozhrania skôr, ako získate vstavaný hardvér.

MiniWin má generátor kódu. Svoje okná a ovládacie prvky môžete špecifikovať jednoduchým vytvorením súboru JSON čitateľného ľuďmi a generátor kódu súbor analyzuje a vytvorí kód za vás (existuje veľa príkladov, ktoré je potrebné nasledovať). Vytvára kompletné simulačné aplikácie pre Windows alebo Linux, ktoré je možné len postaviť a je tu váš simulovaný LCD displej, na ktorom fungujú okná MiniWin. Môžete vziať presne ten istý generovaný kód a vložiť ho do vloženého projektu a mať rovnaký kód, ktorý bude zobrazovať rovnaké okná a ovládacie prvky neskôr vo vašom vstavanom hardvéri.

MiniWin nevyžaduje na vstavanom zariadení žiadnu operačnú podporu. Všetko prebieha v jednom vlákne. MiniWin môže byť integrovaný s RTOS bežiacim na vstavanom procesore a existujú príklady integrácie MiniWin s FreeRTOS.

Tento návod ukazuje, ako uviesť MiniWin do prevádzky na procesore STM32 M4 pomocou lacnej dosky STM32F429 Discovery, ktorá sa dodáva s už priloženým dotykovým displejom QVGA. Tieto sú ľahko dostupné u vášho dodávateľa elektronických súčiastok.

MiniWin beží na mikrořadičoch strednej triedy a vyšších.

Zásoby

Vývojová doska STM32F429I-DISC1 a kábel micro USB

STM32CubeIDE na stiahnutie, ktoré je zadarmo.

Krok 1: Získanie kódu

Získanie kódu
Získanie kódu

Najprv musíte nainštalovať STM32CubeIDE. To získate z webovej stránky ST. Musíte sa zaregistrovať a jeho stiahnutie a nainštalovanie chvíľu trvá. To všetko je zadarmo.

Počas inštalácie si stiahnite zdroj MiniWin a rozbaľte ho. Je veľký, ale použijete iba jeho malú časť. Tu kliknite na zelené tlačidlo „Klonovať alebo stiahnuť“…

github.com/miniwinwm/miniwinwm

potom zvoľte Stiahnuť zip. Rozbaľte obsah.

Krok 2: Budovanie príkladného projektu

Budovanie príkladného projektu
Budovanie príkladného projektu
Budovanie príkladného projektu
Budovanie príkladného projektu

Najprv si postavme jeden z príkladov projektov. Dobrý sa nazýva MiniWinSimple. Spustite STM32CubeIDE a postupujte takto:

  1. Vyberte Súbor | Importovať…
  2. Otvorte Všeobecné a vyberte Existujúci projekt do pracovného priestoru. Ďalšie.
  3. Kliknite na položku Prehľadávať a prejdite na miesto, kde ste rozbalili program MiniWin. Potom prejdite do priečinka STM32CubeIDE / MiniWinSimple / STM32F429. Kliknite na položku Vybrať priečinok.
  4. V projekte: zaškrtnite MiniWinSimple_STM32F429 a potom kliknite na Dokončiť.
  5. Projekt MiniWinSimple_STM32F429 sa objaví v programe Project Explorer. Vyberte ho a potom ho vytvorte pomocou Project | Build Project.
  6. Teraz zapojte kábel USB do dosky a počítača a spustite ho pomocou príkazu Spustiť | Ladiť a po stiahnutí vyberte položku Spustiť | Obnoviť. Prvýkrát dostanete obrazovku kalibrácie obrazovky, takže sa dotknite stredu troch krížikov na LCD displeji. Teraz môžete pracovať s oknom na displeji.

Ak chcete okno posunúť, potiahnite ho za jeho záhlavie. Ak chcete zmeniť veľkosť okna, použite ikonu bieleho trojuholníka v ľavej časti záhlavia. Veľkosť okien okien MiniWin nie je možné meniť ťahaním za okraje, pretože displeje, na ktorých sa MiniWin používa, sú príliš malé. Na minimalizáciu, maximalizáciu alebo zatvorenie okna použite ikony na pravom konci záhlavia (zatváranie môže byť deaktivované). Keď je okno minimalizované, nemôžete minimalizované ikony presúvať. Budujú sa zdola zľava doprava.

Krok 3: Spustenie generátora kódu

Spustenie generátora kódu
Spustenie generátora kódu

Teraz zmeníme ukážkový projekt vygenerovaním niektorých vlastných okien a vložením nového kódu. Na tento účel spustíme generátor kódu.

  1. Otvorte príkazový riadok a prejdite do priečinka, kde ste rozbalili program MiniWin, a potom do priečinka Tools / CodeGen.
  2. Spustiteľný súbor pre Windows CodeGen.exe je už k dispozícii. V prípade Linuxu ho musíte vytvoriť zadaním príkazu make. (Môžete si ho tiež vytvoriť zo zdroja pre Windows, ak vám robí starosti spustený stiahnutý spustiteľný súbor, ale potrebujete nainštalovaný kompilátor a vývojové prostredie. Podrobnosti nájdete v dokumentácii MiniWin v priečinku docs).
  3. V tomto priečinku je niekoľko príkladov súborov JSON. Použijeme example_empty.json. Ak ho chcete nastaviť pre Windows alebo Linux, musíte ho najskôr upraviť. Otvorte ho v editore a v hornej časti stránky, kde nájdete „TargetType“, zmeňte hodnotu „Linux“alebo „Windows“na hodnotu, na ktorej spustíte generátor kódu.
  4. Teraz zadajte príkaz codegen example_empty.json do príkazového riadka.
  5. Prejdite na svoj projekt v STM32CubeIDE a otvorte priečinok MiniWinSimple_Common. Vymažte tam všetky súbory.
  6. „TargetName“v súbore JSON sme ponechali predvolene na „MiniWinGen“, takže sa tak volá náš priečinok s vygenerovaným kódom. Prejdite do priečinka, v ktorom ste rozbalili program MiniWin, a potom do priečinka MiniWinGen_Common. Teraz vyberte všetky tieto súbory a presuňte ich myšou do priečinka STM32CubeIDE v priečinku MiniWinSimple_Common projektu.
  7. Teraz znova vytvorte a znova spustite projekt v STM32CubeIDE a zobrazí sa vaše nové okno návrhu. Tlačidlo v okne zmizlo, pretože example_empty.json nedefinuje žiadne.

Krok 4: Pridanie okna

Pridanie okna
Pridanie okna

Teraz pridáme druhé okno do konfiguračného súboru JSON a regenerujeme kód.

1. Otvorte example_empty.json v textovom editore.

2. V časti „Windows“je pole definícií okien, ktoré má v súčasnosti iba jedno okno. Skopírujte toto všetko…

{

"Názov": "W1", "Názov": "Okno 1", "X": 10, "Y": 15, "Šírka": 200, "Výška": 180, "Okraj": true, "TitleBar": true, "Visible": true, "Minimized": false}

a znova ho prilepte čiarkou oddeľujúcou 2 definície.

3. Zmeňte „W1“na „W2“a „Okno 1“na „Okno 2“. Zmeňte hodnoty „X“, „Y“, „Šírka“a „Výška“na rôzne hodnoty. Nezabudnite, že rozlíšenie obrazovky je 240 x 320 mm.

4. Uložte súbor a znova spustite generátor kódu.

5. Skopírujte súbory ako v predchádzajúcom kroku, znova vytvorte a znova spustite. Teraz budete mať na displeji 2 okná.

Krok 5: Pridanie ovládacieho prvku

Pridanie ovládacieho prvku
Pridanie ovládacieho prvku

Teraz do vášho nového okna pridáme niekoľko ovládacích prvkov. Upravte rovnaký súbor ako v predchádzajúcom kroku.

1. Do špecifikácie pre okno W1 pridajte čiarku za posledným nastavením („Minimalizované“: false) a potom pridajte tento text

"MenuBar": pravda, „MenuBarEnabled“: pravda, „Položky ponuky“: [„Fred“, „Bert“, „Pete“, „Alf“, „Ian“], „Tlačidlá“: [{„Názov“: „B1“, „Štítok“: "Button1", "X": 10, "Y": 10, "Enabled": true, "Visible": true}]

Táto časť pridáva panel s piatimi položkami a povoľuje ho (panely s ponukami je možné globálne deaktivovať, vyskúšajte). Tiež pridá tlačidlo, ktoré je povolené a viditeľné (môžu byť vytvorené ako neviditeľné a neskôr zviditeľnené v kóde).

2. Znovu vytvorte kód, skopírujte ho, znova vytvorte a znova spustite všetko ako predtým.

Krok 6: Nútenie ovládačov niečo urobiť

Nútenie ovládačov k niečomu
Nútenie ovládačov k niečomu

Teraz máme základné používateľské rozhranie, ktoré potrebujeme na to, aby niečo robilo. V tomto prípade vyskočíme dialógové okno pre výber farby po stlačení tlačidla v okne 1.

Prejdite na svoj projekt v STM32CubeIDE a otvorte priečinok MiniWinSimple_Common a potom otvorte súbor W1.c (názov tohto súboru zodpovedá poli „Názov“okna v súbore JSON pri generovaní kódu).

V tomto súbore nájdete funkciu window_W1_message_function (). Vyzerá to takto:

neplatné window_W1_message_function (const mw_message_t *správa) {MW_ASSERT (správa! = (void *) 0, "Parameter nulového ukazovateľa"); / * Ďalší riadok zastaví varovanie kompilátora, pretože premenná je momentálne nevyužitá */ (neplatné) window_W1_data; prepínač (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Pridajte sem ľubovoľný inicializačný kód okna * / break; prípad MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Sem pridajte kód spracovania okna ponuky * / break; prípad MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Sem zadajte svoj kód obsluhy pre tento ovládací prvok * /} break; predvolené: / * Nechajte MISRA šťastnú * / prestávku; }}

Hovorí to správca okien pre toto okno vždy, keď potrebuje správca okien oznámiť oknu, že sa niečo stalo. V tomto prípade nás zaujíma, že bolo stlačené jediné tlačidlo okna. V príkaze switch pre typy správ uvidíte prípad pre MW_BUTTON_PRESSED_MESSAGE. Tento kód sa spustí po stlačení tlačidla. V tomto okne je iba jedno tlačidlo, ale môže ich byť aj viac, takže sa kontroluje, ktoré tlačidlo to je. V tomto prípade to môže byť iba tlačidlo B1 (názov opäť zodpovedá názvu tlačidla v súbore JSON).

Takže po tomto štítku prípadu pridajte kód, aby sa otvorilo dialógové okno na výber farby, ktoré je toto:

mw_create_window_dialog_colour_chooser (10, 10, "Color", MW_HAL_LCD_RED, false, message-> recipient_handle);

Parametre sú nasledujúce:

  • 10, 10 je umiestnenie na obrazovke dialógového okna
  • „Farba“je názov dialógového okna
  • MW_HAL_LCD_RED je predvolená farba, ktorou začne dialógové okno
  • nepravda znamená, že sa nezobrazuje veľká veľkosť (skúste ju nastaviť na hodnotu true a uvidíte rozdiel)
  • message-> handle handle is who own this dialog, in this case it's this window. V parametri správy funkcie je popisovač okna. Toto je okno, do ktorého sa odošle dialógová odpoveď.

Na zistenie hodnoty farby, ktorú si užívateľ vybral, správca okien pošle nášmu oknu správu so zvolenou farbou, keď používateľ v dialógovom okne stlačí tlačidlo OK. Preto musíme túto správu zachytiť aj v inom prípade v príkaze switch, ktorý vyzerá takto:

prípad MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE:

{mw_hal_lcd_colour_t selected_colour = message-> message_data; (neplatné) selected_colour; } prestávka;

Zatiaľ so zvolenou farbou nič nerobíme, takže ju iba zrušíme, aby sme zabránili varovaniu kompilátora. Konečný kód tejto funkcie teraz vyzerá takto:

neplatné window_W1_message_function (konšt. mw_message_t *správa)

{MW_ASSERT (správa! = (Void*) 0, "Parameter nulového ukazovateľa"); / * Ďalší riadok zastaví varovanie kompilátora, pretože premenná je momentálne nevyužitá */ (neplatné) window_W1_data; prepínač (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Pridajte sem ľubovoľný inicializačný kód okna * / break; prípad MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Sem pridajte kód spracovania okna ponuky * / break; prípad MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Sem zadajte svoj kód obsluhy pre tento ovládací prvok * / mw_create_window_dialog_colour_chooser (10, 10, "Color", MW_HAL_LCD_RED, false, message-> recipient_hand } prestávka; prípad MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE: {mw_hal_lcd_colour_t selected_colour = message-> message_data; (neplatné) selected_colour; } prestávka; predvolené: / * Nechajte MISRA šťastnú * / prestávku; }}

Spustenie kódu je znázornené na obrázku vyššie. Môžete si všimnúť, že keď sa dialógové okno zobrazuje, musíte naň odpovedať a odmietnuť ho skôr, ako urobíte čokoľvek iné. Toto sa nazýva modálne správanie. Dialógy v MiniWine a všetky sú vždy globálne modálne a súčasne sa môže zobrazovať iba jeden. Tu je viac vysvetlení …

en.wikipedia.org/wiki/Modal_window

Krok 7: Kreslenie v okne

Kresba v okne
Kresba v okne

Doteraz sme používali iba ovládacie prvky a kreslia sa samy. Je čas urobiť nejaké vlastné kreslenie v našom okne. Časť, na ktorú môžete nakresliť, je vo vnútri okrajov (ak existujú, sú voliteľné), vo vnútri posúvačov (ak sú definované, tiež voliteľné) a pod záhlavím (ak existuje, je to tiež voliteľné). V okennej terminológii sa to nazýva klientska oblasť.

V MiniWin je knižnica grafických príkazov, ktoré môžete použiť. Všetci sú si vedomí okna. To znamená, že si nemusíte lámať hlavu s tým, či je okno viditeľné, čiastočne zakryté inými oknami, zapnuté, čiastočne vypnuté alebo úplne mimo obrazovku, alebo ak súradnice toho, kde kreslíte, sú v klientskej oblasti alebo mimo nej.. O to všetko je postarané. Nemôžete kresliť mimo svojej klientskej oblasti.

Kreslenie na klientske oblasti sa v terminológii okien nazýva maľovanie a každé okno má funkciu maľovania, pri ktorej kreslíte. Nevoláte svoju funkciu maľovania, správca okien to urobí za vás, keď je to potrebné. Je to potrebné pri presúvaní okna alebo zmene polohy alebo viditeľnosti iného okna na vrchu. Ak potrebujete prefarbiť svoje okno, pretože sa zmenili niektoré údaje, na ktorých závisí obsah okna (tj. Viete, že je potrebné prekreslenie, nie aby to vedel správca okien), potom poviete správcovi okien, že je potrebné prekresliť a ten zavolá vaša funkcia lakovania. Nevoláš to sám. (To všetko je ukázané v nasledujúcej časti.)

Najprv musíte nájsť svoju funkciu lakovania. Generátor kódu ho vytvorí za vás a je tesne nad funkciou obsluhy správ upravenou v predchádzajúcej časti. Prejdite na svoj projekt a znova otvorte súbor W1.c.

V tomto súbore nájdete funkciu window_W1_paint_function (). Vyzerá to takto:

neplatné window_W1_paint_function (mw_handle_t window_handle, const mw_gl_draw_info_t *draw_info)

{MW_ASSERT (draw_info! = (Void*) 0, "Parameter nulového ukazovateľa"); / * Vyplňte klientsku oblasť okna plnou bielou farbou */ 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); / * Pridajte sem kód na maľovanie okien */}

Toto je holý generovaný kód a všetko, čo robí, je vyplniť klientsku oblasť plným bielym. Nakreslime žltý vyplnený kruh na klientskej ploche. Najprv musíme porozumieť konceptu grafického kontextu (iná vec s oknami). Nastavíme parametre kresby v grafickom kontexte a potom zavoláme generickú rutinu kreslenia kruhu. V tomto príklade musíme nastaviť, či má kruh ohraničenie, štýl hraničnej čiary, farbu orámovania, či je kruh vyplnený, farbu výplne a vzor výplne. Vyššie vidíte kód, ktorý robí niečo podobné pri vypĺňaní klientskej oblasti bielym obdĺžnikom bez okrajov. Hodnoty v grafickom kontexte sa medzi každým volaním funkcie maľovania nepamätajú, takže ich musíte nastaviť vždy (zapamätajú si ich však aj pri funkcii maľovania).

Vo vyššie uvedenom kóde vidíte, že výplň je zapnutá a vzor výplne je vypnutý, takže ich nemusíme znova nastavovať. Potrebujeme nastaviť ohraničenie, štýl hraničnej čiary na plnú, farbu popredia na čiernu a farbu výplne na žltú takto:

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);

Pridajte tento kód do komentára v tejto funkcii, kde sa hovorí, že chcete pridať svoj kód. Ďalej musíme nakresliť kruh, ktorý sa robí takto:

mw_gl_circle (draw_info, 30, 30, 15);

Tým sa nakreslí kruh na súradniciach 30, 30 s polomerom 15. Znovu vytvorte kód a znova ho spustite a v okne uvidíte kruh, ako je to znázornené vyššie. Všimnete si, že kruh a tlačidlo sa prekrývajú, ale tlačidlo je navrchu. Toto je zámerné. Ovládacie prvky sú vždy nad všetkým, čo nakreslíte v klientskej oblasti.

Krok 8: Údaje okna

Údaje okna
Údaje okna

Doteraz sme implementovali vlastný kód do funkcie správ okna 1 (na spracovanie prichádzajúcich správ) a do jeho funkcie maľovania (na kreslenie v klientskej oblasti okna). Teraz je čas tieto dve veci prepojiť. Poďme vyplniť kruh nakreslený vo funkcii maľovania farbou, ktorú si užívateľ zvolí pomocou výberu farby pri stlačení tlačidla. Pamätajte si, že nenazývame funkciu maľovania, robí to správca okien, takže naša funkcia správ (ktorá pozná zvolenú farbu) nemôže volať funkciu maľovania priamo. Namiesto toho musíme údaje uložiť do vyrovnávacej pamäte a nechať správcu okien vedieť, že je potrebné prekreslenie. Správca okien potom zavolá funkciu maľovania, ktorá môže použiť údaje uložené vo vyrovnávacej pamäti.

V hornej časti W1.c uvidíte prázdnu dátovú štruktúru a objekt tohto typu deklarovaný generátorom kódu takto:

typedef struct

{ / * Pridajte sem svojich dátových členov * / char dummy; /* Niektorí prekladatelia sa sťažujú na prázdne štruktúry; odstráňte to, keď pridáte svojich členov */} window_W1_data_t; statické okno_W1_data_t okno_W1_data;

Tu ukladáme naše údaje do vyrovnávacej pamäte, aby sa zachovali vo všetkých hovoroch, a označujú sa ako údaje okna. Tu musíme uložiť iba zvolenú farbu, a to takto:

typedef struct

{ / * Pridajte sem svojich údajových členov * / mw_hal_lcd_colour_t selected_colour; } window_W1_data_t; statické okno_W1_data_t okno_W1_data = {MW_HAL_LCD_YELLOW};

Dáme mu počiatočnú farbu žltej. Teraz vo funkcii správy mierne zmeníme kód, aby sme tu uložili zvolenú farbu takto:

prípad MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE:

{window_W1_data.chosen_colour = message-> message_data; } prestávka;

Potom zmeníme funkciu maľovania tak, aby používala túto hodnotu, keď nakreslí kruh takto:

mw_gl_set_solid_fill_colour (window_W1_data.chosen_colour);

Teraz sme zmenili údaje, od ktorých závisí obsah okna, takže musíme správcovi okien oznámiť, že okno potrebuje prelakovať. Robíme to vo funkcii správy, keď je prijaté dialógové okno OK, takto:

mw_paint_window_client (message-> recipient_handle);

To nespôsobí priame natretie okna. Je to pomocná funkcia, ktorá posiela správcovi okien správu, že je potrebné okno prekresliť (ak doň vkročíte, vidíte, ako sa to deje). Okno, ktoré je v tomto prípade potrebné prekresliť, je samo o sebe a popisovač okna je v parametri správy pre funkciu obsluhy správ.

Celý súbor teraz vyzerá takto, ak si nie ste istí, kam smerujú niektoré z vyššie uvedených úryvkov kódu:

#zahrnúť

#include "miniwin.h" #include "miniwin_user.h" #include "W1.h" typedef struct { / * Pridajte sem svojich dátových členov * / mw_hal_lcd_colour_t selected_colour; } window_W1_data_t; statické okno_W1_data_t okno_W1_data = {MW_HAL_LCD_YELLOW}; neplatné window_W1_paint_function (mw_handle_t window_handle, const mw_gl_draw_info_t *draw_info) {MW_ASSERT (draw_info! = (void *) 0, "Null pointer parameter"); / * Vyplňte klientsku oblasť okna plnou bielou farbou */ 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); / * Pridajte sem kód na maľovanie okien */ 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); } neplatné window_W1_message_function (const mw_message_t *správa) {MW_ASSERT (správa! = (void *) 0, "Parameter nulového ukazovateľa"); / * Ďalší riadok zastaví varovanie kompilátora, pretože premenná je momentálne nevyužitá */ (neplatné) window_W1_data; prepínač (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Pridajte sem ľubovoľný inicializačný kód okna * / break; prípad MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Sem pridajte kód spracovania okna ponuky * / break; prípad MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Sem zadajte svoj kód obsluhy pre tento ovládací prvok * / mw_create_window_dialog_colour_chooser (10, 10, "Color", MW_HAL_LCD_RED, false, message-> recipient_hand } prestávka; prípad MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE: {window_W1_data.chosen_colour = message-> message_data; mw_paint_window_client (message-> recipient_handle); } prestávka; predvolené: / * Nechajte MISRA šťastnú * / prestávku; }}

Postavte a spustite znova a mali by ste byť schopní nastaviť farbu výplne kruhu.

Tento príklad údajov z okna používa údaje, ktoré sú uložené v štruktúre statických údajov v hornej časti zdrojového súboru. Je to v poriadku, ak máte iba jednu inštanciu okna, ako to robíme v tomto prípade, ale ak máte viac ako jednu inštanciu, všetky budú zdieľať rovnakú dátovú štruktúru. Je možné mať údaje pre jednu inštanciu, takže viacero inštancií rovnakého typu okna má svoje vlastné údaje. To je vysvetlené v dokumentácii MiniWin nachádzajúcej sa v adresári docs. Príklad súboru ho používa na zobrazenie viacerých obrázkov v rovnakom type okna (ako je vidieť na hlavnom obrázku v hornej časti tohto pokynu).

Krok 9: Trochu zábavy s konečným písmom

Nejaká zábava s konečným písmom
Nejaká zábava s konečným písmom

MiniWin podporuje vykresľovanie písem TrueType. Ak existuje jedna vec, vďaka ktorej vyzerá vaše používateľské rozhranie dobre, sú to atraktívne písma. Tento posledný krok ukazuje, ako vykresliť písmo TrueType v okne MiniWin.

Existujú dva spôsoby vykresľovania písem TrueType. Jedným z nich je nakresliť ich priamo do klientskej oblasti, ako to bolo pre kruh predtým, druhým je pridať do okna ovládací prvok textového poľa. Robíme to druhé, pretože je to jednoduchšie.

Teraz do nášho konfiguračného súboru JSON pridáme ovládací prvok textového poľa. Pridajte ho do definície okna 2, aby vyzeral takto:

Páči sa ti to:

{

"Názov": "W2", "Názov": "Okno 2", "X": 50, "Y": 65, "Šírka": 100, "Výška": 80, "Okraj": true, "TitleBar": true, "Visible": true, "Minimized": false, "TextBoxes": [{"Name": "TB1", "X": 0, "Y": 0, "Width": 115, "Height": 50, „Odôvodnenie“: „Stred“, „BackgroundColour“: „MW_HAL_LCD_YELLOW“, „ForegroundColour“: „MW_HAL_LCD_BLACK“, „Písmo“: „mf_rlefont_BLKCHCRY16“, „Povolené“: true, „Viditeľné“: true}]}}

Krátke slovo o písmach TrueType v MiniWin. Písma sa dodávajú v súboroch.ttf. V správcoch okien na väčších počítačoch sa tieto podľa potreby vykreslia na váš displej. Vyžaduje veľa výpočtového výkonu a pamäte a nie je vhodný pre malé zariadenia. V MiniWin sú vopred spracované na bitmapy a prepojené v čase kompilácie s pevnou veľkosťou a štýlom písma (tučné, kurzívou atď.), Tj. Musíte sa rozhodnúť, aké písma v akej veľkosti a štýle budete pri kompilácii používať. To ste urobili za dve vzorové písma v stiahnutom súbore ZIP MiniWin. Ak chcete použiť iné písma v iných veľkostiach a štýloch, pozrite si dokumentáciu MiniWin v priečinku docs. V programe MiniWin pre Windows a Linux existujú nástroje na predbežné spracovanie súborov.ttf na súbory zdrojového kódu, ktoré môžete vložiť do svojho projektu.

A druhé krátke slovo - väčšina písem je chránená autorskými právami, vrátane tých, ktoré nájdete v systéme Microsoft Windows. Používajte ich ľubovoľne na osobné použitie, ale všetko, čo publikujete, musíte zaistiť, aby to licencia, s ktorou sú písma publikované, umožňovala, ako je to v prípade dvoch písem zahrnutých v programe MiniWin, ale nie v písmach spoločnosti Microsoft!

Späť na kód! Generujte, presúvajte súbory, zostavujte a znova spustite ako predtým a uvidíte, že Okno 2 má teraz predvolený text na žltom pozadí v šialenom písme. Umožňuje zmeniť text úpravou zdrojového súboru W2.c. okna 2.

Musíme komunikovať s textovým poľom, ktoré sme práve vytvorili, a spôsobom, akým to robíte, je ako pre každú komunikáciu v MiniWin odoslanie správy. Chceme v ovládacom prvku nastaviť text pri vytváraní okna, ale skôr, ako sa zobrazí, preto do obslužného programu správy v prípade MW_WINDOW_CREATED_MESSAGE pridáme kód. Toto je prijaté kódom okna tesne pred zobrazením okna a je určené na inicializáciu, ako je táto. Generátor kódu vytvoril zástupný znak, ktorý vo funkcii obsluhy správ vyzerá takto:

prípad MW_WINDOW_CREATED_MESSAGE:

/ * Sem pridajte ľubovoľný inicializačný kód okna */ break;

Tu pošleme správu do ovládacieho prvku textového poľa, v ktorej mu povieme, aký text chceme, aby zobrazoval pomocou funkcie mw_post_message, ako je táto:

prípad MW_WINDOW_CREATED_MESSAGE:

/ * Sem pridajte ľubovoľný inicializačný kód okna */ mw_post_message (MW_TEXT_BOX_SET_TEXT_MESSAGE, message-> recipient_handle, text_box_TB1_handle, 0UL, „Twas a dark and stormy night…“, MW_CONTROL_MESSAGE); prestávka;

Toto sú parametre:

  • MW_TEXT_BOX_SET_TEXT_MESSAGE - Toto je typ správy, ktorý odosielame ovládaciemu prvku. Sú uvedené v súbore miniwin.h a zdokumentované v dokumentácii.
  • message-> recipient_handle - Od koho je správa - toto okno - ktorého popisovač je v parametri správy odovzdaný do funkcie obsluhy správ.
  • text_box_TB1_handle - Komu posielame správu - popisovač ovládacieho prvku textového poľa. Tieto sú uvedené vo vygenerovanom súbore miniwin_user.h.
  • 0UL - údajová hodnota, v tomto prípade nič.
  • „Bola to temná a búrlivá noc …“- Hodnota ukazovateľa - nový text.
  • MW_CONTROL_MESSAGE - typ príjemcu, ktorý je ovládacím prvkom.

To je všetko. Znovu zostavte a spustite znova ako obvykle a zobrazí sa textové pole ako na obrázku vyššie.

Odosielanie správ je pre MiniWin zásadné (ako pre všetkých správcov okien). Ďalšie príklady nájdete v ukážkových projektoch v súbore zip a komplexné vysvetlenie nájdete v sekcii správ MiniWin v dokumentácii.

Krok 10: Choďte ďalej

Image
Image

To je všetko pre tento základný úvod do MiniWin. MiniWin dokáže oveľa viac, ako sa tu ukázalo. Napríklad obrazovka na doske použitá v tomto návode je malá a ovládacie prvky sú malé a je potrebné ich používať s dibberom. Iné príklady a hardvér však používajú väčšie ovládače (existujú 2 veľkosti) na väčších displejoch, ktoré je možné ovládať prstom.

Existuje mnoho ďalších typov ovládacích prvkov, než aké sú tu demonštrované. Ďalšie ovládacie prvky nájdete v rôznych ukážkových súboroch JSON v priečinku generátora kódu. V týchto príkladoch sú zahrnuté všetky typy ovládacích prvkov.

Windows má veľa možností. Okraj, záhlavie a ikony je možné konfigurovať. Môžete mať klientske oblasti posuvných pruhov a posúvacích okien, viacero inštancií rovnakého typu okna a okien môže byť nahých (iba klientská oblasť, žiadne ohraničenie alebo záhlavie), čo znamená, že sú na mieste zobrazenia fixované v čase kompilácie (pozrite si obrázok v tejto sekcii s veľkými ikonami - to je v skutočnosti 6 nahých okien).

MiniWin nepoužíva žiadnu dynamickú pamäť. Vďaka tomu je vhodný pre malé obmedzené zariadenia a je požiadavkou niektorých vstavaných projektov. MiniWin a kód, ktorý generuje, je tiež plne kompatibilný s MISRA 2012 na „požadovanej“úrovni.

Ďalšie informácie nájdete v priečinku docs pre dokumentáciu a tiež ďalšie ukážkové aplikácie v súbore zip. Tu sú príklady, ktoré ukazujú, ako používať všetky funkcie MiniWin a ako integrovať MiniWin s FatFS a FreeRTOS.

Odporúča: