INHOUDSOPGAWE:
- Voorrade
- Stap 1: Kry die kode
- Stap 2: Bou 'n voorbeeldprojek
- Stap 3: Begin die kode -generator
- Stap 4: Voeg 'n venster by
- Stap 5: Voeg 'n kontroles by
- Stap 6: Laat die kontroles iets doen
- Stap 7: teken in die venster
- Stap 8: Venster data
- Stap 9: 'n Laaste lettertipe -pret
- Stap 10: Gaan verder
Video: Ingeboude vensterbestuurder: 10 stappe
2024 Outeur: John Day | [email protected]. Laas verander: 2024-01-30 07:23
Hierdie projek wys hoe u 'n vensterbestuurder met beweegbare oorvleuelende vensters op 'n ingeboude mikrobeheerder met 'n LCD-paneel en 'n aanraakskerm kan implementeer. Daar is sagtewarepakkette in die handel beskikbaar om dit te doen, maar dit kos geld en is 'n geslote bron. Hierdie een, genaamd MiniWin, is gratis en open source. Dit is geskryf in die volledig voldoenende C99 en kan gebruik word in 'n C- of C ++ - toepassing. Die doelwitte van MiniWin is om maklik te gebruik, maklik om aan te pas, uitbreidbaar, draagbaar vir 'n wye verskeidenheid hardeware, en nie te honger nie.
Benewens die verskaffing van die kode om u vensters te bestuur, het MiniWin ook 'n versameling bedienerskoppelvlakkontroles - knoppies, skuifbalk, vorderingsbalk, bome, ens. U kan verskeie vensters van verskillende tipes of verskeie gevalle van dieselfde tipe hê. Windows kan verskuif word, die grootte, die maksimalisering, die minimum, die sluiting toelaat - alles wat u gewoonlik met vensters in groter vensterbestuurders doen. TrueType-lettertipes met kerning en anti-aliasing (laat teks glad lyk) word ook ondersteun vir aantreklike teksweergawe.
In elke venster het u 'n kliëntarea (u ruimte binne die grens en onder die boonste balk). Hierop kan u kontroles byvoeg om 'n dialoog te maak, of u kan die ingeboude grafiese biblioteek gebruik om te teken wat u wil. Al die grafiese biblioteekfunksies is vensterbewus. U hoef nie bekommerd te wees oor waar u venster is, wat dit oorvleuel of as dit tot 'n minimum beperk word nie.
Benewens die maak van u eie vensters, is daar ook 'n paar standaard dialoë ingesluit wat baie maklik is om te installeer - byvoorbeeld bevestigingsdialoogblaaie (net 'n OK- of Ja/Nee -knoppie), tyd-/datumopstelling, lêerkiesers, kleurkeuses, ens.
MiniWin gebruik 'n standaard Windows Manager -ontwerpboodskapstelsel. Windows kan met mekaar en die vensterbestuurder kommunikeer via boodskappe. U skakel nie funksies om dinge direk te doen nie, u voeg 'n boodskap by die tou en die vensterbestuurder stel dit vir u op.
MiniWin is oorgedra na standaard ontwikkelingsborde met aanraakskermvertonings van die verskaffers van mikrobeheerders ST, NXP en Renesas. Daar is hardeware -bestuurders en voorbeeldprojekte vir al hierdie toestelle. Boonop kan MiniWin vir Windows of Linux gebou word, sodat u u gebruikerskoppelvlakkode kan simuleer voordat u u ingeboude hardeware kry.
MiniWin het 'n kodegenerator. U kan u vensters en kontroles spesifiseer in 'n eenvoudige, leesbare JSON -lêer, en die kodegenerator ontleed die lêer en skep die kode vir u (daar is baie voorbeelde om te volg). Dit skep volledige of simulator -toepassings vir Windows of Linux wat net gebou kan word, en u gesimuleerde LCD -skerm met u MiniWin -vensters werk. U kan presies dieselfde gegenereerde kode neem en dit in 'n ingebedde projek laat val, en dieselfde kode kan dieselfde vensters en kontroles later op u ingeboude hardeware hê.
MiniWin benodig geen bedieningsondersteuning op die ingeboude toestel nie. Dit loop alles in 'n enkele draad. MiniWin kan geïntegreer word met 'n RTOS wat op 'n ingeboude verwerker werk, en daar is voorbeelde wat MiniWin integreer met FreeRTOS.
Hierdie instruksies wys hoe u MiniWin aan die gang kan kry op 'n STM32 M4 -verwerker met behulp van die goedkoop STM32F429 Discovery -bord met 'n QVGA -aanraakskerm wat reeds aangeheg is. Dit is maklik verkrygbaar by u verskaffer van elektroniese komponente.
MiniWin werk op middelafstand mikro-beheerders en hoër.
Voorrade
STM32F429I-DISC1 ontwikkelbord en 'n mikro-USB-kabel
STM32CubeIDE aflaai wat gratis is.
Stap 1: Kry die kode
In die eerste plek moet u STM32CubeIDE geïnstalleer. U kry dit van ST se webwerf. U moet registreer, en dit kan 'n rukkie neem om dit af te laai en te installeer. Dit is alles gratis.
Laai die MiniWin -bron af terwyl u dit installeer en pak dit uit. Dit is groot, maar u gebruik slegs 'n klein deel daarvan. Klik hier op die groen 'Klone of aflaai' knoppie …
github.com/miniwinwm/miniwinwm
kies dan Aflaai zip. Pak die inhoud uit.
Stap 2: Bou 'n voorbeeldprojek
Laat ons eers een van die voorbeeldprojekte bou. 'N Goeie een word MiniWinSimple genoem. Begin STM32CubeIDE en doen dit dan:
- Kies lêer | Voer in …
- Maak General oop en kies Bestaande projek in die werkruimte. Volgende.
- Klik op Blaai en navigeer na die plek waar u die MiniWin -rits uitgepak het. Gaan dan na die gids STM32CubeIDE / MiniWinSimple / STM32F429. Klik op Kies gids.
- In Projek: merk MiniWinSimple_STM32F429 en klik op Voltooi.
- MiniWinSimple_STM32F429 -projek sal in u Project Explorer verskyn. Kies dit en bou dit dan met Project | Build Project.
- Sluit nou u USB -kabel aan op die bord en u rekenaar en voer dit uit met Run | Debug en kies Run | Hervat wanneer dit afgelaai is. U kry die eerste keer 'n kalibrasie -skerm, so raak die middel van die drie kruise op die LCD -skerm. U kan nou interaksie hê met die venster op die skerm.
Om 'n venster te skuif, sleep dit deur die titelbalk. Om die grootte van 'n venster te verander, gebruik die ikoon van die wit driehoek links van die titelbalk. Die grootte van MiniWin -vensters kan nie verander word deur die rande te sleep nie, aangesien die skerms waarop MiniWin gebruik word, te klein is. Om 'n venster te verminder, te maksimeer of toe te maak, gebruik die ikone aan die regterkant van die titelbalk (naby kan afgeskakel word). As 'n venster geminimaliseer word, kan u die geminimaliseerde ikone nie rondskuif nie. Hulle bou op van links onder na regs.
Stap 3: Begin die kode -generator
Nou sal ons die voorbeeldprojek verander deur 'n paar van ons eie vensters te genereer en die nuwe kode in te laat val. Om dit te kan doen, sal ons die kodegenerator laat loop.
- Maak 'n opdragprompt oop en gaan na die gids waar u die MiniWin -pakkie uitpak en dan na die gids Tools / CodeGen.
- Die uitvoerbare program vir Windows CodeGen.exe is reeds beskikbaar. Vir Linux moet u dit bou deur merk te tik. (U kan dit ook uit die bron vir Windows bou as u bekommerd is om 'n afgelaaide uitvoerbare program uit te voer, maar u moet die samesteller en ontwikkelingsomgewing geïnstalleer het. Raadpleeg die MiniWin -dokumentasie in die docs -gids vir meer inligting).
- In hierdie gids is 'n paar voorbeeld JSON -lêers. Ons sal voorbeeld_empty.json gebruik. U moet dit eers wysig om dit vir Windows of Linux op te stel. Maak dit oop in 'n redakteur, en aan die bokant waar u 'TargetType' vind, verander die 'Linux' of 'Windows' waarde na dit waarop u die kodegenerator gebruik.
- Tik nou codegen example_empty.json in die opdragprompt.
- Gaan na u projek in STM32CubeIDE en maak die gids MiniWinSimple_Common oop. Vee alle lêers daar uit.
- Ons het die 'TargetName' in die JSON -lêer standaard by 'MiniWinGen' gelaat, so dit is die naam van ons gids met gegenereerde kode. Gaan na die gids waar u die MiniWin -rits losgemaak het en dan die MiniWinGen_Common -lêergids. Kies nou al hierdie lêers en sleep dit dan na STM32CubeIDE in die MiniWinSimple_Common -lêergids van u projek.
- Herbou en herbegin die projek in STM32CubeIDE en u nuwe ontwerpvenster verskyn. Die knoppie in die venster het verdwyn omdat voorbeeld_empty.json geen definieer nie.
Stap 4: Voeg 'n venster by
Ons sal nou 'n tweede venster by die JSON -konfigurasielêer voeg en die kode regenereer.
1. Maak voorbeeld_empty.json oop in 'n teksredakteur.
2. Onder die "Windows" -afdeling is daar 'n verskeidenheid venstersdefinisies wat tans slegs een venster het. Kopieer dit alles …
{
"Naam": "W1", "Titel": "Venster 1", "X": 10, "Y": 15, "Breedte": 200, "Hoogte": 180, "Grens": waar, "Titelbalk": waar, "Sigbaar": waar, "Geminimaliseer": vals}
en plak dit weer in met 'n komma wat die twee definisies skei.
3. Verander "W1" na "W2" en "Venster 1" na "Venster 2". Verander "X", "Y", "Breedte" en "Hoogte" na 'n paar verskillende waardes, met inagneming van die skermresolusie 240 wyd by 320 hoog.
4. Stoor die lêer en voer die kodegenerator weer uit.
5. Kopieer die lêers soos in die vorige stap, herbou en herlaai. U sal nou twee vensters op u skerm hê.
Stap 5: Voeg 'n kontroles by
Nou voeg ons 'n paar kontroles by u nuwe venster. Wysig dieselfde lêer as in die vorige stap.
1. Voeg in die spesifikasie vir venster W1 'n komma na die laaste instelling ("geminimaliseer": vals) en voeg dan hierdie teks by
"Menubalk": waar, "MenuBarEnabled": true, "MenuItems": ["Fred", "Bert", "Pete", "Alf", "Ian"], "Buttons": [{"Name": "B1", "Label": "Knoppie1", "X": 10, "Y": 10, "Enabled": waar, "Sigbaar": waar}]
Hierdie afdeling voeg 'n menubalk met 5 items by en maak dit moontlik (menubalkies kan wêreldwyd gedeaktiveer word, probeer dit). Dit voeg ook 'n knoppie by wat geaktiveer en sigbaar is (dit kan onsigbaar gemaak word en later in die kode sigbaar gemaak word).
2. Regenereer die kode, kopieer dit, herbou, herlaai alles soos voorheen.
Stap 6: Laat die kontroles iets doen
Nou het ons die basiese gebruikerskoppelvlak wat ons nodig het om dit iets te laat doen. In hierdie voorbeeld verskyn 'n dialoog vir kleurkeuse wanneer die knoppie in venster 1 ingedruk word.
Gaan na u projek in STM32CubeIDE en maak die MiniWinSimple_Common -lêergids oop en maak dan lêer W1.c oop (die naam van hierdie lêer stem ooreen met die venster "Naam" in die JSON -lêer in die venster wanneer die kode gegenereer is).
In hierdie lêer vind u funksie window_W1_message_function (). Dit lyk so:
leeg venster_W1_berig_funksie (const mw_message_t *boodskap) {MW_ASSERT (boodskap! = (leemte *) 0, "Nulwyser parameter"); / * Volgende reël stop samesteller waarskuwings, aangesien veranderlike tans ongebruik is */ (leegte) venster_W1_data; switch (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Voeg enige vensterinisialiseringskode hier by * / break; saak MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Voeg venster menu hantering kode hier * / break; saak MW_BUTTON_PRESSED_MESSAGE: as (boodskap-> sender_handle == button_B1_handle) { / * Voeg u hanteerderkode vir hierdie beheer hier by * /} breek; standaard: / * Hou MISRA gelukkig * / break; }}
Dit word deur die vensterbestuurder vir hierdie venster gebel wanneer die vensterbestuurder die venster moet laat weet dat daar iets gebeur het. In hierdie geval wil ons weet dat die enigste knoppie van die venster ingedruk is. In die skakelaarverklaring vir tipes boodskappe sien u 'n saak vir MW_BUTTON_PRESSED_MESSAGE. Hierdie kode loop wanneer die knoppie ingedruk is. Daar is slegs een knoppie in hierdie venster, maar daar kan meer wees, dus word gekyk watter knoppie dit is. In hierdie geval kan dit slegs knoppie B1 wees (naam stem weer ooreen met die naam vir die knoppie in die JSON -lêer).
Voeg dus die kode by na hierdie etiket om 'n kleurkeuse -dialoog op te spoor, dit is:
mw_create_window_dialog_colour_chooser (10, 10, "Kleur", MW_HAL_LCD_RED, vals, boodskap-> ontvanger_handvatsel);
Die parameters is soos volg:
- 10, 10 is die ligging op die skerm van die dialoog
- "Kleur" is die titel van die dialoog
- MW_HAL_LCD_RED is die standaardkleur waarmee die dialoog begin
- vals beteken dat die grootte nie groot is nie (probeer dit as waar stel en sien die verskil)
- boodskap-> ontvanger se handvatsel is wie hierdie dialoog besit, in hierdie geval is dit hierdie venster. 'N Venster se handvatsel is in die funksie se boodskapparameter. Dit is die venster waarna die dialoogreaksie gestuur sal word.
Om die waarde van die kleur wat die gebruiker gekies het, uit te vind, sal die vensterbestuurder 'n boodskap met die gekose kleur aan ons venster stuur wanneer die gebruiker op die OK -knoppie in die dialoog druk. Daarom moet ons hierdie boodskap ook onderskep met 'n ander geval in die skakelaarverklaring wat so lyk:
saak MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE:
{mw_hal_lcd_colour_t gekose_kleur = boodskap-> boodskap_data; (leeg) gekies_kleur; } breek;
Ons doen nog niks met die gekose kleur nie, maar gooi dit net leeg om 'n samesteller -waarskuwing te voorkom. Die finale kode van hierdie funksie lyk nou so:
leeg venster_W1_berig_funksie (const mw_message_t *boodskap)
{MW_ASSERT (boodskap! = (Leemte*) 0, "Nulwyser -parameter"); / * Volgende reël stop samesteller waarskuwings, aangesien veranderlike tans ongebruik is */ (leegte) venster_W1_data; switch (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Voeg enige vensterinisialiseringskode hier by * / break; saak MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Voeg venster menu hantering kode hier * / break; saak MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Voeg u hanteerderkode vir hierdie kontroles hier by * / mw_create_window_dialog_colour_chooser (10, 10, "Kleur", MW_HAL_LCD_RED, vals, boodskap-> ontvanger_ } breek; saak MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE: {mw_hal_lcd_colour_t gekies_kleur = boodskap-> boodskap_data; (leeg) gekies_kleur; } breek; standaard: / * Hou MISRA gelukkig * / break; }}
Die gebruik van die kode word in die prent hierbo getoon. U sal miskien opmerk dat as u 'n dialoog toon, u daarop moet reageer en dit moet verwerp voordat u iets anders doen. Dit word modale gedrag genoem. Dialoë in MiniWin en altyd wêreldwyd modaal, en u kan slegs een keer op 'n keer wys. Daar is meer verduideliking hier …
en.wikipedia.org/wiki/Modal_window
Stap 7: teken in die venster
Tot dusver het ons slegs kontroles gebruik, en hulle teken hulself. Dit is tyd om 'n pasgemaakte tekening op ons venster te maak. Die deel waarop u kan teken, is binne die rande (as dit enige is, is dit opsioneel), binne die rolbalke (indien gedefinieer, ook opsioneel) en onder die titelbalk (as daar een is, is dit ook opsioneel). Dit word die kliëntgebied genoem in vensterterminologie.
Daar is 'n biblioteek met grafiese opdragte in MiniWin wat u kan gebruik. Hulle is almal vensterbewus. Dit beteken dat u nie bekommerd hoef te wees as die venster sigbaar is nie, gedeeltelik deur ander vensters verduister, aan, gedeeltelik uit of heeltemal van die skerm af, of as die koördinaat van waar u teken op die kliëntgebied is of daarbuite. Dit is alles vir jou versorg. U kan nie buite u kliëntgebied teken nie.
Om op kliëntgebiede in venstersterminologie te teken, word verf genoem, en elke venster het 'n verffunksie waar u kan teken. U noem nie u verffunksie nie; die vensterbestuurder doen dit vir u wanneer nodig. Dit is nodig as 'n venster verskuif word of as 'n ander venster bo -aan sy posisie of sigbaarheid verander. As u u venster moet verf, omdat sommige van die data waarvan die inhoud van die venster afhang, verander het (dws u weet dat 'n herverf nodig is eerder as wat die vensterbestuurder dit weet), dan vertel u die vensterbestuurder dat 'n herverf nodig is en dit bel jou verffunksie. Jy noem dit nie self nie. (Dit word alles in die volgende afdeling aangetoon).
Eerstens moet u u verffunksie vind. Die kodegenerator skep dit vir u en dit is net bokant die funksie vir boodskaphanteerder wat in die vorige afdeling gewysig is. Gaan na u projek en maak weer lêer W1.c oop.
In hierdie lêer vind u funksie window_W1_paint_function (). Dit lyk so:
leeg venster_W1_verffunksie (mw_handle_t venster_hendel, konst mw_gl_draw_info_t *draw_info)
{MW_ASSERT (draw_info! = (Void*) 0, "Null pointer parameter"); / * Vul die kliëntarea van die venster in met soliede wit */ mw_gl_set_fill (MW_GL_FILL); mw_gl_set_solid_vul_kleur (MW_HAL_LCD_WHITE); mw_gl_set_grens (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).hoogte); / * Voeg u vensterverfkode hier by */}
Dit is die blote as-gegenereerde kode en al wat dit doen, is om die kliëntarea vol wit te vul. Laat ons 'n geel gevulde sirkel op die kliëntarea teken. Eerstens moet ons die konsep van 'n grafiese konteks ('n ander Windows -ding) verstaan. Ons stel tekenparameters in die grafiese konteks en noem dan 'n algemene sirkeltekenroetine. Dinge wat ons in hierdie voorbeeld moet stel, is of die sirkel 'n rand, grenslynstyl, randkleur het, of die sirkel gevul is, vulkleur en vulpatroon. U kan die kode hierbo sien wat soortgelyk is om die kliëntarea te vul met 'n randlose, soliede, gevulde wit reghoek. Die waardes in die grafiese konteks word nie tussen elke oproep van die verffunksie onthou nie, dus moet u elke keer die waardes opstel (dit word egter onthou met die verffunksie).
In die kode hierbo kan u sien dat vul is aan en dat vulpatroon af is, sodat ons dit nie weer hoef in te stel nie. Ons moet die grenslyn, die grenslynstyl tot soliede, die voorgrondkleur na swart stel en die kleur tot geel vul:
mw_gl_set_fg_kleur (MW_HAL_LCD_BLACK);
mw_gl_set_solid_vul_kleur (MW_HAL_LCD_YELLOW); mw_gl_set_lyn (MW_GL_SOLID_LINE); mw_gl_set_grens (MW_GL_BORDER_ON); mw_gl_circle (draw_info, window_simple_data.circle_x, window_simple_data.circle_y, 25);
Voeg hierdie kode by die opmerking in hierdie funksie, waar dit sê om u kode by te voeg. Vervolgens moet ons 'n sirkel teken wat soos volg gedoen word:
mw_gl_circle (draw_info, 30, 30, 15);
Dit trek 'n sirkel by koördinate 30, 30 met radius 15. Herbou die kode en herhaal dit, en u sal 'n sirkel in die venster sien soos hierbo getoon. U sal sien dat die sirkel en die knoppie oorvleuel, maar die knoppie is bo -op. Dit is ontwerp. Beheer is altyd bo alles wat u op die kliëntarea trek.
Stap 8: Venster data
Tot dusver het ons ons eie kode geïmplementeer in die boodskapfunksie van venster 1 (om inkomende boodskappe te hanteer) en die verffunksie (om op die venster se kliëntarea te teken). Nou is dit tyd om die twee te koppel. Laat die sirkel wat in die verffunksie geteken is, vul met die kleur wat die gebruiker kies deur die kleurkieser toe die knoppie ingedruk is. Onthou dat ons nie die verffunksie noem nie; die vensterbestuurder doen dit, dus kan ons boodskapfunksie (wat die gekose kleur ken) nie die verffunksie self direk noem nie. In plaas daarvan moet ons die data in die kas plaas en die vensterbestuurder laat weet dat 'n herverf nodig is. Die vensterbestuurder bel dan die verffunksie wat die kasgeheue kan gebruik.
Bo -aan W1.c sien u 'n leë datastruktuur en 'n voorwerp van hierdie tipe wat deur die kodegenerator soos volg verklaar word:
typedef struct
{ / * Voeg jou data lede hier by * / char dummy; /* Sommige samestellers kla oor leë strukture; verwyder dit as u u lede */} venster_W1_data_t byvoeg; statiese venster_W1_data_t venster_W1_data;
Dit is waar ons ons data in die kas plaas sodat dit in oproepe bewaar word en bekend staan as die venstergegevens. Ons hoef net die gekose kleur hier op te slaan:
typedef struct
{ / * Voeg u datalede hier by * / mw_hal_lcd_colour_t gekose_kleur; } venster_W1_data_t; statiese venster_W1_data_t venster_W1_data = {MW_HAL_LCD_YELLOW};
Ons gee dit 'n beginkleur van geel. In die boodskapfunksie verander ons die kode effens om die gekose kleur hier te stoor:
saak MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE:
{window_W1_data.chosen_colour = boodskap-> boodskap_data; } breek;
Dan verander ons die verffunksie om hierdie waarde te gebruik wanneer dit die sirkel so trek:
mw_gl_set_solid_fill_colour (venster_W1_data.gekose_kleur);
Nou het ons die data verander waarop die inhoud van die venster afhang, sodat ons die vensterbestuurder moet laat weet dat die venster geverf moet word. Ons doen dit in die boodskapfunksie wanneer die dialoog OK -boodskap ontvang word, soos volg:
mw_paint_window_client (boodskap-> ontvanger_handvatsel);
Dit veroorsaak nie dat die venster direk geverf word nie. Dit is 'n nutsfunksie wat 'n boodskap aan die vensterbestuurder stuur dat 'n venster weer geverf moet word (as u daarin instap, kan u sien hoe dit gebeur). Die venster wat in hierdie geval oorgeverf moet word, is homself, en die handvatsel na die venster is in die boodskapparameter na die boodskaphanteringsfunksie.
Die hele lêer lyk nou so as u nie seker is waar sommige van die kodefragmente hierbo gaan nie:
#insluit
#include "miniwin.h" #include "miniwin_user.h" #include "W1.h" typedef struct { / * Voeg u data lede hier * / mw_hal_lcd_colour_t gekose_kleur; } venster_W1_data_t; statiese venster_W1_data_t venster_W1_data = {MW_HAL_LCD_YELLOW}; leeg venster_W1_verf_funksie (mw_handle_t venster_hendel, konst mw_gl_draw_info_t *draw_info) {MW_ASSERT (draw_info! = (void *) 0, "Null pointer parameter"); / * Vul die kliëntarea van die venster in met soliede wit */ mw_gl_set_fill (MW_GL_FILL); mw_gl_set_solid_vul_kleur (MW_HAL_LCD_WHITE); mw_gl_set_grens (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).hoogte); / * Voeg u vensterverfkode hier by */ mw_gl_set_fg_kleur (MW_HAL_LCD_BLACK); mw_gl_set_solid_fill_colour (venster_W1_data.gekose_kleur); mw_gl_set_lyn (MW_GL_SOLID_LINE); mw_gl_set_grens (MW_GL_BORDER_ON); mw_gl_circle (draw_info, 30, 30, 15); } ongeld venster_W1_berig_funksie (konst mw_message_t *boodskap) {MW_ASSERT (boodskap! = (leegte *) 0, "Nulwyser parameter"); / * Volgende reël stop samesteller waarskuwings, aangesien veranderlike tans ongebruik is */ (leegte) venster_W1_data; switch (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Voeg enige vensterinisialiseringskode hier by * / break; saak MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Voeg venster menu hantering kode hier * / break; saak MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Voeg u hanteerderkode vir hierdie kontroles hier by * / mw_create_window_dialog_colour_chooser (10, 10, "Kleur", MW_HAL_LCD_RED, vals, boodskap-> ontvanger_ } breek; saak MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE: {venster_W1_data.chosen_colour = boodskap-> boodskap_data; mw_paint_window_client (boodskap-> ontvanger_handvatsel); } breek; standaard: / * Hou MISRA gelukkig * / break; }}
Bou en hardloop weer, en u moet die vulkleur van die sirkel kan stel.
Hierdie voorbeeld van vensterdata gebruik data wat gestoor is in 'n statiese datastruktuur bo -aan die bronlêer. Dit is goed as u slegs een voorbeeld van die venster het, soos ons in hierdie voorbeeld het, maar as u meer as een instansie het, sal hulle almal dieselfde datastruktuur deel. Dit is moontlik om data per instansie te hê, sodat verskeie gevalle van dieselfde venstertipe hul eie data het. Dit word verduidelik in die MiniWin -dokumentasie in die dokumente -gids. Die lêervoorbeeld gebruik dit om verskeie beelde in dieselfde venstertipe te wys (soos gesien in die hoofbeeld heel bo in hierdie instruksies).
Stap 9: 'n Laaste lettertipe -pret
MiniWin ondersteun TrueType -letterweergawe. As daar iets is wat u gebruikerskoppelvlak goed laat lyk, is dit aantreklike lettertipes. Hierdie laaste stap wys hoe u 'n TrueType -lettertipe in 'n MiniWin -venster kan weergee.
Daar is twee maniere om TrueType -lettertipes weer te gee. Die een is om dit direk op u kliëntarea te teken, soos vroeër met die sirkel gedoen is; die ander is om 'n teksboksbeheer in u venster te voeg. Ons doen laasgenoemde omdat dit makliker is.
Nou voeg ons 'n teksblokkie in ons JSON -konfigurasie lêer. Voeg dit by venster 2 se definisie sodat dit so lyk:
soos hierdie:
{
"Naam": "W2", "Titel": "Venster 2", "X": 50, "Y": 65, "Breedte": 100, "Hoogte": 80, "Grens": waar, "Titelbalk": waar, "Sigbaar": waar, "Geminimaliseer": vals, "Tekstblokkies": [{"Naam": "TB1", "X": 0, "Y": 0, "Breedte": 115, "Hoogte": 50, "Justification": "Center", "BackgroundColour": "MW_HAL_LCD_YELLOW", "ForegroundColour": "MW_HAL_LCD_BLACK", "Font": "mf_rlefont_BLKCHCRY16", "Enabled": true, "Visible": true}]}}
'N Vinnige woord oor TrueType -lettertipes in MiniWin. Lettertipes kom in.ttf -lêers voor. In vensterbestuurders op groter rekenaars word dit op u skerm vertoon wanneer dit nodig is. Dit verg baie verwerkingskrag en geheue en is nie geskik vir klein toestelle nie. In MiniWin word dit vooraf in bitmaps verwerk en op die tydstip gekoppel aan 'n vaste lettergrootte en styl (vet, kursief, ens.), Dit wil sê, u moet besluit watter lettertipes met watter grootte en styl u op die tydstip gaan gebruik. Dit is vir u gedoen vir twee voorbeeld -lettertipes in die MiniWin -zip -lêer wat u afgelaai het. As u ander lettertipes in ander groottes en style wil gebruik, raadpleeg die MiniWin -dokumentasie in die dokumentmap. Daar is gereedskap in MiniWin vir Windows en Linux vir die vooraf verwerking van.ttf-lêers in bronkode-lêers wat u in u projek kan plaas.
En 'n tweede vinnige woord - die meeste lettertipes is outeursreg, insluitend die lettertipes wat u in Microsoft Windows vind. Gebruik dit na willekeur vir persoonlike gebruik, maar alles wat u publiseer, moet u verseker dat die lisensie waarmee die lettertipes gepubliseer word dit toelaat, net soos die twee lettertipes wat in MiniWin ingesluit is, maar nie die lettertipes van Microsoft nie!
Terug na die kode! Genereer, gooi lêers, bou en herlaai soos voorheen, en u sal sien dat venster 2 'n standaardtekst op 'n geel agtergrond in 'n gekke lettertipe het. Laat ons die teks verander deur die bronlêer W2.c. van Window 2 te wysig
Ons moet kommunikeer met die teksboks wat ons so pas geskep het, en die manier waarop u dit doen, soos met enige kommunikasie in MiniWin, is om 'n boodskap te stuur. Ons wil die teks in die kontrole stel wanneer die venster geskep word, maar voordat dit vertoon word, daarom voeg ons kode by die boodskaphanteerder in die MW_WINDOW_CREATED_MESSAGE -saak. Dit word ontvang deur die vensterkode net voordat die venster vertoon word en is bedoel vir inisialisering soos hierdie. Die kodegenerator het 'n plekhouer geskep wat so lyk in die boodskaphanteringsfunksie:
saak MW_WINDOW_CREATED_MESSAGE:
/ * Voeg enige vensterinisialiseringskode hier by */ break;
Hier gaan ons 'n boodskap aan die teksboksbeheer plaas waarin ons vertel watter teks ons wil wys deur die mw_post_message -funksie soos volg te gebruik:
saak MW_WINDOW_CREATED_MESSAGE:
/ * Voeg enige vensterinisialiseringskode hier by */ mw_post_message (MW_TEXT_BOX_SET_TEXT_MESSAGE, boodskap-> ontvangerhendel, text_box_TB1_handle, 0UL, "Was 'n donker en stormagtige nag …", MW_CONTROL_MESSAGE); breek;
Dit is die parameters:
- MW_TEXT_BOX_SET_TEXT_MESSAGE - Dit is die tipe boodskap wat ons na die beheerliggaam stuur. Hulle word in miniwin.h gelys en in die dokumentasie gedokumenteer.
- message-> recipient_handle - Dit is waaruit die boodskap vandaan kom - hierdie venster - waarvan die handvatsel in die boodskapparameter oorgedra is na die funksie van die boodskaphanteerder.
- text_box_TB1_handle - na wie ons die boodskap stuur - die handvatsel van die teksboksbeheer. Dit word gelys in die gegenereerde lêer miniwin_user.h.
- 0UL - Gegewenswaarde, niks in hierdie geval nie.
- "Dit was 'n donker en stormagtige nag …" - Wyserwaarde - die nuwe teks.
- MW_CONTROL_MESSAGE - Ontvanger tipe wat 'n kontroleknop is.
Dis dit. Herbou en herlaai soos gewoonlik, en u kry die tekskassie soos in die prent hierbo.
Die plasing van boodskappe is noodsaaklik vir MiniWin (soos vir alle vensterbestuurders). Vir meer voorbeelde, kyk na die voorbeeldprojekte in die zip -lêer en lees die gedeelte oor MiniWin -boodskappe in die dokumentasie vir 'n uitgebreide verduideliking.
Stap 10: Gaan verder
Dit is die basiese inleiding tot MiniWin. MiniWin kan baie meer doen as wat hier bewys is. Die skerm op die bord wat in hierdie instruksies gebruik word, is byvoorbeeld klein en die kontroles is klein en moet met 'n dibber gebruik word. Ander voorbeelde en hardeware gebruik egter groter bedieningselemente (daar is 2 groottes) op groter skerms, en dit kan met vinger bedien word.
Daar is baie ander soorte beheer as wat hier getoon word. Kyk na die verskillende voorbeeld JSON -lêers in die kodegenerator -gids vir verdere kontroles. Alle kontroletipes word in hierdie voorbeelde behandel.
Windows het baie opsies. Die rand, titelbalk en ikone is almal konfigureerbaar. U kan rolbalke en blinde venster -kliëntgebiede hê, verskeie gevalle van dieselfde venstertipe en vensters kan naak wees (slegs 'n kliëntarea, geen rand- of titelbalk nie), wat beteken dat dit op die skerm op die skerm vasgestel word (sien die prent in hierdie afdeling met groot ikone - dit is eintlik 6 naakte vensters).
MiniWin gebruik geen dinamiese geheue nie. Dit maak dit geskik vir klein beperkte toestelle en is 'n vereiste vir sommige ingebedde projekte. MiniWin en die kode wat dit genereer, voldoen ook ten volle aan die 'vereiste' vlak van MISRA 2012.
Vir meer inligting, kyk na die dokumente -gids vir die dokumentasie en ook die ander voorbeeldprogramme in die zip -lêer. Hier is voorbeelde wat toon hoe u al die funksies van MiniWin kan gebruik en hoe u MiniWin met FatFS en FreeRTOS kan integreer.
Aanbeveel:
Beeldhouer met ingeboude luidspreker: 7 stappe (met foto's)
Beeldhouer met ingeboude luidspreker: Hier is 'n wonderlike projek wat u die naweek moet onderneem, as u 'n luidspreker wil maak wat foto's/poskaarte kan bevat, of selfs u taaklys. As deel van die konstruksie gaan ons 'n Raspberry Pi Zero W as die kern van die projek gebruik, en 'n
Ingeboude kluis: 4 stappe
Ingeboude kluis .: In 'n salige aura is die behoud van die dinge aan die binnekant iets wat 'n groot opwinding is. Die naam 'Lock of Lock' is regtig 'n meeslepende deel van my daaglikse artikels wat oral voorkom, vanweë die aard daarvan, maar wat doen dit? Eenvoudig
ESP32 Bluetooth -tutoriaal - Hoe om ingeboude Bluetooth van ESP32 te gebruik: 5 stappe
ESP32 Bluetooth -tutoriaal | Hoe om ingeboude Bluetooth van ESP32 te gebruik: Hallo ouens, aangesien die ESP32 -bord met WiFi & Bluetooth beide, maar vir ons meestal projekte gebruik ons gewoonlik slegs Wifi, ons gebruik nie Bluetooth nie. So in hierdie instruksies sal ek wys hoe maklik dit is om Bluetooth van ESP32 te gebruik & Vir u basiese projekte
Die ingeboude EEPROM van u Arduino: 6 stappe
Jou ingeboude EEPROM van jou Arduino: In hierdie artikel gaan ons die interne EEPROM in ons Arduino -borde ondersoek. Wat is 'n EEPROM wat sommige van u sê? 'N EEPROM is 'n elektronies uitwisbare programmeerbare leesalleengeheue, 'n vorm van nie-vlugtige geheue wat kan onthou
Koffer draaitafel (met ingeboude versterker en voorversterker): 6 stappe
Koffer draaitafel (met ingeboude versterker en voorversterker): Hallo almal! Verdra my asseblief, want dit is my eerste opdrag. Ek vra byvoorbaat om verskoning omdat ek nie genoeg foto's geneem het terwyl ek dit gebou het nie, maar dit is relatief eenvoudig en kan aangepas word om aan almal se kreatiewe begeertes te voldoen! My inspirasie vir die