Vgrajen upravitelj oken: 10 korakov
Vgrajen upravitelj oken: 10 korakov
Anonim
Vgrajen upravitelj oken
Vgrajen upravitelj oken
Vgrajen upravitelj oken
Vgrajen upravitelj oken
Vgrajen upravitelj oken
Vgrajen upravitelj oken
Vgrajen upravitelj oken
Vgrajen upravitelj oken

Ta projekt prikazuje, kako implementirati upravitelja oken s premičnimi prekrivajočimi se okni na vgrajenem mikrokrmilniku z LCD ploščo in zaslonom na dotik. Za to obstajajo komercialno dostopni programski paketi, vendar stanejo denarja in so zaprti. Ta, imenovana MiniWin, je brezplačna in odprtokodna. Napisana je v popolnoma skladnem C99 in se lahko uporablja v aplikaciji C ali C ++. Cilji MiniWina so enostavni za uporabo, enostavni za spreminjanje, razširljivi, prenosni na široko paleto strojne opreme in ne preveč lačni virov.

Poleg zagotavljanja kode za upravljanje oken ima MiniWin tudi zbirko kontrolnikov za uporabniški vmesnik - gumbe, drsnike, vrstice napredka, drevesa itd. Lahko imate več oken različnih vrst ali več primerkov iste vrste. Okna je mogoče premikati, spreminjati velikost, povečati, zmanjševati, zapreti - vse običajne stvari, ki jih počnete z okni v večjih upraviteljih oken. Pisave TrueType s kerningom in izravnavo (zaradi česar je besedilo videti gladko) so podprte tudi za privlačno upodabljanje besedila.

V vsakem oknu imate območje odjemalca (vaš prostor znotraj obrobe in pod zgornjo vrstico). Tu lahko dodate kontrolnike za ustvarjanje pogovornega okna ali pa z vgrajeno grafično knjižnico narišete kar želite. Vse funkcije knjižnice grafik poznajo okna. Ni vam treba skrbeti, kje je vaše okno, kaj se prekriva ali če je zmanjšano.

Poleg izdelave lastnih oken je vključenih tudi nekaj standardnih pogovornih oken, ki jih je zelo enostavno ustvariti - na primer pogovorna okna za potrditev (samo gumbi V redu ali Da/Ne), nastavitelji časa/datuma, izbirniki datotek, izbirniki barv itd.

MiniWin uporablja standardni sistem čakalnih vrst sporočil za oblikovanje upravitelja oken. Windows lahko komunicira med seboj in upraviteljem oken prek sporočil. Ne kličete funkcij za neposredno početje, v čakalno vrsto dodate sporočilo in upravitelj oken bo to izvedel namesto vas.

MiniWin so prenesli na standardne razvojne plošče z zasloni na dotik od prodajalcev mikrokrmilnikov ST, NXP in Renesas. Za vse te naprave obstajajo gonilniki strojne opreme in primeri projektov. Poleg tega je MiniWin mogoče izdelati za Windows ali Linux, tako da lahko simulirate kodo uporabniškega vmesnika, preden dobite vgrajeno strojno opremo.

MiniWin ima generator kod. Okna in kontrolnike lahko določite v enostavni za ustvarjanje človeško berljivi datoteki JSON, generator kode pa datoteko razčleni in ustvari kodo za vas (slediti je veliko primerov). Ustvarja popolne simulacijske aplikacije za Windows ali Linux, ki jih je mogoče samo zgraditi, vaš simulirani LCD zaslon z okni MiniWin pa deluje. Lahko vzamete popolnoma enako generirano kodo in jo spustite v vdelani projekt in imate isto kodo, ki prikazuje ista okna in nadzor nad trenutki pozneje na vgrajeni strojni opremi.

MiniWin ne potrebuje operacijske podpore na vgrajeni napravi. Vse teče v eni niti. MiniWin je mogoče integrirati z RTOS -om, ki deluje na vgrajenem procesorju, obstajajo pa tudi primeri integracije MiniWin -a s FreeRTOS -om.

