Sisällysluettelo:
- Tarvikkeet
- Vaihe 1: Hanki koodi
- Vaihe 2: Esimerkkihankkeen rakentaminen
- Vaihe 3: Koodigeneraattorin suorittaminen
- Vaihe 4: Ikkunan lisääminen
- Vaihe 5: Ohjausobjektin lisääminen
- Vaihe 6: Säätimien tekeminen jotain
- Vaihe 7: Piirustus ikkunassa
- Vaihe 8: Ikkunatiedot
- Vaihe 9: Final Font Fun
- Vaihe 10: Siirry pidemmälle
Video: Upotettu ikkunanhallinta: 10 vaihetta
2024 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2024-01-30 08:59
Tässä projektissa näytetään, kuinka upotettuun mikro-ohjaimeen voidaan asentaa ikkunanhallinta, jossa on siirrettävät päällekkäiset ikkunat LCD-paneelilla ja kosketusnäytöllä. Tähän on olemassa kaupallisesti saatavilla olevia ohjelmistopaketteja, mutta ne maksavat rahaa ja ovat suljetun lähdekoodin ohjelmia. Tämä, nimeltään MiniWin, on ilmainen ja avoimen lähdekoodin. Se on kirjoitettu täysin yhteensopivalla C99: llä ja sitä voidaan käyttää C- tai C ++ -sovelluksessa. MiniWinin tavoitteena on olla helppokäyttöinen, helposti muokattava, laajennettava, siirrettävissä monenlaisiin laitteistoihin eikä liian voimakas resurssiväline.
Ikkunoiden hallintaan tarvittavan koodin lisäksi MiniWinissä on kokoelma käyttöliittymän säätimiä - painikkeet, liukusäätimet, edistymispalkit, puut jne. Sinulla voi olla useita erityyppisiä ikkunoita tai useita samantyyppisiä esiintymiä. Ikkunoita voidaan siirtää, muuttaa kokoa, maksimoida, minimoida, sulkea - kaikki tavalliset asiat, joita teet ikkunoilla suuremmissa ikkunanhallinnoissa. TrueType-fontteja, joissa on ytimen muodostus ja anti-aliasing (saa tekstin näyttämään sileältä), tuetaan myös houkuttelevan tekstin renderöimiseksi.
Jokaisessa ikkunassa on asiakasalue (tila reunuksen sisällä ja yläpalkin alla). Tässä voit lisätä ohjaimia dialogin luomiseksi tai voit piirtää haluamasi sisäänrakennetun grafiikkakirjaston avulla. Kaikki grafiikkakirjaston toiminnot ovat ikkunatietoisia. Sinun ei tarvitse huolehtia siitä, missä ikkuna on, mikä on sen päällekkäin tai onko se minimoitu.
Omien ikkunoiden tekemisen lisäksi mukana on myös joitain vakiovalintaikkunoita, jotka on helppo ottaa käyttöön - esimerkiksi vahvistusikkunat (vain OK- tai Kyllä/Ei -painikkeet), kellonajan/päivämäärän asettimet, tiedostonvalitsimet, värinvalitsimet jne.
MiniWin käyttää tavallista Windows Managerin suunnitteluviestijonojärjestelmää. Windows voi olla vuorovaikutuksessa keskenään ja ikkunanhallinnan kanssa viestien välityksellä. Et kutsu toimintoja suorittamaan asioita suoraan, lisäät viestin jonoon ja ikkunanhallinta vahvistaa sen puolestasi.
MiniWin on siirretty vakiokehityslevyille, joissa on kosketusnäytöt mikro-ohjainten toimittajilta ST, NXP ja Renesas. Kaikille näille laitteille on laitteistoajureita ja esimerkkiprojekteja. Lisäksi MiniWin voidaan rakentaa Windowsille tai Linuxille, jotta voit simuloida käyttöliittymäkoodia ennen sulautetun laitteiston hankkimista.
MiniWinissä on koodigeneraattori. Voit määrittää ikkunat ja säätimet yksinkertaisesti luodaksesi ihmisen luettavan JSON -tiedoston ja koodigeneraattori jäsentää tiedoston ja luo koodin puolestasi (seurattavia esimerkkejä on paljon). Se luo täydelliset Windows- tai Linux -simulaattorisovellukset, jotka voidaan rakentaa, ja siinä on simuloitu LCD -näyttö, jossa MiniWin -ikkunat toimivat. Voit ottaa täsmälleen saman luodun koodin ja pudottaa sen upotettuun projektiin ja saada saman koodin, joka näyttää samat ikkunat ja ohjaimet hetken kuluttua upotetussa laitteistossasi.
MiniWin ei vaadi upotetun laitteen käyttötukea. Kaikki kulkee yhdessä ketjussa. MiniWin voidaan integroida RTOS -järjestelmään, joka toimii sulautetulla prosessorilla, ja on olemassa esimerkkejä MiniWinin integroimisesta FreeRTOSiin.
Tämä opas näyttää kuinka MiniWin käynnistetään STM32 M4 -prosessorilla käyttämällä halpaa STM32F429 Discovery -korttia, joka on jo liitetty QVGA -kosketusnäyttöön. Nämä ovat helposti saatavissa elektroniikkakomponenttien toimittajalta.
MiniWin toimii keskitason mikro-ohjaimilla ja uudemmilla.
Tarvikkeet
STM32F429I-DISC1-kehityskortti ja mikro-USB-kaapeli
STM32CubeIDE lataa ilmaiseksi.
Vaihe 1: Hanki koodi
Ensinnäkin sinun on asennettava STM32CubeIDE. Saat sen ST: n verkkosivuilta. Sinun on rekisteröidyttävä, ja sen lataaminen ja asentaminen kestää jonkin aikaa. Kaikki on ilmaista.
Asennuksen aikana lataa MiniWin -lähde ja pura se. Se on iso, mutta käytät vain pienen osan siitä. Napsauta vihreää Kloona tai lataa -painiketta tästä…
github.com/miniwinwm/miniwinwm
valitse sitten Lataa Zip. Pura sisältö.
Vaihe 2: Esimerkkihankkeen rakentaminen
Ensin rakennetaan yksi esimerkkihankkeista. Hyvää kutsutaan MiniWinSimple. Käynnistä STM32CubeIDE ja tee näin:
- Valitse Tiedosto | Tuo…
- Avaa Yleiset ja valitse Olemassa oleva projekti työtilaan. Seuraava.
- Napsauta Selaa ja siirry kohtaan, josta purit MiniWin -paketin. Siirry sitten kansioon STM32CubeIDE / MiniWinSimple / STM32F429. Napsauta Valitse kansio.
- Projektissa: valitse MiniWinSimple_STM32F429 ja napsauta sitten Valmis.
- MiniWinSimple_STM32F429 -projekti näkyy Project Explorerissa. Valitse se ja rakenna se Project | Build Project -ohjelmalla.
- Liitä nyt USB -kaapeli piirilevyyn ja tietokoneeseen ja suorita se suorittamalla Suorita | Debug ja kun se on ladattu, valitse Suorita | Jatka. Saat näytön kalibrointinäytön ensimmäistä kertaa, joten kosketa LCD -näytön kolmen ristin keskikohtaa. Voit nyt olla vuorovaikutuksessa näytön ikkunan kanssa.
Voit siirtää ikkunaa vetämällä sitä otsikkoriviltä. Voit muuttaa ikkunan kokoa käyttämällä otsikkorivin vasemmalla puolella olevaa valkoista kolmion kuvaketta. MiniWin -ikkunoiden kokoa ei voi muuttaa vetämällä reunoja, koska MiniWin -näytöt ovat liian pieniä. Voit pienentää, suurentaa tai sulkea ikkunan käyttämällä otsikkorivin oikeassa reunassa olevia kuvakkeita (sulkeminen saattaa olla pois käytöstä). Kun ikkuna on pienennetty, et voi siirtää pienennettyjä kuvakkeita ympäri. Ne kerääntyvät alhaalta vasemmalta oikealle.
Vaihe 3: Koodigeneraattorin suorittaminen
Nyt muutamme esimerkkiprojektia luomalla omia ikkunoita ja pudottamalla uuden koodin sisään. Tätä varten suoritamme koodigeneraattorin.
- Avaa komentokehote ja siirry kansioon, josta purit MiniWin -tiedoston, ja sitten Työkalut / CodeGen -kansioon.
- Windows CodeGen.exe -ohjelman suoritettava tiedosto on jo saatavilla. Linuxia varten sinun on rakennettava se kirjoittamalla make. (Voit myös rakentaa sen Windows -lähteestä, jos olet huolissasi ladatun suoritustiedoston käyttämisestä, mutta sinun on asennettava kääntäjä ja kehitysympäristö. Katso lisätietoja dokumenttien kansion MiniWin -dokumentaatiosta.)
- Tässä kansiossa on esimerkkejä JSON -tiedostoista. Käytämme example_empty.json. Sinun on ensin muokattava sitä, jotta voit määrittää sen Windowsille tai Linuxille. Avaa se editorissa ja yläreunassa, josta löydät "TargetType", muuta "Linux" - tai "Windows" -arvo arvoksi, jolla käytät koodigeneraattoria.
- Kirjoita nyt codegen example_empty.json komentokehotteeseen.
- Siirry projektiin STM32CubeIDE -ohjelmassa ja avaa kansio MiniWinSimple_Common. Poista kaikki siellä olevat tiedostot.
- Jätimme JSON -tiedoston "TargetName" oletukseksi "MiniWinGen" -kohtaan, joten se on luodun koodin kansion nimi. Siirry kansioon, josta purit MiniWinin, ja sitten MiniWinGen_Common -kansioon. Valitse nyt kaikki nämä tiedostot ja vedä ja pudota sitten projektin MiniWinSimple_Common -kansiossa olevaan STM32CubeIDE -tiedostoon.
- Rakenna ja suorita projekti uudelleen STM32CubeIDE -tilassa ja uusi suunnitteluikkuna tulee näkyviin. Ikkunan painike on kadonnut, koska example_empty.json ei määritä mitään.
Vaihe 4: Ikkunan lisääminen
Lisäämme nyt toisen ikkunan JSON -määritystiedostoon ja luomme koodin uudelleen.
1. Avaa example_empty.json tekstieditorissa.
2. "Windows" -osiossa on joukko ikkunoiden määritelmiä, joissa on tällä hetkellä vain yksi ikkuna. Kopioi tämä kaikki…
{
"Nimi": "W1", "Otsikko": "Ikkuna 1", "X": 10, "Y": 15, "Leveys": 200, "Korkeus": 180, "Border": true, "TitleBar": true, "Visible": true, "Minimized": false}
ja liitä se uudelleen pilkulla, joka erottaa kaksi määritelmää.
3. Muuta "W1" arvoksi "W2" ja "Window 1" tilalle "Window 2". Muuta "X", "Y", "Leveys" ja "Korkeus" eri arvoihin pitäen mielessä, että näytön resoluutio on 240 leveä ja 320 korkea.
4. Tallenna tiedosto ja suorita koodigeneraattori uudelleen.
5. Kopioi tiedostot kuten edellisessä vaiheessa, rakenna ja suorita uudelleen. Näytössäsi on nyt 2 ikkunaa.
Vaihe 5: Ohjausobjektin lisääminen
Nyt lisäämme joitain säätimiä uuteen ikkunaan. Muokkaa samaa tiedostoa kuin edellisessä vaiheessa.
1. Lisää ikkunan W1 määrityksissä pilkku viimeisen asetuksen ("Minimoitu": epätosi) jälkeen ja lisää tämä teksti
"MenuBar": totta, "MenuBarEnabled": true, "MenuItems": ["Fred", "Bert", "Pete", "Alf", "Ian"], "Buttons": [{"Name": "B1", "Label": "Button1", "X": 10, "Y": 10, "Enabled": true, "Visible": true}]
Tämä osa lisää valikkorivin, jossa on 5 kohdetta, ja ottaa sen käyttöön (valikkorivit voidaan poistaa käytöstä maailmanlaajuisesti, kokeile sitä). Se lisää myös painikkeen, joka on käytössä ja näkyvissä (ne voidaan luoda näkymättömiksi ja sitten näkyviksi koodissa myöhemmin).
2. Luo koodi uudelleen, kopioi se, rakenna uudelleen, suorita kaikki uudelleen kuten ennenkin.
Vaihe 6: Säätimien tekeminen jotain
Nyt meillä on peruskäyttöliittymä, jota tarvitsemme sen tekemään jotain. Tässä esimerkissä avaamme värinvalintaikkunan, kun ikkunan 1 painiketta painetaan.
Siirry projektiin STM32CubeIDE -ohjelmassa ja avaa MiniWinSimple_Common -kansio ja avaa sitten tiedosto W1.c (tämän tiedoston nimi vastaa ikkunan "Nimi" -kenttää JSON -tiedostossa, kun koodi luotiin).
Tässä tiedostossa on toiminto window_W1_message_function (). Se näyttää tältä:
void window_W1_message_function (const mw_message_t *message) {MW_ASSERT (message! = (void *) 0, "Null -osoitinparametri"); / * Seuraava rivi pysäyttää kääntäjän varoitukset, koska muuttuja on tällä hetkellä käyttämätön */ (void) window_W1_data; switch (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Lisää ikkunan alustuskoodi tähän * / break; tapaus MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Lisää ikkunavalikon käsittelykoodi tähän * / break; tapaus MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Lisää tämän ohjausobjektin käsittelijän koodi tähän * /} tauko; oletus: / * Pidä MISRA onnellisena * / tauko; }}
Tämän ikkunanhallinta kutsuu tämän ikkunanhallinnan aina, kun ikkunanhallinnan on ilmoitettava ikkunalle, että jotain on tapahtunut. Tässä tapauksessa meitä kiinnostaa tietää, että ikkunan ainoa painike on painettu. Viestityyppien kytkentälausekkeessa näet tapauksen MW_BUTTON_PRESSED_MESSAGE. Tämä koodi toimii, kun painiketta on painettu. Tässä ikkunassa on vain yksi painike, mutta niitä voi olla enemmän, joten tarkistetaan, mikä painike se on. Tässä tapauksessa se voi olla vain painike B1 (nimi vastaa jälleen JSON -tiedoston painikkeen nimeä).
Joten tämän tapaustunnisteen jälkeen lisää koodi värinvalintaikkunaan, joka on tämä:
mw_create_window_dialog_colour_chooser (10, 10, "Väri", MW_HAL_LCD_RED, false, message-> recipient_handle);
Parametrit ovat seuraavat:
- 10, 10 on sijainti valintaikkunan näytöllä
- "Väri" on dialogin otsikko
- MW_HAL_LCD_RED on oletusväri, jolla valintaikkuna alkaa
- väärä tarkoittaa, että älä näytä suurta kokoa (yritä asettaa se tosi -arvoon ja näe ero)
- viesti-> vastaanottajan kahva on tämän valintaikkunan omistaja, tässä tapauksessa tämä ikkuna. Toiminnon viestiparametrissa on ikkunan kahva. Tämä on ikkuna, johon dialogivastaus lähetetään.
Selvittääkseen värin arvon, jonka käyttäjä valitsi ikkunanhallinnan, lähettää ikkunallemme valitun värin viestin, kun käyttäjä painaa valintaikkunan OK -painiketta. Siksi meidän on myös siepattava tämä viesti toiseen tapaukseen kytkinlauseessa, joka näyttää tältä:
tapaus MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE:
{mw_hal_lcd_colour_t selected_colour = message-> message_data; (mitätön) selected_colour; } tauko;
Emme tee vielä mitään valitulla värillä, joten vain heität sen mitättömäksi estääksesi kääntäjän varoituksen. Tämän toiminnon lopullinen koodi näyttää nyt tältä:
mitätön ikkuna_W1_viestitoiminto (const mw_message_t *viesti)
{MW_ASSERT (sanoma! = (Void*) 0, "Nollaosoittimen parametri"); / * Seuraava rivi pysäyttää kääntäjän varoitukset, koska muuttuja on tällä hetkellä käyttämätön */ (void) window_W1_data; switch (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Lisää ikkunan alustuskoodi tähän * / break; tapaus MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Lisää ikkunavalikon käsittelykoodi tähän * / break; tapaus MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Lisää ohjaimen koodisi tähän * / mw_create_window_dialog_colour_chooser (10, 10, "Color", MW_HAL_LCD_RED, false, message-> } tauko; tapaus MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE: {mw_hal_lcd_colour_t selected_colour = message-> message_data; (mitätön) selected_colour; } tauko; oletus: / * Pidä MISRA onnellisena * / tauko; }}
Koodin suorittaminen näkyy yllä olevassa kuvassa. Saatat huomata, että kun dialogi näkyy, sinun on vastattava siihen ja hylättävä se ennen kuin teet mitään muuta. Tätä kutsutaan modaaliseksi käyttäytymiseksi. Dialogit MiniWinissä ja kaikki aina globaalisti modaalisesti, ja sinulla voi olla vain yksi näyttö kerrallaan. Täällä on enemmän selitystä…
en.wikipedia.org/wiki/Modal_window
Vaihe 7: Piirustus ikkunassa
Toistaiseksi olemme käyttäneet vain säätimiä, ja ne piirtävät itsensä. On aika tehdä mukautettu piirustus ikkunallemme. Osa, johon voit piirtää, on reunusten sisällä (jos niitä on, ne ovat valinnaisia), vierityspalkkien sisällä (jos määritelty, myös valinnainen) ja otsikkorivin alapuolella (jos sellainen on, se on myös valinnainen). Sitä kutsutaan asiakasalueeksi ikkunaterminologiassa.
MiniWinissä on graafisten komentojen kirjasto, jota voit käyttää. Kaikki ovat ikkunatietoisia. Tämä tarkoittaa, että sinun ei tarvitse huolehtia siitä, onko ikkuna näkyvissä, osittain muiden ikkunoiden peittämä, päällä, osittain pois päältä tai kokonaan pois päältä tai jos piirtämäsi koordinaatti on asiakasalueella tai sen ulkopuolella. Kaikki on hoidettu puolestasi. Et voi piirtää asiakasalueesi ulkopuolelle.
Asiakasalueille piirtämistä Windows -terminologiassa kutsutaan maalaukseksi, ja jokaisessa ikkunassa on maalaustoiminto, jossa teet piirustuksesi. Et kutsu maalitoimintoasi, ikkunanhallinta tekee sen puolestasi tarvittaessa. Sitä tarvitaan, kun ikkunaa siirretään tai jos toinen ikkuna ylhäällä muuttaa sijaintiaan tai näkyvyyttään. Jos tarvitset ikkunan maalausta uudelleen, koska osa ikkunan sisällöstä riippuvista tiedoista on muuttunut (eli tiedät, että maalaus vaaditaan sen sijaan, että ikkunanhallinta tietäisi), kerro ikkunanhallinnalle, että maalaus on tarpeen ja se kutsuu maalitoimintoasi. Et kutsu sitä itse. (Kaikki tämä näkyy seuraavassa osassa).
Ensin sinun on löydettävä maalitoiminto. Koodigeneraattori luo sen sinulle ja se on juuri edellisessä osassa muokatun viestinkäsittelytoiminnon yläpuolella. Siirry projektiin ja avaa tiedosto W1.c uudelleen.
Tässä tiedostossa on toiminto window_W1_paint_function (). Se näyttää tältä:
mitätön ikkuna_W1_maalitoiminto (mw_handle_t window_handle, const mw_gl_draw_info_t *draw_info)
{MW_ASSERT (draw_info! = (Void*) 0, "Nollaosoittimen parametri"); / * Täytä ikkunan asiakasalue kiinteällä valkoisella */ 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).leveys, mw_get_window_client_rect (ikkunan kahva). korkeus); / * Lisää ikkunamaalauksen koodi tähän */}
Tämä on pelkkä luotu koodi, ja se ei muuta kuin täytä asiakasalue kiinteällä valkoisella. Piirretään keltainen täytetty ympyrä asiakasalueelle. Ensin meidän on ymmärrettävä graafisen kontekstin käsite (toinen Windows -asia). Asetamme piirustusparametrit grafiikkakontekstiin ja kutsumme sitten yleisen ympyrän piirtorutiinin. Tässä esimerkissä on määritettävä, onko ympyrällä reunus, reunaviivan tyyli, reunuksen väri, onko ympyrä täytetty, täytön väri ja täyttökuvio. Näet yllä olevan koodin, joka tekee jotain vastaavaa asiakasalueen täyttämiseksi reunattomalla kiinteällä valkoisella suorakulmiolla. Grafiikkakontekstin arvot eivät jää muistiin maalitoiminnon jokaisen kutsun välillä, joten sinun on määritettävä arvot joka kerta (ne muistetaan kuitenkin maalitoiminnolla).
Yllä olevasta koodista näet, että täyttö on päällä ja täyttökuvio on pois päältä, joten meidän ei tarvitse asettaa niitä uudelleen. Meidän on asetettava raja päälle, reunaviivan tyyli kiinteäksi, reunan etualan väri mustaksi ja täytettävä väri keltaiseksi seuraavasti:
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 (piirtotiedot, ikkunan_simple_tiedot.ympyrä_x, ikkunan_simple_tiedot.ympyrä_y, 25);
Lisää tämä koodi tämän toiminnon kommenttiin, jossa lukee koodin lisääminen. Seuraavaksi meidän on piirrettävä ympyrä, joka tehdään seuraavasti:
mw_gl_circle (piirtotiedot, 30, 30, 15);
Tämä piirtää ympyrän koordinaateilla 30, 30 ja säde 15. Luo koodi uudelleen ja suorita se uudelleen. Näet ympyrän ikkunassa yllä olevan kuvan mukaisesti. Huomaat, että ympyrä ja painike ovat päällekkäisiä, mutta painike on ylhäällä. Tämä on suunniteltu. Säätimet ovat aina kaiken päällä, mitä piirtät asiakasalueelle.
Vaihe 8: Ikkunatiedot
Tähän mennessä olemme käyttäneet omaa koodia Window 1: n viestitoiminnossa (saapuvien viestien käsittelemiseksi) ja sen maalitoiminnossa (piirtämiseksi ikkunan asiakasalueelle). Nyt on aika yhdistää nämä kaksi. Täyttää maalitoiminnossa piirretyn ympyrän värillä, jonka käyttäjä valitsee värivalitsimella painiketta painettaessa. Muista, että emme kutsu maalitoimintoa, vaan ikkunanhallinta tekee sen, joten viestifunktio (joka tietää valitun värin) ei voi kutsua suoraan itse maalitoimintoa. Sen sijaan meidän on tallennettava tiedot välimuistiin ja annettava ikkunanhallinnan tietää, että maalaus on tarpeen. Ikkunanhallinta kutsuu sitten maalitoiminnon, joka voi käyttää välimuistissa olevia tietoja.
W1.c: n yläosassa näet tyhjän tietorakenteen ja tämän tyyppisen objektin, jonka koodigeneraattori ilmoittaa seuraavasti:
typedef -rakenne
{ / * Lisää tietosi jäsenet tähän * / char dummy; /* Jotkut kääntäjät valittavat tyhjistä rakenteista; poista tämä, kun lisäät jäseniä */} window_W1_data_t; staattinen ikkuna_W1_data_t ikkuna_W1_data;
Täällä välimuistimme tiedot niin, että ne säilyvät puheluissa ja tunnetaan ikkunatiedoina. Meidän on vain tallennettava valittu väri tähän, kuten tämä:
typedef -rakenne
{ / * Lisää tietosi jäsenet tähän * / mw_hal_lcd_colour_t selected_colour; } window_W1_data_t; staattinen window_W1_data_t window_W1_data = {MW_HAL_LCD_YELLOW};
Annamme sille keltaisen lähtövärin. Nyt viestitoiminnossa muutamme koodia hieman tallentaaksesi valitun värin täällä seuraavasti:
tapaus MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE:
{window_W1_data.chosen_colour = message-> message_data; } tauko;
Sitten muutamme maalitoiminnon käyttämään tätä arvoa, kun se piirtää ympyrän seuraavasti:
mw_gl_set_solid_fill_colour (ikkuna_W1_tiedot.valittu_väri);
Nyt olemme muuttaneet tietoja, joista ikkunan sisältö riippuu, joten meidän on ilmoitettava ikkunanhallinnalle, että ikkuna on maalattava uudelleen. Teemme sen viestitoiminnossa, kun dialogi OK -viesti vastaanotetaan, kuten tämä:
mw_paint_window_client (viesti-> vastaanottajan_käsittely);
Tämä ei aiheuta ikkunan maalaamista suoraan. Se on apuohjelma, joka lähettää ikkunanhallinnalle viestin, että ikkuna on maalattava uudelleen (jos astut siihen, näet kuinka tämä tapahtuu). Ikkuna, joka on tässä tapauksessa maalattava uudelleen, on itse, ja ikkunan kahva on sanomankäsittelytoiminnon sanomaparametrissa.
Koko tiedosto näyttää nyt tältä, jos et ole varma, mihin osa yllä olevista koodinpätkistä menee:
#sisältää
#include "miniwin.h" #include "miniwin_user.h" #include "W1.h" typedef structure { / * Lisää tietosi jäsenet tähän * / mw_hal_lcd_colour_t selected_colour; } window_W1_data_t; staattinen 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, "Nollaosoittimen parametri"); / * Täytä ikkunan asiakasalue kiinteällä valkoisella */ 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).leveys, mw_get_window_client_rect (ikkunan kahva). korkeus); / * Lisää ikkunamaalauksen koodi tähän */ mw_gl_set_fg_colour (MW_HAL_LCD_BLACK); mw_gl_set_solid_fill_colour (ikkuna_W1_tiedot.valittu_väri); mw_gl_set_line (MW_GL_SOLID_LINE); mw_gl_set_border (MW_GL_BORDER_ON); mw_gl_circle (piirtotiedot, 30, 30, 15); } void window_W1_message_function (const mw_message_t *message) {MW_ASSERT (message! = (void *) 0, "Null -osoitinparametri"); / * Seuraava rivi pysäyttää kääntäjän varoitukset, koska muuttuja on tällä hetkellä käyttämätön */ (void) window_W1_data; switch (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Lisää ikkunan alustuskoodi tähän * / break; tapaus MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Lisää ikkunavalikon käsittelykoodi tähän * / break; tapaus MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Lisää ohjaimen koodisi tähän * / mw_create_window_dialog_colour_chooser (10, 10, "Color", MW_HAL_LCD_RED, false, message-> } tauko; tapaus MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE: {window_W1_data.chosen_colour = message-> message_data; mw_paint_window_client (viesti-> vastaanottajan_käsittely); } tauko; oletus: / * Pidä MISRA onnellisena * / tauko; }}
Rakenna ja suorita uudelleen, ja sinun pitäisi pystyä asettamaan ympyrän täytön väri.
Tämä esimerkki ikkunatiedoista käyttää tietoja, jotka on tallennettu staattiseen tietorakenteeseen lähdetiedoston yläreunaan. Tämä on hyvä, jos sinulla on vain yksi ilmentymä ikkunasta, kuten meillä tässä esimerkissä, mutta jos sinulla on useampi kuin yksi esiintymä, niillä kaikilla on sama tietorakenne. On mahdollista saada tapauskohtaisia tietoja, joten useilla saman ikkunan tyypeillä on omat tiedot. Tämä selitetään MiniWin -dokumentaatiossa, joka löytyy docs -hakemistosta. Tiedostoesimerkki käyttää sitä näyttääkseen useita kuvia samassa ikkunatyypissä (kuten pääkuvassa tämän ohjeen yläosassa).
Vaihe 9: Final Font Fun
MiniWin tukee TrueType -fonttien hahmontamista. Jos jokin asia saa käyttöliittymän näyttämään hyvältä, se on houkuttelevia fontteja. Tämä viimeinen vaihe näyttää TrueType -fontin hahmontamisen MiniWin -ikkunassa.
TrueType -fontteja voidaan hahmottaa kahdella tavalla. Yksi on piirtää ne suoraan asiakasalueellesi kuten ympyrälle aiemmin, toinen on lisätä tekstiruudun ohjausobjekti ikkunaan. Teemme jälkimmäisen, koska se on helpompaa.
Lisäämme nyt tekstiruudun ohjausobjektin JSON -määritystiedostoomme. Lisää se Window 2: n määritelmään niin, että se näyttää tältä:
kuten tämä:
{
"Nimi": "W2", "Otsikko": "Ikkuna 2", "X": 50, "Y": 65, "Leveys": 100, "Korkeus": 80, "Border": true, "TitleBar": true, "Visible": true, "Minimized": false, "TextBoxes": [{"Name": "TB1", "X": 0, "Y": 0, "Width": 115, "Height": 50, "Perustelu": "Center", "BackgroundColour": "MW_HAL_LCD_YELLOW", "ForegroundColour": "MW_HAL_LCD_BLACK", "Font": "mf_rlefont_BLKCHCRY16", "Enabled": true, "Visible": true}]}
Nopea sana TrueType -kirjasimista MiniWinissä. Fontit tulevat.ttf -tiedostoina. Suurempien tietokoneiden ikkunanhallinnassa ne näytetään näytölläsi, kun niitä tarvitaan. Tämä vie paljon prosessointitehoa ja muistia eikä sovellu pienille laitteille. MiniWinissä ne esikäsitellään bittikarttoiksi ja linkitetään käännösaikana kiinteällä kirjasinkokolla ja -tyylillä (lihavoitu, kursivoitu jne.), Eli sinun on päätettävä, mitä fontteja minkä kokoisina ja tyylinä aiot käyttää käännösaikana. Tämä on tehty puolestasi kahdelle esimerkkifontille lataamassasi MiniWin -zip -tiedostossa. Jos haluat käyttää muita kirjasimia erikokoisina ja -tyylisinä, katso MiniWin -dokumentaatio docs -kansiosta. MiniWin for Windowsissa ja Linuxissa on työkaluja.ttf-tiedostojen esikäsittelyyn lähdekooditiedostoiksi, jotka voit pudottaa projektiin.
Ja toinen nopea sana - useimmat fontit ovat tekijänoikeuksia, myös ne, jotka löydät Microsoft Windowsista. Käytä niitä halutessasi henkilökohtaiseen käyttöön, mutta kaikessa julkaisemassasi on varmistettava, että fontit julkaistaan lisenssillä, kuten MiniWiniin sisältyvillä kahdella fontilla, mutta ei Microsoftin kirjasimilla!
Takaisin koodiin! Luo, pudota tiedostoja, rakenna ja suorita uudelleen kuten ennen, ja näet, että ikkunassa 2 on nyt oletustekstiä keltaisella taustalla hassussa fontissa. Muutetaan tekstiä muokkaamalla Window 2: n lähdetiedostoa W2.c.
Meidän on kommunikoitava juuri luomamme tekstiruudun kanssa ja tapa, jolla teet sen, kuten mikä tahansa MiniWinin viestintä, on lähettää sille viesti. Haluamme asettaa ohjausobjektin tekstin, kun ikkuna luodaan, mutta ennen kuin se näytetään, joten lisäämme koodin sanomakäsittelijään MW_WINDOW_CREATED_MESSAGE -tapauksessa. Ikkunakoodi vastaanottaa sen juuri ennen ikkunan näyttämistä ja on tarkoitettu tällaisiin alustuksiin. Koodigeneraattori loi paikkamerkin, joka näyttää tältä viestienkäsittelytoiminnossa:
tapaus MW_WINDOW_CREATED_MESSAGE:
/ * Lisää ikkunan alustuskoodi tähän */ break;
Täällä aiomme lähettää viestin tekstiruudun ohjausobjektiin kertomalla, mitä tekstiä haluamme sen näyttävän käyttämällä mw_post_message -funktiota seuraavasti:
tapaus MW_WINDOW_CREATED_MESSAGE:
/ * Lisää ikkunan alustuskoodi tähän */ mw_post_message (MW_TEXT_BOX_SET_TEXT_MESSAGE, message-> recipient_handle, text_box_TB1_handle, 0UL, "Oli pimeä ja myrskyinen yö …", MW_CONTROL_MESSAGE); tauko;
Nämä ovat parametrit:
- MW_TEXT_BOX_SET_TEXT_MESSAGE - Tämä on viestityyppi, jonka lähetämme ohjausobjektille. Ne on lueteltu osoitteessa miniwin.h ja dokumentoitu dokumentaatiossa.
- message-> recipient_handle - tältä viesti on - tämä ikkuna - jonka kahva on sanomankäsittelytoiminnolle siirretyssä viestiparametrissa.
- text_box_TB1_handle - Kenelle lähetämme viestin - tekstiruudun ohjaimen kahva. Nämä on lueteltu luodussa tiedostossa miniwin_user.h.
- 0UL - Tietoarvo, ei mitään tässä tapauksessa.
- "Oli pimeä ja myrskyinen yö …" - Osoitinarvo - uusi teksti.
- MW_CONTROL_MESSAGE - Vastaanottajan tyyppi, joka on ohjausobjekti.
Se siitä. Rakenna ja suorita uudelleen tavalliseen tapaan ja saat tekstiruudun yllä olevan kuvan mukaisesti.
Viestien lähettäminen on MiniWinille (kuten kaikille ikkunapäälliköille) olennaista. Katso lisää esimerkkejä zip -tiedoston esimerkkiprojekteista ja lue kattava selitys dokumentaation MiniWin -viestejä koskevasta osiosta.
Vaihe 10: Siirry pidemmälle
Siinä on tämä MiniWinin perusesittely. MiniWin voi tehdä paljon enemmän kuin täällä on osoitettu. Esimerkiksi tässä ohjeessa käytetty näytön piirilevy on pieni ja säätimet ovat pieniä ja niitä on käytettävä kaksoislaskurin kanssa. Kuitenkin muut esimerkit ja laitteisto käyttävät suurempia säätimiä (on 2 kokoa) suuremmissa näytöissä ja niitä voidaan käyttää sormella.
On olemassa monia muita ohjaustyyppejä kuin tässä esitetyt. Lisäohjauksia varten katso koodinmuodostuskansion eri JSON -esimerkkitiedostoja. Kaikki ohjaustyypit käsitellään näissä esimerkeissä.
Windowsissa on paljon vaihtoehtoja. Reunus, otsikkorivi ja kuvakkeet ovat konfiguroitavissa. Sinulla voi olla vierityspalkkeja ja vieritysikkunan asiakasalueita, useita saman ikkunan tyyppejä ja ikkunat voivat olla alasti (vain asiakasalue, ei reunusta tai otsikkoriviä), mikä tarkoittaa, että ne on korjattu käännöshetkellä paikallaan näytöllä (katso kuva tässä osassa, jossa on suuret kuvakkeet - nämä ovat itse asiassa 6 paljaita ikkunoita).
MiniWin ei käytä dynaamista muistia. Tämä tekee siitä sopivan pienille rajoitetuille laitteille ja on vaatimus joillekin sulautetuille projekteille. MiniWin ja sen luoma koodi on myös täysin MISRA 2012 -yhteensopiva vaaditun tason kanssa.
Lisätietoja on asiakirjojen asiakirjoissa ja zip -tiedoston muissa esimerkkisovelluksissa. Tässä on esimerkkejä siitä, miten MiniWinin kaikkia ominaisuuksia käytetään ja kuinka MiniWin voidaan integroida FatFS: ään ja FreeRTOSiin.
Suositeltava:
Akustinen levitaatio Arduino Unon kanssa Askel askeleelta (8 vaihetta): 8 vaihetta
Akustinen levitaatio Arduino Unon kanssa Askel askeleelta (8 vaihetta): ultraäänikaiuttimet L298N DC-naarasadapterin virtalähde urospuolisella dc-nastalla ja analogiset portit koodin muuntamiseksi (C ++)
4G/5G HD -videon suoratoisto DJI Dronesta alhaisella latenssilla [3 vaihetta]: 3 vaihetta
4G/5G HD -videon suoratoisto DJI Dronesta alhaisella latenssilla [3 vaihetta]: Seuraava opas auttaa sinua saamaan live-HD-videovirtoja lähes mistä tahansa DJI-dronesta. FlytOS -mobiilisovelluksen ja FlytNow -verkkosovelluksen avulla voit aloittaa videon suoratoiston droonilta
Upotettu LED 3D -painettu joulukuusi: 10 vaihetta (kuvilla)
Upotettu LED 3D-painettu joulukuusi: Tämä on 3D-painettu joulukuusi, jonka sisällä on upotettuja osoitettavia LED-valoja. Joten on mahdollista ohjelmoida LEDit hyville valotehosteille ja käyttää 3D -tulostettua rakennetta diffuusorina. Puu on erotettu neljään vaiheeseen ja perusosa (puu
Mineraaliöljy upotettu PC: 6 vaihetta (kuvilla)
Mineral Oil Submerged PC: Seuraava linkki on opetusohjelma tietokoneen upottamisesta mineraaliöljyllä täytettyyn akvaarioon. Tulokset olivat hämmästyttäviä ottaen huomioon, että käytetty tietokone on UT2004- ja CS: S -palvelin. Se toimii 120 asteessa ja on täysin kuollut
Kuinka saada musiikkia melkein mistä tahansa (Haha) -verkkosivustosta (niin kauan kuin kuulet sen, voit saada sen OK Hieno, jos se on upotettu salamaan, jota et ehkä pysty) MUOKKATTU !!!!! Lisätty tieto: 4 vaihetta
Musiikin saaminen melkein mistä tahansa (Haha) verkkosivustosta (niin kauan kuin kuulet sen, voit saada sen … OK Hieno, jos se on upotettu salamaan, jota et ehkä pysty) MUOKKATTU !!!!! Lisätty tieto: jos menet joskus verkkosivustolle ja se soittaa kappaleen, josta pidät ja haluat sen, niin tässä on ohje, ettet ole minun vikani, jos sekoitat jotain (ainoa tapa, jolla se tapahtuu, on se, jos alat poistaa sisältöä ilman syytä ) olen voinut saada musiikkia