Satura rādītājs:

Iebūvētais logu pārvaldnieks: 10 soļi
Iebūvētais logu pārvaldnieks: 10 soļi

Video: Iebūvētais logu pārvaldnieks: 10 soļi

Video: Iebūvētais logu pārvaldnieks: 10 soļi
Video: Исправлена проблема с драйвером USB для Windows 8.1 и Windows 10 - Robojax 2024, Jūlijs
Anonim
Iebūvēts logu pārvaldnieks
Iebūvēts logu pārvaldnieks
Iebūvētais logu pārvaldnieks
Iebūvētais logu pārvaldnieks
Iebūvēts logu pārvaldnieks
Iebūvēts logu pārvaldnieks
Iebūvētais logu pārvaldnieks
Iebūvētais logu pārvaldnieks

Šis projekts parāda, kā iebūvētajā mikrokontrollerī ar LCD paneli un skārienekrānu ieviest logu pārvaldnieku ar pārvietojamiem logiem, kas pārklājas. Lai to izdarītu, ir pieejamas komerciāli pieejamas programmatūras paketes, taču tās maksā naudu un ir slēgta pirmkoda. Šis, ko sauc par MiniWin, ir bezmaksas un atvērtā koda. Tas ir uzrakstīts pilnībā saderīgā C99, un to var izmantot C vai C ++ lietojumprogrammā. MiniWin mērķi ir viegli lietojami, viegli modificējami, paplašināmi, pārnēsājami uz plašu aparatūras klāstu un nav pārāk resursu alkstoši.

Tāpat kā kodu nodrošināšana, lai pārvaldītu jūsu logus, MiniWin ir lietotāja saskarnes vadīklu kolekcija - pogas, slīdņi, progresa joslas, koki utt. Jums var būt vairāki dažādu veidu logi vai vairāki viena veida gadījumi. Logus var pārvietot, mainīt izmērus, maksimizēt, samazināt līdz minimumam, aizvērt - visas parastās lietas, ko darāt ar logiem lielākos logu pārvaldniekos. TrueType fonti ar kodināšanu un pretpalīdzību (ļauj tekstam izskatīties gludam) tiek atbalstīti arī pievilcīgai teksta atveidošanai.

Katrā logā ir klienta zona (jūsu vieta apmales iekšpusē un zem augšējās joslas). Šajā gadījumā jūs varat pievienot vadīklas, lai izveidotu dialogu, vai arī varat izmantot iebūvēto grafikas bibliotēku, lai uzzīmētu visu, ko vēlaties. Visas grafikas bibliotēkas funkcijas ir redzamas logā. Jums nav jāuztraucas par to, kur atrodas jūsu logs, kas ar to pārklājas vai ja tas ir samazināts līdz minimumam.

Papildus savu logu veidošanai ir iekļauti arī daži standarta dialogi, kurus ir ļoti viegli izveidot, piemēram, apstiprinājuma dialogi (tikai pogas Labi vai Jā/Nē), laika/datuma iestatītāji, failu atlasītāji, krāsu atlasītāji utt.

MiniWin izmanto standarta windows pārvaldnieka dizaina ziņojumu rindas sistēmu. Windows var mijiedarboties savā starpā un ar logu pārvaldnieku, izmantojot ziņojumus. Jūs neizsaucat funkcijas, lai veiktu lietas tieši, jūs pievienojat ziņojumu rindai, un logu pārvaldnieks to ieviesīs jūsu vietā.

MiniWin ir pārnests uz standarta izstrādes paneļiem ar skārienekrāna displejiem no mikrokontrolleru pārdevējiem ST, NXP un Renesas. Visām šīm ierīcēm ir aparatūras draiveri un piemēru projekti. Turklāt MiniWin var izveidot operētājsistēmai Windows vai Linux, lai pirms iegultās aparatūras iegūšanas varētu simulēt lietotāja interfeisa kodu.

MiniWin ir kodu ģenerators. Jūs varat norādīt logus un vadīklas, vienkārši izveidojot cilvēkiem lasāmu JSON failu, un kodu ģenerators parsē failu un izveido jums kodu (ir daudz piemēru, kas jāievēro). Tas rada Windows vai Linux pilnīgas simulatora lietojumprogrammas, kuras var vienkārši izveidot, un tur ir jūsu simulētais LCD displejs, kurā darbojas jūsu MiniWin logi. Jūs varat ņemt tieši to pašu ģenerēto kodu un iemest to iegultā projektā, un tajā pašā kodā vēlāk iegultajā aparatūrā būs redzami tie paši logi un vadīklas.