To navodilo prikazuje, kako zagnati MiniWin in ga zagnati na procesorju STM32 M4 z uporabo poceni plošče STM32F429 Discovery, ki ima že pritrjen zaslon na dotik QVGA. Te so enostavno na voljo pri vašem dobavitelju elektronskih komponent.

MiniWin deluje na mikrokontrolerjih srednjega razreda in novejših.

Zaloge

Razvojna plošča STM32F429I-DISC1 in kabel mikro USB

STM32CubeIDE prenos, ki je brezplačen.

1. korak: Pridobite kodo

Pridobivanje kode
Pridobivanje kode

Najprej morate namestiti STM32CubeIDE. To dobite na spletni strani ST. Morate se registrirati in traja nekaj časa, da ga naložite in namestite. Vse je brezplačno.

Med namestitvijo prenesite vir MiniWin in ga razpakirajte. Je velik, vendar ga boste uporabili le majhen del. Tukaj kliknite zeleni gumb »Kloniraj ali prenesite« …

github.com/miniwinwm/miniwinwm

nato izberite Download Zip. Razpakirajte vsebino.

2. korak: Zgradite primer projekta

Ustvarjanje primera projekta
Ustvarjanje primera projekta
Ustvarjanje primera projekta
Ustvarjanje primera projekta

Najprej zgradimo enega od primerov projektov. Dober se imenuje MiniWinSimple. Zaženite STM32CubeIDE in naredite to:

  1. Izberite Datoteka | Uvozi …
  2. Odprite Splošno in izberite Obstoječi projekt v delovni prostor. Naslednji.
  3. Kliknite Prebrskaj in se pomaknite do mesta, kjer ste razpakirali MiniWin. Nato pojdite v mapo STM32CubeIDE / MiniWinSimple / STM32F429. Kliknite Izberi mapo.
  4. V projektu: označite MiniWinSimple_STM32F429 in kliknite Dokončaj.
  5. Projekt MiniWinSimple_STM32F429 se bo pojavil v vašem raziskovalcu projektov. Izberite ga in nato zgradite z Project | Build Project.
  6. Zdaj priključite kabel USB na ploščo in računalnik in ga zaženite z uporabo Run | Debug in ko je naložen, izberite Run | Resume. Prvič boste dobili zaslon za umerjanje zaslona, zato se dotaknite središča treh križev na LCD zaslonu. Zdaj lahko komunicirate z oknom na zaslonu.

Če želite premakniti okno, ga povlecite za naslovno vrstico. Če želite spremeniti velikost okna, uporabite ikono belega trikotnika na levi strani naslovne vrstice. Velikosti oken MiniWin ni mogoče spremeniti tako, da povlečete obrobe, saj so zasloni, na katerih se uporablja MiniWin, premajhni. Če želite zmanjšati, povečati ali zapreti okno, uporabite ikone na desni strani naslovne vrstice (zapiranje je lahko onemogočeno). Ko je okno pomanjšano, zmanjšanih ikon ne morete premikati. Gradijo se od spodaj levo proti desni.

3. korak: Zaženite generator kode

Zagon generatorja kod
Zagon generatorja kod