MiniWin nav nepieciešams iebūvētās ierīces darbības atbalsts. Tas viss darbojas vienā pavedienā. MiniWin var integrēt ar RTOS, kas darbojas ar iegulto procesoru, un ir piemēri, kā integrēt MiniWin ar FreeRTOS.

Šajā pamācībā ir parādīts, kā sākt MiniWin darbību ar STM32 M4 procesoru, izmantojot lēto STM32F429 Discovery paneli, kas jau ir pievienots QVGA skārienekrāna displejam. Tie ir viegli pieejami no jūsu elektronisko komponentu piegādātāja.

MiniWin darbojas ar vidējas klases mikrokontrolleriem un jaunākiem.

Piegādes

STM32F429I-DISC1 izstrādes plate un mikro USB kabelis

STM32CubeIDE lejupielāde, kas ir bezmaksas.

1. darbība: koda iegūšana

Koda iegūšana
Koda iegūšana

Pirmkārt, jums ir jāinstalē STM32CubeIDE. Jūs to saņemat no ST vietnes. Jums ir jāreģistrējas, un ir nepieciešams laiks, lai to lejupielādētu un instalētu. Tas viss ir bez maksas.

Instalēšanas laikā lejupielādējiet MiniWin avotu un izpakojiet to. Tas ir liels, bet jūs izmantosit tikai nelielu tā daļu. Šeit noklikšķiniet uz zaļās pogas “Klonēt vai lejupielādēt”…

github.com/miniwinwm/miniwinwm

pēc tam izvēlieties Lejupielādēt ZIP. Izsaiņojiet saturu.

2. darbība: parauga projekta izveidošana

Projekta parauga veidošana
Projekta parauga veidošana
Projekta parauga veidošana
Projekta parauga veidošana

Vispirms ļaujim izveidot vienu no projektu piemēriem. Labu sauc MiniWinSimple. Palaidiet STM32CubeIDE, pēc tam rīkojieties šādi:

  1. Izvēlieties Fails | Importēt…
  2. Atveriet sadaļu Vispārīgi un darbvietā izvēlieties Esošais projekts. Nākamais.
  3. Noklikšķiniet uz Pārlūkot un dodieties uz vietu, kur izpakojāt MiniWin. Pēc tam dodieties uz mapi STM32CubeIDE / MiniWinSimple / STM32F429. Noklikšķiniet uz Atlasīt mapi.
  4. Projektā: atzīmējiet MiniWinSimple_STM32F429 un pēc tam noklikšķiniet uz Pabeigt.
  5. MiniWinSimple_STM32F429 projekts parādīsies jūsu Project Explorer. Atlasiet to un pēc tam izveidojiet to ar Project | Build Project.
  6. Tagad pievienojiet USB kabeli pie tāfeles un datora un palaidiet to, izmantojot Run | Debug, un kad tas ir lejupielādēts, izvēlieties Run | Resume. Pirmo reizi tiks parādīts ekrāna kalibrēšanas displejs, tāpēc LCD displejā pieskarieties 3 krustu centram. Tagad jūs varat mijiedarboties ar displeja logu.

Lai pārvietotu logu, velciet to aiz virsrakstjoslas. Lai mainītu loga izmērus, izmantojiet balto trīsstūra ikonu virsrakstjoslas kreisajā pusē. MiniWin logus nevar mainīt, velkot robežas, jo MiniWin displeji ir pārāk mazi. Lai samazinātu, palielinātu vai aizvērtu logu, izmantojiet ikonas virsrakstjoslas labajā pusē (aizvēršana var būt atspējota). Kad logs ir samazināts līdz minimumam, jūs nevarat pārvietot minimizētās ikonas. Tie veidojas no apakšas pa kreisi uz labo.

3. darbība. Kodu ģeneratora palaišana

Koda ģeneratora palaišana
Koda ģeneratora palaišana