Zdaj bomo primer projekta spremenili tako, da bomo ustvarili nekaj lastnih oken in vanj vnesli novo kodo. Če želite to narediti, bomo zagnali generator kode.

  1. Odprite ukazni poziv in pojdite v mapo, kjer ste razpakirali MiniWin, in nato v mapo Orodja / CodeGen.
  2. Izvedljiva datoteka za Windows CodeGen.exe je že na voljo. Za Linux ga morate zgraditi tako, da vnesete make. (Če ste zaskrbljeni pri izvajanju prenesene izvedljive datoteke, vendar jo potrebujete za namestitev prevajalnika in razvojnega okolja, jo lahko sestavite tudi iz vira za Windows. Podrobnosti najdete v dokumentaciji MiniWin v mapi docs).
  3. V tej mapi je nekaj primerov datotek JSON. Uporabili bomo example_empty.json. Če ga želite nastaviti za Windows ali Linux, ga morate najprej urediti. Odprite ga v urejevalniku in na vrhu, kjer boste našli "TargetType", spremenite vrednost "Linux" ali "Windows" na tisto, na čemer zaženete generator kode.
  4. Zdaj v ukazni poziv vnesite codegen example_empty.json.
  5. Pojdite na svoj projekt v STM32CubeIDE in odprite mapo MiniWinSimple_Common. Izbrišite vse datoteke tam.
  6. "TargetName" v datoteki JSON smo privzeto pustili pri "MiniWinGen", zato je to ime naše mape ustvarjene kode. Pojdite v mapo, kjer ste razpakirali MiniWin, in nato v mapo MiniWinGen_Common. Zdaj izberite vse te datoteke in jih povlecite in spustite v STM32CubeIDE v mapi MiniWinSimple_Common vašega projekta.
  7. Zdaj obnovite in znova zaženite projekt v STM32CubeIDE in prikazalo se bo vaše novo oblikovalsko okno. Gumb v oknu je izginil, ker example_empty.json ne definira nobenega.

4. korak: Dodajanje okna

Dodajanje okna
Dodajanje okna

Zdaj bomo v konfiguracijsko datoteko JSON dodali drugo okno in kodo regenerirali.

1. Odprite example_empty.json v urejevalniku besedil.

2. V razdelku "Windows" je vrsta definicij oken, ki ima trenutno samo eno okno. Kopiraj vse to …

{

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

in ga znova prilepite z vejico, ki ločuje dve definiciji.

3. Spremenite "W1" v "W2" in "Window 1" v "Window 2". Spremenite "X", "Y", "Width" in "Height" na nekatere različne vrednosti, pri tem pa upoštevajte, da je ločljivost zaslona 240 široka do 320 visoka.

4. Shranite datoteko in znova zaženite generator kode.

5. Kopirajte datoteke kot v prejšnjem koraku, jih znova sestavite in znova zaženite. Zdaj boste imeli na zaslonu 2 okna.

5. korak: Dodajanje kontrolnika

Dodajanje kontrolnika
Dodajanje kontrolnika

Zdaj bomo vašemu novemu oknu dodali nekaj kontrol. Uredite isto datoteko kot v prejšnjem koraku.

1. V specifikaciji za okno W1 dodajte vejico po zadnji nastavitvi ("Minimized": false) in dodajte to besedilo

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

Ta razdelek dodaja menijsko vrstico s 5 elementi in jo omogoča (menijske vrstice lahko globalno onemogočite, poskusite). Dodaja tudi gumb, ki je omogočen in viden (lahko jih ustvarite nevidne in jih kasneje v kodi naredite vidne).

2. Ponovno ustvarite kodo, jo kopirajte, obnovite, znova zaženite kot prej.

Korak 6: Prispevajte, da kontrolniki naredijo nekaj

Naj nadzor naredi nekaj
Naj nadzor naredi nekaj

Zdaj imamo osnovni uporabniški vmesnik, ki ga potrebujemo, da naredi nekaj. V tem primeru se prikaže pogovorno okno za izbiro barve, ko pritisnete gumb v 1. oknu.

Pojdite na svoj projekt v STM32CubeIDE in odprite mapo MiniWinSimple_Common in nato odprite datoteko W1.c (ime te datoteke ustreza okenskemu polju »Ime« v datoteki JSON, ko je bila koda ustvarjena).

V tej datoteki boste našli funkcijo window_W1_message_function (). Izgleda takole:

void window_W1_message_function (const mw_message_t *message) {MW_ASSERT (message! = (void *) 0, "Parameter ničelnega kazalca"); / * Naslednja vrstica ustavi opozorila prevajalnika, ker spremenljivka trenutno ni uporabljena */ (void) window_W1_data; switch (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Dodajte poljubno kodo za inicializacijo oken tukaj * / break; primer MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Tukaj dodajte kodo za upravljanje okenskega menija * / break; primer MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Tukaj dodajte svojo kodo upravljavca za ta nadzor * /} break; privzeto: / * Naj bo MISRA srečna * / break; }}