Tagad mēs mainīsim projekta piemēru, ģenerējot dažus savus logus un ievadot jauno kodu. Lai to izdarītu, mēs palaidīsim kodu ģeneratoru.

  1. Atveriet komandu uzvedni un dodieties uz mapi, kurā tika izpakots MiniWin, un pēc tam uz mapi Tools / CodeGen.
  2. Windows CodeGen.exe izpildāmais fails jau ir pieejams. Sistēmai Linux tas ir jāveido, ierakstot make. (Varat arī izveidot to no Windows avota, ja uztraucaties par lejupielādēta izpildāmā faila darbību, bet jums ir jāinstalē kompilators un izstrādes vide. Sīkāku informāciju skatiet MiniWin dokumentācijā mapē docs).
  3. Šajā mapē ir daži JSON failu piemēri. Mēs izmantosim example_empty.json. Lai to iestatītu operētājsistēmai Windows vai Linux, vispirms tas ir jārediģē. Atveriet to redaktorā un augšpusē, kur atradīsit “TargetType”, mainiet “Linux” vai “Windows” vērtību uz to, kurā izmantojat kodu ģeneratoru.
  4. Tagad komandu uzvednē ierakstiet codegen example_empty.json.
  5. Dodieties uz savu projektu vietnē STM32CubeIDE un atveriet mapi MiniWinSimple_Common. Izdzēsiet visus tur esošos failus.
  6. Mēs atstājām "TargetName" JSON failā kā noklusējumu "MiniWinGen", tāpēc tas ir mūsu ģenerētā koda mapes nosaukums. Dodieties uz mapi, kurā tika izpakots MiniWin, un pēc tam uz mapi MiniWinGen_Common. Tagad atlasiet visus šos failus un velciet un nometiet to STM32CubeIDE sava projekta mapē MiniWinSimple_Common.
  7. Tagad atjaunojiet un palaidiet projektu STM32CubeIDE, un parādīsies jūsu jaunais dizaina logs. Poga logā ir pazudusi, jo example_empty.json nevienu nenosaka.

4. solis: loga pievienošana

Logu pievienošana
Logu pievienošana

Tagad mēs pievienosim JSON konfigurācijas failam otru logu un atjaunosim kodu.

1. Atveriet example_empty.json teksta redaktorā.

2. Sadaļā "Windows" ir logu definīciju masīvs, kuram pašlaik ir tikai viens logs. Kopēt visu šo…

{

"Nosaukums": "W1", "Nosaukums": "1. logs", "X": 10, "Y": 15, "Platums": 200, "Augstums": 180, "Robeža": true, "TitleBar": true, "Visible": true, "Minimized": false}

un ielīmējiet to vēlreiz ar komatu, atdalot 2 definīcijas.

3. Mainiet "W1" uz "W2" un "Window 1" uz "Window 2". Mainiet “X”, “Y”, “Platums” un “Augstums” uz dažādām vērtībām, paturot prātā, ka ekrāna izšķirtspēja ir 240 plata un 320 augsta.

4. Saglabājiet failu un vēlreiz palaidiet kodu ģeneratoru.

5. Kopējiet failus tāpat kā iepriekšējā solī, pārbūvējiet un atkārtojiet. Tagad jūsu displejā būs 2 logi.

5. darbība: vadīklas pievienošana

Vadīklas pievienošana
Vadīklas pievienošana

Tagad jūsu jaunajam logam mēs pievienosim dažas vadīklas. Rediģējiet to pašu failu kā iepriekšējā solī.

1. W1 loga specifikācijās pēc pēdējā iestatījuma ("Minimized": false) pievienojiet komatu, pēc tam pievienojiet šo tekstu

"Izvēlnes josla": taisnība, "MenuBarEnabled": true, "MenuItems": ["Fred", "Bert", "Pete", "Alf", "Ian"], "Buttons": [{"Name": "B1", "Label": "Button1", "X": 10, "Y": 10, "Enabled": true, "Visible": true}]

Šī sadaļa pievieno izvēlņu joslu ar 5 vienumiem un to iespējo (izvēlņu joslas var globāli atspējot, izmēģiniet to). Tas arī pievieno pogu, kas ir iespējota un redzama (tos var izveidot neredzamus un pēc tam padarīt redzamus kodā).

2. Atjaunojiet kodu, kopējiet to pāri, atjaunojiet, atkārtojiet visu, kā iepriekš.

6. darbība. Lieciet vadības ierīcēm kaut ko darīt

Liekot vadības ierīcēm kaut ko darīt
Liekot vadības ierīcēm kaut ko darīt

Tagad mums ir pamata lietotāja saskarne, kas nepieciešama, lai tā kaut ko darītu. Šajā piemērā, kad tiek nospiesta 1. loga poga, tiks parādīts krāsu izvēles dialoglodziņš.

Dodieties uz savu projektu vietnē STM32CubeIDE un atveriet mapi MiniWinSimple_Common un pēc tam atveriet failu W1.c (šī faila nosaukums atbilst loga laukam "Nosaukums" JSON failā, kad tika ģenerēts kods).

Šajā failā jūs atradīsit funkciju window_W1_message_function (). Tas izskatās šādi:

void window_W1_message_function (const mw_message_t *message) {MW_ASSERT (message! = (void *) 0, "Null rādītāja parametrs"); / * Nākamā rinda pārtrauc kompilatora brīdinājumus, jo mainīgais pašlaik netiek izmantots */ (void) window_W1_data; switch (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Šeit pievienojiet jebkuru loga inicializācijas kodu * / break; gadījums MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Šeit pievienojiet loga izvēlnes apstrādes kodu * / break; gadījums MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Šeit pievienojiet savu apstrādātāja kodu šai vadīklai * /} pārtraukums; noklusējums: / * Saglabājiet MISRA laimīgu * / pārtraukumu; }}

To izsauc šī loga pārvaldnieks ikreiz, kad loga pārvaldniekam jāinformē logs, ka kaut kas ir noticis. Šajā gadījumā mēs esam ieinteresēti zināt, ka ir nospiesta loga vienīgā poga. Ziņojumu veidu pārslēgšanas paziņojumā redzēsit MW_BUTTON_PRESSED_MESSAGE gadījumu. Šis kods darbojas, kad ir nospiesta poga. Šajā logā ir tikai viena poga, taču to varētu būt vairāk, tāpēc tiek pārbaudīts, kura poga tā ir. Šajā gadījumā tā varētu būt tikai poga B1 (nosaukums atkal atbilst pogas nosaukumam JSON failā).

Tātad pēc šīs lietas etiķetes pievienojiet kodu, lai parādītu krāsu izvēles dialoglodziņu, kas ir šāds:

mw_create_window_dialog_colour_chooser (10, 10, "Krāsa", MW_HAL_LCD_RED, nepatiess, ziņojums-> adresāta_rēķins);

Parametri ir šādi:

  • 10, 10 ir vieta dialoglodziņa ekrānā
  • "Krāsa" ir dialoga nosaukums
  • MW_HAL_LCD_RED ir noklusējuma krāsa, ar kuru tiks sākts dialogs
  • viltus nozīmē nerādīt lielu izmēru (mēģiniet iestatīt to uz patiesu un redziet atšķirību)
  • ziņojums-> adresāta rokturis ir tas, kam pieder šis dialoglodziņš, šajā gadījumā tas ir šis logs. Funkcijas ziņojuma parametrā ir loga rokturis. Šis ir logs, uz kuru tiks nosūtīta dialoglodziņa atbilde.

Lai uzzinātu lietotāja izvēlētās krāsas vērtību, loga pārvaldnieks nosūtīs mūsu logam ziņojumu ar izvēlēto krāsu, kad lietotājs dialoglodziņā nospiež pogu Labi. Tāpēc mums arī šis ziņojums ir jāuztver ar citu gadījumu slēdža paziņojumā, kas izskatās šādi:

gadījums MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE:

{mw_hal_lcd_colour_t selected_colour = message-> message_data; (void) selected_colour; } pārtraukums;

Mēs vēl neko nedarām ar izvēlēto krāsu, tāpēc vienkārši atmetam to, lai novērstu kompilatora brīdinājumu. Šīs funkcijas galīgais kods tagad izskatās šādi:

anulēts window_W1_message_function (const mw_message_t *ziņojums)

{MW_ASSERT (ziņojums! = (Void*) 0, "Nulles rādītāja parametrs"); / * Nākamā rinda pārtrauc kompilatora brīdinājumus, jo mainīgais pašlaik netiek izmantots */ (void) window_W1_data; switch (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Šeit pievienojiet jebkuru loga inicializācijas kodu * / break; gadījums MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Šeit pievienojiet loga izvēlnes apstrādes kodu * / break; gadījums MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Šeit pievienojiet savu apstrādātāja kodu šai vadīklai * / mw_create_window_dialog_colour_chooser (10, 10, "Color", MW_HAL_LCD_RED, false, message->) } pārtraukums; gadījums MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE: {mw_hal_lcd_colour_t selected_colour = message-> message_data; (void) selected_colour; } pārtraukums; noklusējums: / * Saglabājiet MISRA laimīgu * / pārtraukumu; }}

Koda palaišana ir parādīta attēlā iepriekš. Iespējams, pamanīsit, ka, parādoties dialoglodziņam, jums ir jāatbild uz to un jāatsakās, pirms darāt kaut ko citu. To sauc par modālo uzvedību. Dialogi MiniWin un visi vienmēr globāli modāli, un vienlaikus varat rādīt tikai vienu. Šeit ir vairāk skaidrojumu…

en.wikipedia.org/wiki/Modal_window

7. solis: zīmēšana logā

Zīmēšana logā
Zīmēšana logā

Līdz šim mēs esam izmantojuši tikai vadības ierīces, un tās zīmē pašas. Ir pienācis laiks uz mūsu loga izdarīt kādu pielāgotu zīmējumu. Daļa, uz kuras var zīmēt, atrodas apmaļu iekšpusē (ja tādas ir, tās nav obligātas), ritjoslās (ja tās ir definētas, arī pēc izvēles) un zem virsrakstjoslas (ja tāda ir, tā arī nav obligāta). Logu terminoloģijā to sauc par klienta zonu.

MiniWin ir grafisko komandu bibliotēka, kuru varat izmantot. Viņi visi ir informēti par logu. Tas nozīmē, ka jums nav jāuztraucas par to, vai logs ir redzams, daļēji aizklāts ar citiem logiem, ieslēgts, daļēji izslēgts vai pilnībā izslēgts no ekrāna, vai arī, ja jūsu zīmējuma koordināta atrodas klienta zonā vai ārpus tās. Tas viss ir sarūpēts jūsu vietā. Jūs nevarat zīmēt ārpus klienta zonas.

Zīmēšanu uz klientu zonām Windows terminoloģijā sauc par krāsošanu, un katram logam ir krāsošanas funkcija, kurā jūs zīmējat. Jūs neizsaucat savu krāsu funkciju, logu pārvaldnieks to dara jūsu vietā, kad tas ir nepieciešams. Tas ir nepieciešams, ja logs tiek pārvietots vai cita loga augšpusē ir mainīta pozīcija vai redzamība. Ja jums ir nepieciešama loga pārkrāsošana, jo ir mainījušies daži dati, no kuriem ir atkarīgs loga saturs (ti, jūs zināt, ka nepieciešama pārkrāsošana, nevis loga pārvaldnieka zināšana), tad jūs pasakāt loga pārvaldniekam, ka ir nepieciešama pārkrāsošana, un tā izsauc jūsu krāsošanas funkcija. Jūs pats to nesaucat. (Tas viss ir parādīts nākamajā sadaļā).

Pirmkārt, jums jāatrod sava krāsošanas funkcija. Kodu ģenerators to izveido jums, un tas atrodas tieši virs ziņojumu apstrādes funkcijas, kas mainīta iepriekšējā sadaļā. Dodieties uz savu projektu un vēlreiz atveriet failu W1.c.

Šajā failā jūs atradīsit funkciju window_W1_paint_function (). Tas izskatās šādi:

void window_W1_paint_function (mw_handle_t window_handle, const mw_gl_draw_info_t *draw_info)

{MW_ASSERT (draw_info! = (Void*) 0, "Nulles rādītāja parametrs"); / * Aizpildiet loga klienta zonu ar baltu krāsu */ 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); / * Šeit pievienojiet logu krāsošanas kodu */}

Šis ir tukšs ģenerētais kods, un viss, kas tiek darīts, ir aizpildīt klienta zonu ar baltu krāsu. Ļauj uzzīmēt dzeltenā krāsā apli klienta zonā. Vispirms mums ir jāsaprot grafiskā konteksta jēdziens (cita Windows lieta). Mēs iestatām zīmēšanas parametrus grafikas kontekstā un pēc tam izsaucam vispārīgu apļa zīmēšanas rutīnu. Šajā piemērā mums jānosaka, vai aplim ir apmale, apmales līnijas stils, apmales krāsa, vai aplis ir aizpildīts, aizpildījuma krāsa un aizpildījuma raksts. Iepriekš redzamais kods parāda kaut ko līdzīgu, lai aizpildītu klienta zonu ar baltu taisnstūri bez malām. Grafikas kontekstā esošās vērtības netiek atcerētas starp katru krāsas funkcijas izsaukumu, tāpēc vērtības ir jāiestata katru reizi (tomēr tās tiek atcerētas, izmantojot krāsu funkciju).

Iepriekš redzamajā kodā varat redzēt, ka aizpildīšana ir ieslēgta un aizpildīšanas shēma ir izslēgta, tāpēc mums tie nav jāiestata vēlreiz. Mums ir jāiestata robeža, robežas līnijas stils uz stingru, apmales priekšplāna krāsa uz melnu un aizpildījuma krāsa uz dzeltenu šādi:

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

Pievienojiet šo kodu šīs funkcijas komentārā, kur teikts, ka jāpievieno jūsu kods. Tālāk mums jāvelk aplis, kas tiek veikts šādi:

mw_gl_circle (draw_info, 30, 30, 15);

Tas zīmē apli koordinātās 30, 30 ar rādiusu 15. Pārveidojiet kodu un atkārtojiet to, un logā redzēsiet apli, kā parādīts iepriekš. Jūs pamanīsit, ka aplis un poga pārklājas, bet poga atrodas augšpusē. Tas ir pēc dizaina. Vadīklas vienmēr atrodas virs visa, ko zīmējat klienta zonā.