To okno pokliče upravitelj oken, kadar mora upravitelj oken obvestiti okno, da se je nekaj zgodilo. V tem primeru nas zanima, da je bil pritisnjen edini gumb okna. V stavku switch za vrste sporočil boste videli črko za MW_BUTTON_PRESSED_MESSAGE. Ta koda se zažene, ko pritisnete gumb. V tem oknu je samo en gumb, lahko pa bi jih bilo več, zato se preveri, kateri gumb je. V tem primeru je to lahko le gumb B1 (ime spet ustreza imenu gumba v datoteki JSON).

Torej po tej oznaki primera dodajte kodo, da se prikaže pogovorno okno za izbiro barve, to je to:

mw_create_window_dialog_colour_chooser (10, 10, "Barva", MW_HAL_LCD_RED, napačno, sporočilo-> ročaj prejemnika);

Parametri so naslednji:

  • 10, 10 je lokacija na zaslonu pogovornega okna
  • "Barva" je naslov pogovornega okna
  • MW_HAL_LCD_RED je privzeta barva, s katero se bo začelo pogovorno okno
  • false pomeni, da ne prikazujejo velike velikosti (poskusite nastaviti na true in poglejte razliko)
  • sporočilo-> ročaj prejemnika je lastnik tega pogovornega okna, v tem primeru je to okno. Ročaj okna je v parametru sporočila funkcije. To okno bo poslano v pogovornem oknu.

Če želite izvedeti vrednost barve, ki jo je uporabnik izbral, bo upravitelj oken našemu oknu poslal sporočilo z izbrano barvo, ko bo uporabnik pritisnil gumb V redu v pogovornem oknu. Zato moramo tudi to sporočilo prestreči z drugim primerom v stavku switch, ki izgleda takole:

primer MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE:

{mw_hal_lcd_colour_t selected_colour = message-> message_data; (praznina) selected_colour; } prelom;

Z izbrano barvo še ne počnemo ničesar, zato jo preprosto vržemo v void, da preprečimo opozorilo prevajalnika. Končna koda te funkcije je zdaj videti tako:

void window_W1_message_function (const mw_message_t *sporočilo)

{MW_ASSERT (message! = (Void*) 0, "Parameter ničelnega kazalca"); / * Naslednja vrstica ustavi opozorila prevajalnika, ker spremenljivka trenutno ni uporabljena */ (void) window_W1_data; switch (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Dodajte poljubno kodo za inicializacijo oken tukaj * / break; primer MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Tukaj dodajte kodo za upravljanje okenskega menija * / break; primer MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Tukaj dodajte svojo kodo upravljavca za ta nadzor * / mw_create_window_dialog_colour_chooser (10, 10, "Barva", MW_HAL_LCD_RED_prejemnik, sporočilo> false) } prelom; primer MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE: {mw_hal_lcd_colour_t selected_colour = message-> message_data; (praznina) selected_colour; } prelom; privzeto: / * Naj bo MISRA srečna * / break; }}

Zagon kode je prikazan na zgornji sliki. Morda boste opazili, da se morate, ko se prikaže pogovorno okno, odzvati nanj in ga opustiti, preden naredite kaj drugega. To se imenuje modalno vedenje. Pogovori v MiniWinu in vedno vedno globalno modalni, hkrati pa jih lahko prikažete le eno. Tu je več razlage…

en.wikipedia.org/wiki/Modal_window

7. korak: Risanje v oknu

Risba v oknu
Risba v oknu

Doslej smo uporabljali samo kontrolnike, ki se rišejo sami. Čas je, da na našem oknu narišemo risbo po meri. Del, na katerega lahko narišete, je znotraj robov (če obstajajo, so neobvezni), znotraj drsnih trakov (če je določeno, tudi neobvezno) in pod naslovno vrstico (če obstaja, je tudi to neobvezno). V terminologiji oken se to imenuje območje odjemalcev.