8. darbība: loga dati

Logu dati
Logu dati

Līdz šim mēs esam ieviesuši savu kodu Window 1 ziņojumu funkcijā (lai apstrādātu ienākošos ziņojumus) un tās krāsošanas funkcijā (lai izmantotu loga klienta zonu). Tagad ir pienācis laiks abus saistīt. Ļauj aizpildīt krāsu funkcijā iezīmēto apli ar krāsu, ko lietotājs izvēlas pēc krāsu izvēles, kad tika nospiesta poga. Atcerieties, ka mēs neizsaucam krāsas funkciju, to dara logu pārvaldnieks, tāpēc mūsu ziņojumu funkcija (kas zina izvēlēto krāsu) nevar izsaukt tieši krāsu funkciju. Tā vietā mums ir jāglabā dati kešatmiņā un jāinformē loga pārvaldnieks, ka ir nepieciešama pārkrāsošana. Pēc tam loga pārvaldnieks izsauks krāsas funkciju, kas var izmantot kešatmiņā saglabātos datus.

W1.c augšdaļā redzēsit tukšu datu struktūru un šāda veida objektu, ko kodu ģenerators deklarējis šādi:

typedef struktura

{ / * Pievienojiet savus datu dalībniekus šeit * / char dummy; /* Daži kompilatori sūdzas par tukšām struktūrām; noņemiet to, pievienojot savus dalībniekus */} window_W1_data_t; statiskais logs_W1_dati_t logs_W1_dati;

Šeit mēs saglabājam kešatmiņā savus datus, lai tie tiktu saglabāti zvanu laikā un būtu pazīstami kā loga dati. Mums šeit ir jāglabā tikai izvēlētā krāsa, piemēram:

typedef struktura

{ / * Pievienojiet savus datu dalībniekus šeit * / mw_hal_lcd_colour_t selected_colour; } window_W1_data_t; statisks window_W1_data_t window_W1_data = {MW_HAL_LCD_YELLOW};

Mēs piešķirsim tai dzelteno sākuma krāsu. Tagad ziņu funkcijā mēs nedaudz mainīsim kodu, lai šeit saglabātu izvēlēto krāsu šādi:

gadījums MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE:

{window_W1_data.chosen_colour = message-> message_data; } pārtraukums;

Tad mēs mainīsim krāsas funkciju, lai izmantotu šo vērtību, kad tā zīmē apli šādi:

mw_gl_set_solid_fill_colour (window_W1_data.chosen_colour);

Tagad mēs esam mainījuši datus, no kuriem atkarīgs loga saturs, tāpēc mums jāinformē loga pārvaldnieks, ka logam nepieciešama pārkrāsošana. Mēs to darām ziņojumu funkcijā, kad tiek saņemts dialoglodziņš Labi, piemēram:

mw_paint_window_client (ziņojums-> adresāta_ rokturis);

Tas neizraisa loga tiešu krāsošanu. Tā ir utilīta funkcija, kas loga pārvaldniekam nosūta ziņojumu, ka logs ir jāpārkrāso (ja jūs tajā iekļūstat, varat redzēt, kā tas notiek). Logs, kas šajā gadījumā ir jāpārkrāso, ir pats par sevi, un rokturis pie loga atrodas ziņojumu apstrādes funkcijas ziņojuma parametrā.

Viss fails tagad izskatās šādi, ja neesat pārliecināts, kur atrodas daži no iepriekš minētajiem koda fragmentiem:

#iekļaut

#include "miniwin.h" #include "miniwin_user.h" #include "W1.h" typedef structure { / * Pievienojiet savus datu dalībniekus šeit * / mw_hal_lcd_colour_t selected_colour; } window_W1_data_t; statisks 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, "Null rādītāja parametrs"); / * Aizpildiet loga klienta zonu ar baltu krāsu */ 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); / * Pievienojiet šeit logu krāsošanas kodu */ 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, "Null rādītāja parametrs"); / * Nākamā rinda pārtrauc kompilatora brīdinājumus, jo mainīgais pašlaik netiek izmantots */ (void) window_W1_data; switch (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Šeit pievienojiet jebkuru loga inicializācijas kodu * / break; gadījums MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Šeit pievienojiet loga izvēlnes apstrādes kodu * / break; gadījums MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Šeit pievienojiet savu apstrādātāja kodu šai vadīklai * / mw_create_window_dialog_colour_chooser (10, 10, "Color", MW_HAL_LCD_RED, false, message->) } pārtraukums; gadījums MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE: {window_W1_data.chosen_colour = message-> message_data; mw_paint_window_client (ziņojums-> adresāta_ rokturis); } pārtraukums; noklusējums: / * Saglabājiet MISRA laimīgu * / pārtraukumu; }}