V MiniWinu je knjižnica grafičnih ukazov, ki jih lahko uporabite. Vsi se zavedajo oken. To pomeni, da vam ni treba skrbeti, ali je okno vidno, delno zatemnjeno zaradi drugih oken, vklopljeno, delno izklopljeno ali popolnoma izven zaslona, ali če je koordinata mesta, kjer rišete, na območju odjemalca ali zunaj njega. Zate je vse poskrbljeno. Ne morete risati zunaj območja odjemalca.

Risba na območjih odjemalcev v terminologiji oken se imenuje slikanje in vsako okno ima funkcijo barvanja, kjer risate. Svoje funkcije barvanja ne kličete, upravitelj oken to naredi namesto vas. To je potrebno, če se okno premakne ali če se drugo okno na vrhu spremeni. Če potrebujete prebarvanje okna, ker so se spremenili nekateri podatki, od katerih je odvisna vsebina okna (tj. Veste, da je potrebno prebarvanje, namesto da bi upravitelj oken vedel), upravitelju oken poveste, da je potrebna ponovna barva in pokliče vaša funkcija barvanja. Temu ne rečeš sam. (Vse to je prikazano v naslednjem razdelku).

Najprej morate najti svojo barvno funkcijo. Generator kode ga ustvari za vas in je tik nad funkcijo za obdelavo sporočil, spremenjeno v prejšnjem razdelku. Pojdite na svoj projekt in znova odprite datoteko W1.c.

V tej datoteki boste našli funkcijo window_W1_paint_function (). Izgleda takole:

void window_W1_paint_function (mw_handle_t window_handle, const mw_gl_draw_info_t *draw_info)

{MW_ASSERT (draw_info! = (Void*) 0, "Parameter ničelnega kazalca"); / * Izpolnite območje odjemalca okna s trdno belo */ 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); / * Tukaj dodajte kodo za slikanje oken */}

To je gola kot ustvarjena koda in vse, kar naredi, je, da območje odjemalca napolni s trdno belo barvo. Na površino odjemalca narišemo rumeno napolnjen krog. Najprej moramo razumeti koncept grafičnega konteksta (še ena stvar Windows). Parametre risanja nastavimo v grafičnem kontekstu in nato pokličemo generično rutino risanja kroga. V tem primeru moramo nastaviti, ali ima krog obrobo, slog mejne črte, barvo obrobe, ali je krog zapolnjen, barva polnila in vzorec polnila. Zgoraj lahko vidite kodo, ki naredi nekaj podobnega za zapolnitev odjemalskega območja s polnim belim pravokotnikom brez robov. Vrednosti v grafičnem kontekstu se ne zapomnijo med vsakim klicem funkcije barve, zato jih morate vsakič nastaviti (čeprav se spomnijo s funkcijo barvanja).

V zgornji kodi lahko vidite, da je polnjenje vklopljeno in vzorec polnjenja izklopljen, zato nam jih ni treba znova nastaviti. Moramo nastaviti mejo, slog mejne črte na trdno, barvo mejnega ospredja na črno in barvo polnila na rumeno tako:

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

Dodajte to kodo v komentar v tej funkciji, kjer piše, da dodate svojo kodo. Nato moramo narisati krog, ki je narejen tako:

mw_gl_circle (draw_info, 30, 30, 15);

To nariše krog s koordinatami 30, 30 s polmerom 15. Ponovno ustvarite kodo in jo znova zaženite, v oknu pa boste videli krog, kot je prikazano zgoraj. Opazili boste, da se krog in gumb prekrivata, vendar je gumb na vrhu. To je po zasnovi. Kontrolniki so vedno na vrhu vsega, kar narišete na območju odjemalca.

8. korak: Podatki okna

Okenski podatki
Okenski podatki

Doslej smo implementirali lastno kodo v funkcijo sporočanja okna 1 (za obdelavo dohodnih sporočil) in njeno barvno funkcijo (za risanje na odjemalskem območju okna). Zdaj je čas, da to dvoje povežemo. Zapolnimo krog, narisan v funkciji barve, z barvo, ki jo uporabnik izbere z izbirnikom barv, ko je bil pritisnjen gumb. Ne pozabite, da funkcije barvanja ne kličemo, to naredi upravitelj oken, zato naša funkcija sporočila (ki pozna izbrano barvo) ne more neposredno poklicati funkcije barvanja. Namesto tega moramo predpomniti podatke in upravitelju oken sporočiti, da je potrebno ponovno barvanje. Upravitelj oken bo nato poklical barvno funkcijo, ki lahko uporabi predpomnjene podatke.

Na vrhu W1.c boste videli prazno podatkovno strukturo in objekt te vrste, ki ga je razvil generator kode, kot je ta:

typedef struct

{ / * Tukaj dodajte svoje podatkovne člane * / char dummy; /* Nekateri prevajalniki se pritožujejo nad praznimi strukturami; odstranite to, ko dodate svoje člane */} window_W1_data_t; statično okno_W1_data_t okno_W1_data;

Tu predpomnimo naše podatke, da se ohranijo med klici in so znani kot okenski podatki. Tukaj moramo shraniti samo izbrano barvo, na primer:

typedef struct

{ / * Tu dodajte svoje podatkovne člane * / mw_hal_lcd_colour_t selected_colour; } window_W1_data_t; statično okno_W1_data_t okno_W1_data = {MW_HAL_LCD_YELLOW};

Dobili bomo začetno rumeno barvo. Zdaj bomo v funkciji sporočila kodo nekoliko spremenili, da bo izbrano barvo shranila tukaj:

primer MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE:

{window_W1_data.chosen_colour = message-> message_data; } prelom;

Nato bomo spremenili funkcijo barve, da bo uporabila to vrednost, ko nariše krog tako:

mw_gl_set_solid_fill_colour (window_W1_data.chosen_colour);

Zdaj smo spremenili podatke, od katerih je odvisna vsebina okna, zato moramo upravitelju oken sporočiti, da mora okno prebarvati. To storimo v funkciji sporočila, ko prejmemo pogovorno okno V redu, na primer:

mw_paint_window_client (sporočilo-> ročaj prejemnika);

To ne povzroči neposrednega barvanja okna. To je pomožna funkcija, ki upravitelju oken pošlje sporočilo, da je treba okno prebarvati (če stopite vanj, lahko vidite, kako se to zgodi). Okno, ki ga je treba v tem primeru prebarvati, je sam, ročaj okna pa je v parametru sporočila funkcije za obdelavo sporočil.

Celotna datoteka je zdaj videti tako, če niste prepričani, kam gredo nekateri delčki kode zgoraj:

#vključi

#include "miniwin.h" #include "miniwin_user.h" #include "W1.h" typedef struct { / * Dodajte svoje člane podatkov tukaj * / mw_hal_lcd_colour_t selected_colour; } window_W1_data_t; statično okno_W1_data_t okno_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, "Parameter ničelnega kazalca"); / * Izpolnite območje odjemalca okna s trdno belo */ 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); / * Tukaj dodajte kodo za slikanje oken */ 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, "Parameter ničelnega kazalca"); / * Naslednja vrstica ustavi opozorila prevajalnika, ker spremenljivka trenutno ni uporabljena */ (void) window_W1_data; switch (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Dodajte poljubno kodo za inicializacijo oken tukaj * / break; primer MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Tukaj dodajte kodo za upravljanje okenskega menija * / break; primer MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Tukaj dodajte svojo kodo upravljavca za ta nadzor * / mw_create_window_dialog_colour_chooser (10, 10, "Barva", MW_HAL_LCD_RED_prejemnik, sporočilo> false) } prelom; primer MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE: {window_W1_data.chosen_colour = message-> message_data; mw_paint_window_client (sporočilo-> ročaj prejemnika); } prelom; privzeto: / * Naj bo MISRA srečna * / break; }}