Veidojiet un palaidiet vēlreiz, un jums vajadzētu būt iespējai iestatīt apļa aizpildījuma krāsu.

Šajā loga datu piemērā tiek izmantoti dati, kas tiek glabāti statiskā datu struktūrā avota faila augšpusē. Tas ir labi, ja jums ir tikai viens loga gadījums, kā tas ir šajā piemērā, bet, ja jums ir vairāk nekā viens gadījums, tad tiem visiem būs vienāda datu struktūra. Ir iespējams iegūt datus par katru instanci, tāpēc vairākiem viena un tā paša loga tipa gadījumiem ir savi dati. Tas ir izskaidrots MiniWin dokumentācijā, kas atrodama dokumentu direktorijā. Faila piemērs to izmanto, lai parādītu vairākus viena loga tipa attēlus (kā redzams galvenajā attēlā šīs pamācības augšpusē).

9. solis: dažas fonta izklaides

Daži Fonta fontu prieki
Daži Fonta fontu prieki

MiniWin atbalsta TrueType fontu renderēšanu. Ja ir kāda lieta, kas padara jūsu lietotāja interfeisu labu, tas ir pievilcīgi fonti. Šis pēdējais solis parāda, kā MiniWin logā atveidot TrueType fontu.

Ir divi TrueType fontu atveidošanas veidi. Viens no tiem ir zīmēt tos tieši uz jūsu klienta zonu, kā tas tika darīts aplim agrāk, otrs - logā pievienot tekstlodziņa vadīklu. Mēs darām pēdējo, jo tas ir vieglāk.

Tagad mēs pievienosim tekstlodziņa vadīklu mūsu JSON konfigurācijas failā. Pievienojiet to loga 2 definīcijai, lai tas izskatās šādi:

kā šis:

{

"Nosaukums": "W2", "Nosaukums": "2. logs", "X": 50, "Y": 65, "Platums": 100, "Augstums": 80, "Robeža": true, "TitleBar": true, "Visible": true, "Minimized": false, "TextBoxes": [{"Name": "TB1", "X": 0, "Y": 0, "Width": 115, "Height": 50, "Pamatojums": "Center", "BackgroundColour": "MW_HAL_LCD_YELLOW", "ForegroundColour": "MW_HAL_LCD_BLACK", "Font": "mf_rlefont_BLKCHCRY16", "Enabled": true, "Visible": true}]}

Īss vārds par TrueType fontiem MiniWin. Fonti ir.ttf failos. Lielāku datoru logu pārvaldniekos tie tiek parādīti jūsu displejā, kad tie ir nepieciešami. Tas aizņem daudz apstrādes jaudas un atmiņas, un tas nav piemērots mazām ierīcēm. Programmā MiniWin tie tiek iepriekš apstrādāti bitkartēs un sasaistīti kompilēšanas laikā ar noteiktu fonta lielumu un stilu (treknrakstā, slīprakstā utt.), T.i., jums jāizlemj, kādus fontus lielumā un stilā izmantosit apkopošanas laikā. Tas ir izdarīts jūsu vietā diviem fontu paraugiem lejupielādētajā MiniWin zip failā. Ja vēlaties izmantot citus fontus citos izmēros un stilos, skatiet MiniWin dokumentāciju mapē docs. MiniWin operētājsistēmai Windows un Linux ir rīki.ttf failu pirmapstrādei avota koda failos, kurus varat ievietot savā projektā.

Un otrs ātrais vārds - lielākā daļa fontu ir autortiesības, ieskaitot tos, kurus atradīsit Microsoft Windows. Izmantojiet tos pēc vēlēšanās personiskai lietošanai, taču viss, ko publicējat, ir jāpārliecinās, ka fontu publicēšanas licence to atļauj, kā tas ir gadījumā ar 2 MiniWin iekļautajiem fontiem, bet ne Microsoft fontiem!

Atpakaļ pie koda! Ģenerējiet, nometiet failus, veidojiet un palaidiet tāpat kā iepriekš, un jūs redzēsit, ka logā 2 tagad ir noklusējuma teksts uz dzeltena fona, prātā jucis fonts. Ļauj mainīt tekstu, rediģējot Window 2 avota failu W2.c.