Zgradite in znova zaženite in lahko nastavite barvo polnjenja kroga.

Ta primer okenskih podatkov uporablja podatke, ki so shranjeni v statični podatkovni strukturi na vrhu izvorne datoteke. To je v redu, če imate samo en primerek okna, kot imamo v tem primeru, če pa imate več kot en primerek, bodo vsi delili isto podatkovno strukturo. Možno je imeti podatke za posamezen primerek, tako da ima več primerkov iste vrste oken svoje podatke. To je razloženo v dokumentaciji MiniWin v imeniku docs. Primer datoteke ga uporablja za prikaz več slik v isti vrsti okna (kot je prikazano na glavni sliki na samem vrhu tega navodila).

9. korak: Zaključna pisava

Nekaj končne pisave zabave
Nekaj končne pisave zabave

MiniWin podpira upodabljanje pisav TrueType. Če obstaja ena stvar, zaradi katere je vaš uporabniški vmesnik videti dobro, so privlačne pisave. Ta zadnji korak prikazuje, kako upodobiti pisavo TrueType v oknu MiniWin.

Pisave TrueType lahko upodabljate na dva načina. Ena je, da jih narišete neposredno na območje odjemalca, kot je bilo storjeno za krog prej, druga pa je, da v okno dodate kontrolnik za polje z besedilom. Slednje počnemo, ker je lažje.

Zdaj bomo v konfiguracijsko datoteko JSON dodali kontrolnik polja z besedilom. Dodajte ga v definicijo okna 2, tako da bo videti tako:

Všečkaj to:

{

"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, "Obrazložitev": "Center", "BackgroundColour": "MW_HAL_LCD_YELLOW", "ForegroundColour": "MW_HAL_LCD_BLACK", "Font": "mf_rlefont_BLKCHCRY16", "Enabled": true, "Visible": true}]}

Na kratko o pisavah TrueType v MiniWinu. Pisave so v datotekah.ttf. V upraviteljih oken na večjih računalnikih se ti prikažejo na zaslonu, kadar so potrebni. To zahteva veliko procesorske moči in pomnilnika in ni primerno za majhne naprave. V MiniWinu so vnaprej obdelani v bitne slike in povezani v času prevajanja s fiksno velikostjo in slogom pisave (krepko, poševno itd.). To ste naredili za vas za dve vzorčni pisavi v datoteki ZIP MiniWin, ki ste jo prenesli. Če želite uporabiti druge pisave drugih velikosti in slogov, si oglejte dokumentacijo MiniWin v mapi docs. V MiniWinu za Windows in Linux obstajajo orodja za vnaprejšnjo obdelavo datotek.ttf v datoteke izvorne kode, ki jih lahko spustite v svoj projekt.

In druga kratka beseda - večina pisav je avtorskih pravic, vključno s tistimi, ki jih najdete v sistemu Microsoft Windows. Uporabite jih po želji za osebno uporabo, vendar morate vse, kar objavite, zagotoviti, da dovoljenje, s katerim so pisave objavljene, to dovoljuje, kot velja za 2 pisavi, vključeni v MiniWin, ne pa tudi za Microsoftove pisave!

Nazaj na kodo! Ustvarjajte, spuščajte datoteke, sestavljajte in znova zaženite kot prej, in videli boste, da ima Okno 2 nekaj privzetega besedila na rumenem ozadju v čudaški pisavi. Spremenite besedilo z urejanjem izvorne datoteke Window 2 W2.c.

Komunicirati moramo z besedilnim poljem, ki smo ga pravkar ustvarili, in tako kot pri vsaki komunikaciji v MiniWinu pošljete sporočilo. Besedilo v kontrolniku želimo nastaviti, ko je okno ustvarjeno, vendar preden se prikaže, zato dodamo kodo v obravnavalec sporočil v ohišju MW_WINDOW_CREATED_MESSAGE. To prejme koda okna tik pred prikazom okna in je namenjena takšni inicializaciji. Generator kode je v funkciji obdelave sporočil ustvaril imetnik mesta, ki izgleda takole:

primer MW_WINDOW_CREATED_MESSAGE:

/ * Tukaj dodajte poljubno kodo za inicializacijo oken */ break;

Tukaj bomo v polje za besedilo objavili sporočilo, v katerem bomo povedali, katero besedilo želimo prikazati s pomočjo funkcije mw_post_message, kot je ta:

primer MW_WINDOW_CREATED_MESSAGE:

/ * Tukaj dodajte poljubno inicializacijsko kodo okna */ mw_post_message (MW_TEXT_BOX_SET_TEXT_MESSAGE, sporočilo-> ročaj_prejemnika, text_box_TB1_handle, 0UL, "Bila je temna in nevihtna noč …", MW_CONTROL_MESSAGE); zlom;

To so parametri:

  • MW_TEXT_BOX_SET_TEXT_MESSAGE - To je vrsta sporočila, ki ga pošiljamo kontrolniku. Navedeni so v miniwin.h in dokumentirani v dokumentaciji.
  • sporočilo-> naslovnik_prejemnika - Od tega je sporočilo - to okno - ročaj katerega je v parametru sporočila, posredovanem funkciji za obdelavo sporočil.
  • text_box_TB1_handle - Komu pošiljamo sporočilo - ročaj kontrole polja z besedilom. Ti so navedeni v ustvarjeni datoteki miniwin_user.h.
  • 0UL - Vrednost podatkov, v tem primeru nič.
  • "Bila je temna in nevihtna noč …" - Vrednost kazalca - novo besedilo.
  • MW_CONTROL_MESSAGE - Vrsta prejemnika, ki je kontrolnik.

To je to. Obnovite in znova zaženite kot običajno in prikazalo se bo polje z besedilom, kot je prikazano na zgornji sliki.

Objava sporočil je bistvena za MiniWin (tako kot za vse upravitelje oken). Za več primerov si oglejte primere projektov v datoteki zip in za izčrpno razlago preberite razdelek o sporočilih MiniWin v dokumentaciji.

10. korak: Pojdite dlje

Image
Image

To je to za ta osnovni uvod v MiniWin. MiniWin lahko naredi veliko več, kot je bilo prikazano tukaj. Na primer, zaslon na plošči, uporabljen v tem navodilu, je majhen, kontrolniki pa majhni in jih je treba uporabljati z dibberjem. Vendar pa drugi primeri in strojna oprema uporabljajo večje kontrole (obstajata 2 velikosti) na večjih zaslonih in jih je mogoče upravljati s prsti.

Obstaja veliko drugih vrst nadzora, kot so prikazane tukaj. Za nadaljnje kontrole si oglejte različne primere datotek JSON v mapi za ustvarjanje kod. V teh primerih so zajete vse vrste krmiljenja.

Windows ima veliko možnosti. Obrobje, naslovna vrstica in ikone so vse nastavljive. Lahko imate drsne vrstice in območja odjemalcev za pomikanje oken, več primerkov iste vrste oken in oken je lahko golih (samo območje odjemalca, brez obrobe ali naslovne vrstice), kar pomeni, da so fiksni ob času prevajanja na mestu (npr. glej sliko v tem razdelku z velikimi ikonami - to je dejansko 6 golih oken).

MiniWin ne uporablja dinamičnega pomnilnika. Zaradi tega je primeren za majhne omejene naprave in je zahteva za nekatere vdelane projekte. MiniWin in koda, ki jo ustvari, sta tudi popolnoma skladni z zahtevami MISRA 2012.

Za dodatne informacije si oglejte dokumentacijo v mapi docs in druge primere aplikacij v datoteki zip. Tu so primeri, ki prikazujejo, kako uporabiti vse funkcije MiniWin in kako vključiti MiniWin s FatFS in FreeRTOS.