Mums ir jāsazinās ar tikko izveidoto tekstlodziņu, un jums, tāpat kā jebkurai MiniWin saziņai, ir jānosūta tai ziņojums. Mēs vēlamies iestatīt tekstu vadīklā, kad tiek izveidots logs, bet pirms tā parādīšanas, tāpēc mēs pievienojam kodu ziņojumu apstrādātājam MW_WINDOW_CREATED_MESSAGE gadījumā. To saņem loga kods tieši pirms loga parādīšanas, un tas ir paredzēts šādām inicializācijām. Kodu ģenerators ziņojumu apstrādes funkcijā izveidoja vietas turētāju, kas izskatās šādi:

gadījums MW_WINDOW_CREATED_MESSAGE:

/ * Šeit pievienojiet jebkuru loga inicializācijas kodu */ break;

Šeit mēs ievietosim ziņojumu teksta lodziņa vadīklā, norādot, kādu tekstu mēs vēlamies parādīt, izmantojot funkciju mw_post_message šādi:

gadījums MW_WINDOW_CREATED_MESSAGE:

/ * Šeit pievienojiet jebkuru loga inicializācijas kodu */ mw_post_message (MW_TEXT_BOX_SET_TEXT_MESSAGE, message-> recipient_handle, text_box_TB1_handle, 0UL, "Tumša un vētraina nakts …", MW_CONTROL_MESSAGE); pārtraukums;

Šie ir parametri:

  • MW_TEXT_BOX_SET_TEXT_MESSAGE - Šis ir ziņojuma veids, ko mēs nosūtām vadībai. Tie ir uzskaitīti vietnē miniwin.h un dokumentēti dokumentācijā.
  • message-> recipient_handle - Šis ir tas, no kura ir ziņojums - šis logs - kura rokturis atrodas ziņojumu parametrā nodotajā ziņojuma parametrā.
  • text_box_TB1_handle - Kam mēs nosūtām ziņojumu - tekstlodziņa vadības rokturis. Tie ir uzskaitīti ģenerētajā failā miniwin_user.h.
  • 0UL - datu vērtība, šajā gadījumā nekas.
  • "Bija tumša un vētraina nakts …" - rādītāja vērtība - jaunais teksts.
  • MW_CONTROL_MESSAGE - saņēmēja veids, kas ir vadīkla.

Tieši tā. Pārbūvējiet un atkārtojiet, kā parasti, un jūs redzēsit tekstlodziņu, kas parādīts iepriekšējā attēlā.

Ziņojumu ievietošana ir būtiska MiniWin (tāpat kā visiem logu pārvaldniekiem). Lai iegūtu vairāk piemēru, apskatiet zip faila projektu piemērus un izsmeļošu skaidrojumu lasiet dokumentācijas sadaļā par MiniWin ziņojumiem.

10. solis: iet tālāk

Image
Image

Tas ir par šo pamata ievadu MiniWin. MiniWin var paveikt daudz vairāk, nekā šeit ir pierādīts. Piemēram, šajā instrukcijā izmantotais tāfeles ekrāns ir mazs, un vadības ierīces ir mazas, un tās ir jāizmanto kopā ar dīberi. Tomēr citos piemēros un aparatūrā lielāki displeji izmanto lielākas vadīklas (ir 2 izmēri), un tās var darbināt ar pirkstu.

Ir daudzi citi kontroles veidi, nekā šeit parādītie. Lai iegūtu papildu vadīklas, apskatiet dažādus JSON failu piemērus koda ģeneratora mapē. Šajos piemēros ir apskatīti visi kontroles veidi.

Windows ir daudz iespēju. Apmales, virsraksta josla un ikonas ir konfigurējamas. Jums var būt ritjoslas un ritināmās loga klientu zonas, vairāki viena un tā paša veida logu gadījumi un logi var būt kaili (tikai klienta apgabals, bez apmales vai virsrakstjoslas), kas nozīmē, ka tie tiek fiksēti apkopošanas laikā displejā (skatiet attēlu šajā sadaļā ar lielām ikonām - patiesībā tie ir 6 kaili logi).

MiniWin neizmanto dinamisko atmiņu. Tas padara to piemērotu nelielām ierobežotām ierīcēm un ir prasība dažiem iegultiem projektiem. MiniWin un tā ģenerētais kods arī pilnībā atbilst MISRA 2012 vajadzīgajam līmenim.

Lai iegūtu papildinformāciju, meklējiet dokumentāciju mapē Dokumenti, kā arī citas zip faila lietotņu piemēru. Šeit ir piemēri, kas parāda, kā izmantot visas MiniWin funkcijas un kā integrēt MiniWin ar FatFS un FreeRTOS.

Ieteicams: