Përmbajtje:

Menaxheri i dritares së integruar: 10 hapa
Menaxheri i dritares së integruar: 10 hapa

Video: Menaxheri i dritares së integruar: 10 hapa

Video: Menaxheri i dritares së integruar: 10 hapa
Video: Как принять квартиру у застройщика? Ремонт в НОВОСТРОЙКЕ от А до Я. #1 2024, Korrik
Anonim
Menaxher i dritareve të integruara
Menaxher i dritareve të integruara
Menaxher i dritareve të integruara
Menaxher i dritareve të integruara
Menaxher i dritareve të integruara
Menaxher i dritareve të integruara
Menaxher i dritareve të integruara
Menaxher i dritareve të integruara

Ky projekt tregon se si të zbatohet një menaxher i dritareve me dritare të lëvizshme të mbivendosura në një mikrokontrollues të ngulitur me një panel LCD dhe një ekran me prekje. Ekzistojnë paketa softuerike të disponueshme komerciale për ta bërë këtë, por ato kushtojnë para dhe janë me burim të mbyllur. Ky, i quajtur MiniWin, është falas dhe me burim të hapur. Writtenshtë shkruar në C99 plotësisht në përputhje dhe mund të përdoret në një aplikacion C ose C ++. Qëllimet e MiniWin janë të jenë të lehtë për t'u përdorur, të lehtë për t'u modifikuar, të zgjerueshëm, të lëvizshëm në një gamë të gjerë të pajisjeve dhe jo shumë të etur për burime.

Përveç sigurimit të kodit për të menaxhuar dritaret tuaja MiniWin ka një koleksion të kontrolleve të ndërfaqes së përdoruesit - butona, rrëshqitës, shirita progresi, pemë etj. Ju mund të keni dritare të shumta të llojeve të ndryshme ose raste të shumta të të njëjtit lloj. Windows mund të zhvendoset, të ndryshohet, të maksimizohet, të minimizohet, të mbyllet - të gjitha gjërat e zakonshme që bëni me dritaret në menaxherët e dritareve më të mëdha. Fontet TrueType me kerning dhe anti-aliasing (e bëjnë tekstin të duket i butë) gjithashtu mbështeten për paraqitje tërheqëse të tekstit.

Në secilën dritare keni një zonë klienti (hapësira juaj brenda kufirit dhe nën shiritin e sipërm). Në këtë ju mund të shtoni kontrolle për të bërë një dialog ose mund të përdorni bibliotekën grafike të integruar për të vizatuar gjithçka që dëshironi. Të gjitha funksionet e bibliotekës grafike janë të vetëdijshme për dritaren. Ju nuk keni pse të shqetësoheni se ku është dritarja juaj, çfarë mbivendoset ose nëse minimizohet.

Përveç krijimit të dritareve tuaja, përfshihen edhe disa dialogë standardë që janë shumë të lehtë për tu instantizuar - për shembull, dialogët e konfirmimit (vetëm një buton OK ose Po/Jo), përcaktuesit e kohës/datës, zgjedhësit e skedarëve, zgjedhësit e ngjyrave etj.

MiniWin përdor një sistem standard të radhës të mesazheve të projektimit të menaxherit të dritareve. Windows mund të ndërveprojnë me njëri -tjetrin dhe menaxherin e dritareve përmes mesazheve. Ju nuk thërrisni funksione për t'i bërë gjërat drejtpërdrejt, shtoni një mesazh në radhë dhe menaxheri i dritares do ta miratojë atë për ju.

MiniWin është transferuar në bordet standarde të zhvillimit me ekrane me prekje nga shitësit e mikro-kontrolluesve ST, NXP dhe Renesas. Ka drejtues të harduerit dhe projekte shembull për të gjitha këto pajisje. Përveç kësaj MiniWin mund të ndërtohet për Windows ose Linux në mënyrë që të simuloni kodin e ndërfaqes tuaj të përdoruesit para se të merrni pajisjen tuaj të ngulitur.

MiniWin ka një gjenerator kodesh. Ju mund të specifikoni dritaret dhe kontrollet tuaja në një skedar JSON të thjeshtë për t’u lexuar nga njerëzit dhe gjeneratori i kodit e analizon skedarin dhe krijon kodin për ju (ka shumë shembuj që duhen ndjekur). Krijon aplikacione simuluese të plota të Windows ose Linux që sapo mund të ndërtohen dhe ka ekranin tuaj të simuluar LCD me dritaret tuaja MiniWin që punojnë. Ju mund të merrni saktësisht të njëjtin kod të gjeneruar dhe ta hidhni në një projekt të ngulitur dhe të keni të njëjtin kod që tregon të njëjtat dritare dhe kontrolle momente më vonë në pajisjen tuaj të ngulitur.

MiniWin nuk kërkon mbështetje operative në pajisjen e ngulitur. E gjitha shkon në një fije të vetme. MiniWin mund të integrohet me një RTOS që funksionon në një procesor të ngulitur dhe ka shembuj që integrojnë MiniWin me FreeRTOS.

Ky udhëzues tregon se si të filloni MiniWin në një procesor STM32 M4 duke përdorur tabelën e lirë STM32F429 Discovery e cila vjen me një ekran QVGA me prekje tashmë të bashkangjitur. Këto janë lehtësisht të disponueshme nga furnizuesi juaj i komponentëve elektronikë.

MiniWin funksionon në mikrokontrollues të rangut të mesëm dhe më lart.

Furnizimet

Bordi i zhvillimit STM32F429I-DISC1 dhe një kabllo mikro USB

Shkarkoni STM32CubeIDE i cili është falas.

Hapi 1: Marrja e Kodit

Marrja e Kodit
Marrja e Kodit

Para së gjithash ju duhet të instaloni STM32CubeIDE. Ju e merrni atë nga faqja e internetit e ST. Duhet të regjistroheni dhe duhet pak kohë për ta shkarkuar dhe instaluar. Allshtë e gjitha falas.

Ndërsa është duke u instaluar, shkarkoni burimin MiniWin dhe zbërtheni atë. Bigshtë e madhe, por ju do të përdorni vetëm një pjesë të vogël të saj. Klikoni butonin e gjelbër 'Clone or Download' këtu…

github.com/miniwinwm/miniwinwm

pastaj zgjidhni Shkarko Zip. Zbërtheni përmbajtjen.

Hapi 2: Ndërtimi i një projekti shembull

Ndërtimi i një projekti shembull
Ndërtimi i një projekti shembull
Ndërtimi i një projekti shembull
Ndërtimi i një projekti shembull

Së pari le të ndërtojmë një nga projektet shembull. Një i mirë quhet MiniWinSimple. Filloni STM32CubeIDE pastaj bëni këtë:

  1. Zgjidhni Skedarin | Importo…
  2. Hapni General dhe zgjidhni Projektin Ekzistues në Hapësirën e Punës. Tjetra.
  3. Klikoni Shfletoni dhe lundroni atje ku e keni hapur MiniWin. Pastaj shkoni te dosja STM32CubeIDE / MiniWinSimple / STM32F429. Klikoni Zgjidh dosjen.
  4. Në Projekt: shënoni MiniWinSimple_STM32F429 pastaj klikoni Përfundo.
  5. Projekti MiniWinSimple_STM32F429 do të shfaqet në Project Explorer tuaj. Zgjidhni atë dhe ndërtojeni atë me Project | Build Project.
  6. Tani lidhni kabllon tuaj USB në tabelë dhe kompjuterin tuaj dhe drejtojeni duke përdorur Run | Debug dhe kur të shkarkohet zgjidhni Run | Resume. Do të merrni një ekran të kalibrimit të ekranit herën e parë, kështu që prekni qendrën e 3 kryqeve në ekranin LCD. Tani mund të ndërveproni me dritaren në ekran.

Për të lëvizur një dritare, tërhiqeni atë nga shiriti i titullit. Për të ndryshuar madhësinë e një dritareje përdorni ikonën e trekëndëshit të bardhë në të majtë të shiritit të titullit. MiniWin dritaret nuk mund të ndryshojnë madhësinë duke zvarritur kufijtë pasi ekranet në të cilat përdoret MiniWin janë shumë të vogla. Për të minimizuar, maksimizuar ose mbyllur një dritare përdorni ikonat në anën e djathtë të shiritit të titullit (mbyllja mund të jetë e çaktivizuar). Kur një dritare minimizohet, ju nuk mund t'i lëvizni ikonat e minimizuara përreth. Ata ndërtohen nga poshtë majtas në të djathtë.

Hapi 3: Drejtimi i Gjeneratorit të Kodit

Drejtimi i Gjeneratorit të Kodit
Drejtimi i Gjeneratorit të Kodit

Tani ne do të ndryshojmë projektin shembull duke gjeneruar disa dritare tonat dhe duke hedhur kodin e ri. Për ta bërë këtë, ne do të ekzekutojmë gjeneratorin e kodit.

  1. Hapni një linjë komande dhe shkoni te dosja ku e keni hapur MiniWin dhe më pas te dosja Tools / CodeGen.
  2. Ekzekutuesi për Windows CodeGen.exe është tashmë i disponueshëm. Për Linux ju duhet ta ndërtoni duke shtypur make. (Ju gjithashtu mund ta krijoni atë nga burimi për Windows nëse jeni të shqetësuar duke ekzekutuar një ekzekutiv të shkarkuar, por keni nevojë për instalues të mjedisit të përpiluesit dhe zhvillimit. Shikoni dokumentacionin MiniWin në dosjen e dokumenteve për detaje).
  3. Në këtë dosje janë disa skedarë shembull JSON. Ne do të përdorim example_empty.json. Së pari duhet ta redaktoni për ta konfiguruar për Windows ose Linux. Hapeni atë në një redaktues dhe në krye ku do të gjeni "TargetType" ndryshoni vlerën "Linux" ose "Windows" në atë që po përdorni gjeneratorin e kodit.
  4. Tani shkruani codegen example_empty.json në vijën e komandës.
  5. Shkoni te projekti juaj në STM32CubeIDE dhe hapni dosjen MiniWinSimple_Common. Fshini të gjithë skedarët atje.
  6. Ne e lamë "TargetName" në skedarin JSON si parazgjedhje në "MiniWinGen" kështu që ky është emri i dosjes sonë të kodit të gjeneruar. Shkoni te dosja ku keni hequr dosjen MiniWin dhe më pas dosjen MiniWinGen_Common. Tani zgjidhni të gjitha këto skedarë dhe tërhiqni dhe lëshoni pastaj në STM32CubeIDE në dosjen MiniWinSimple_Common të projektit tuaj.
  7. Tani rindërtoni dhe përsëritni projektin në STM32CubeIDE dhe do të shfaqet dritarja juaj e re e dizajnit. Butoni në dritare është zhdukur sepse example_empty.json nuk përcakton asnjë.

Hapi 4: Shtimi i një dritareje

Shtimi i një dritareje
Shtimi i një dritareje

Tani do të shtojmë një dritare të dytë në skedarin e konfigurimit JSON dhe do të rigjenerojmë kodin.

1. Hape example_empty.json në një redaktues teksti.

2. Nën seksionin "Windows" ekziston një grup përcaktimesh të dritareve i cili aktualisht ka vetëm një dritare. Kopjoni të gjitha këto…

{

"Emri": "W1", "Titulli": "Dritarja 1", "X": 10, "Y": 15, "Gjerësia": 200, "Lartësia": 180, "Kufiri": e vërtetë, "TitleBar": true, "Visible": true, "Minimized": false}

dhe ngjiteni përsëri me një presje që ndan 2 përkufizimet.

3. Ndryshoni "W1" në "W2" dhe "Window 1" në "Window 2". Ndryshoni "X", "Y", "Gjerësia" dhe "Lartësia" në disa vlera të ndryshme duke pasur parasysh se rezolucioni i ekranit është 240 i gjerë me 320 i lartë.

4. Ruani skedarin dhe ekzekutoni përsëri gjeneratorin e kodit.

5. Kopjoni skedarët si në hapin e mëparshëm, rindërtoni dhe përsëritni. Tani do të keni 2 dritare në ekranin tuaj.

Hapi 5: Shtimi i një Kontrolli

Shtimi i një Kontrolli
Shtimi i një Kontrolli

Tani do të shtojmë disa kontrolle në dritaren tuaj të re. Ndryshoni të njëjtin skedar si në hapin e mëparshëm.

1. Në specifikimin për dritaren W1 shtoni një presje pas cilësimit të fundit ("Minimized": false) pastaj shtoni këtë tekst

"MenuBar": e vërtetë, "MenuBarEnabled": e vërtetë, "MenuItems": ["Fred", "Bert", "Pete", "Alf", "Ian"], "Buttons": [{"Emri": "B1", "Etiketa": "Button1", "X": 10, "Y": 10, "Enabled": true, "Visible": true}]

Ky seksion shton një bar menu me 5 artikuj dhe e aktivizon atë (shiritat e menusë mund të çaktivizohen globalisht, provojeni). Shton gjithashtu një buton që është i aktivizuar dhe i dukshëm (ato mund të krijohen të padukshme dhe më pas të bëhen të dukshme në kod më vonë).

2. Rigjeneroni kodin, kopjoni atë, rindërtoni, përsëritni të gjithë si më parë.

Hapi 6: Bërja e kontrolleve të bëjnë diçka

Bërja e kontrolleve të bëjnë diçka
Bërja e kontrolleve të bëjnë diçka

Tani kemi ndërfaqen bazë të përdoruesit që na nevojitet për ta bërë atë të bëjë diçka. Për këtë shembull ne do të shfaqim një dialog për zgjedhjen e ngjyrave kur të shtypet butoni në Dritaren 1.

Shkoni te projekti juaj në STM32CubeIDE dhe hapni dosjen MiniWinSimple_Common dhe më pas hapni skedarin W1.c (emri i këtij skedari korrespondon me fushën e dritares "Emri" në skedarin JSON kur u krijua kodi).

Në këtë skedar do të gjeni funksionin window_W1_message_function (). Duket kështu:

void window_W1_message_function (const mw_message_t *message) {MW_ASSERT (mesazh! = (void *) 0, "Parametri i treguesit të pavlefshëm"); / * Linja tjetër ndalon paralajmërimet e përpiluesit pasi ndryshorja aktualisht nuk përdoret */ (void) window_W1_data; kaloni (mesazhi-> mesazhi_id) {rasti MW_WINDOW_CREATED_MESSAGE: / * Shtoni ndonjë kod fillestar të dritares këtu * / pushim; rasti MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Shto kodin e trajtimit të menusë së dritares këtu * / pushim; rasti MW_BUTTON_PRESSED_MESSAGE: nëse (mesazh-> dërguesi_dërprerës == butoni_B1_handle) { / * Shtoni kodin tuaj të mbajtësit për këtë kontroll këtu * /} pushim; parazgjedhje: / * Mbani MISRA të lumtur * / pushim; }}

Kjo thirret nga menaxheri i dritares për këtë dritare sa herë që menaxheri i dritares ka nevojë të njoftojë dritaren se diçka ka ndodhur. Në këtë rast ne jemi të interesuar të dimë që butoni i vetëm i dritares është shtypur. Në deklaratën switch për llojet e mesazheve do të shihni një rast për MW_BUTTON_PRESSED_MESSAGE. Ky kod funksionon kur të jetë shtypur butoni. Ekziston vetëm një buton në këtë dritare, por mund të ketë më shumë, kështu që bëhet një kontroll se cili buton është. Në këtë rast mund të jetë vetëm butoni B1 (emri korrespondon përsëri me emrin për butonin në skedarin JSON).

Pra, pas këtij etikete rasti shtoni kodin për të shfaqur një dialog të zgjedhjes së ngjyrave, i cili është ky:

mw_create_window_dialog_colour_chooser (10, 10, "Ngjyra", MW_HAL_LCD_RED, false, mesazh-> doreza e marrësit);

Parametrat janë si më poshtë:

  • 10, 10 është vendndodhja në ekranin e dialogut
  • "Ngjyra" është titulli i dialogut
  • MW_HAL_LCD_RED është ngjyra e paracaktuar me të cilën do të fillojë dialogu
  • mjetet false nuk tregojnë madhësi të madhe (provoni ta vendosni në të vërtetë dhe shihni ndryshimin)
  • mesazhi-> doreza e marrësit është kush e zotëron këtë dialog, në këtë rast është kjo dritare. Doreza e një dritareje është në parametrin e mesazhit të funksionit. Kjo është dritarja në të cilën përgjigja e dialogut do të dërgohet.

Për të zbuluar vlerën e ngjyrës që përdoruesi zgjodhi menaxheri i dritares do t'i dërgojë dritares sonë një mesazh me ngjyrën e zgjedhur kur përdoruesi të shtypë butonin OK në dialog. Prandaj, ne duhet ta përgjojmë këtë mesazh edhe me një rast tjetër në deklaratën switch e cila duket kështu:

rasti MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE:

{mw_hal_lcd_colour_t zgjedhur_colour = mesazh-> mesazhe_data; (e pavlefshme) ngjyra e zgjedhur_; } pushim;

Ne nuk po bëjmë asgjë me ngjyrën e zgjedhur akoma, kështu që thjesht e hedhim atë të pavlefshme për të parandaluar një paralajmërim të përpiluesit. Kodi përfundimtar i këtij funksioni tani duket kështu:

void window_W1_message_function (const mw_message_t *message)

{MW_ASSERT (mesazh! = (I pavlefshëm*) 0, "Parametri i treguesit null"); / * Linja tjetër ndalon paralajmërimet e përpiluesit pasi ndryshorja aktualisht nuk përdoret */ (void) window_W1_data; kaloni (mesazhi-> mesazhi_id) {rasti MW_WINDOW_CREATED_MESSAGE: / * Shtoni ndonjë kod fillestar të dritares këtu * / pushim; rasti MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Shto kodin e trajtimit të menusë së dritares këtu * / pushim; rasti MW_BUTTON_PRESSED_MESSAGE: nëse (mesazh-> dërguesi_doreni == butoni_B1_handle) { / * Shtoni kodin tuaj të mbajtësit për këtë kontroll këtu * / mw_create_window_dialog_colour_chooser (10, 10, "Ngjyra", MW_HAL_LCD_RED,> mesazh, false-, mesazh } pushim; rasti MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE: {mw_hal_lcd_colour_t zgjedhur_colour = mesazh-> data_data; (e pavlefshme) ngjyra_e zgjedhur; } pushim; parazgjedhje: / * Mbani MISRA të lumtur * / pushim; }}

Ekzekutimi i kodit tregohet në imazhin e mësipërm. Ju mund të vini re se kur shfaqet një dialog ju duhet t'i përgjigjeni dhe ta hiqni atë para se të bëni ndonjë gjë tjetër. Kjo quhet sjellje modale. Dialogët në MiniWin dhe të gjithë globalisht modalë dhe mund të keni vetëm një shfaqje në të njëjtën kohë. Këtu ka më shumë shpjegime…

en.wikipedia.org/wiki/Modal_window

Hapi 7: Vizatimi në dritare

Vizatimi në Dritare
Vizatimi në Dritare

Deri më tani ne kemi përdorur vetëm kontrolle, dhe ato vizatojnë vetë. Timeshtë koha për të bërë disa vizatime me porosi në dritaren tonë. Pjesa në të cilën mund të vizatoni është brenda kufijve (nëse janë të tillë, ato janë opsionale), brenda shiritave të rrotullimit (nëse përcaktohen, gjithashtu opsionalë) dhe nën shiritin e titullit (nëse ka një, kjo është gjithashtu opsionale). Quhet zona e klientit në terminologjinë e dritareve.

Ekziston një bibliotekë e komandave grafike në MiniWin që mund të përdorni. Të gjithë ata janë të vetëdijshëm për dritaren. Kjo do të thotë që ju nuk duhet të shqetësoheni nëse dritarja është e dukshme, pjesërisht e errësuar nga dritaret e tjera, e ndezur, pjesërisht e fikur ose plotësisht jashtë ekranit, ose nëse koordinata e vendit ku po vizatoni është në zonën e klientit ose përtej saj Me Gjithçka është kujdesur për ju. Ju nuk mund të vizatoni jashtë zonës së klientit tuaj.

Vizatimi në zonat e klientëve në terminologjinë e dritareve quhet pikturë dhe çdo dritare ka një funksion bojë ku bëni vizatimin tuaj. Ju nuk e thërrisni funksionin tuaj të bojës, menaxheri i dritares e bën atë për ju kur është e nevojshme. Neededshtë e nevojshme kur një dritare zhvendoset ose një dritare tjetër në krye ka ndryshuar pozicionin ose dukshmërinë e saj. Nëse keni nevojë për ngjyrosjen e dritares tuaj sepse disa nga të dhënat nga të cilat varet përmbajtja e dritares kanë ndryshuar (dmth. E dini që kërkohet një rilyerje në vend që ta dijë menaxheri i dritares), atëherë i thoni menaxherit të dritares që nevojitet një rilyeje dhe ajo thërret funksionin tuaj të bojës. Ju nuk e quani atë vetë. (E gjithë kjo demonstrohet në pjesën tjetër).

Së pari, ju duhet të gjeni funksionin tuaj të bojës. Gjeneratori i kodit e krijon atë për ju dhe është vetëm mbi funksionin e trajtimit të mesazheve të modifikuar në pjesën e mëparshme. Shkoni te projekti juaj dhe hapni përsëri skedarin W1.c.

Në këtë skedar do të gjeni funksionin window_W1_paint_function (). Duket kështu:

void window_W1_paint_function (mw_handle_t window_handle, const mw_gl_draw_info_t *draw_info)

{MW_ASSERT (draw_info! = (Void*) 0, "Parametri i treguesit null"); / * Plotësoni zonën e klientit të dritares me të bardhë të fortë */ 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). gjerësi, mw_get_window_client_rect (hand_ window). lartësi); / * Shtoni kodin e pikturës së dritares këtu */}

Ky është kodi i zhveshur i gjeneruar dhe gjithçka që bën është të mbushë zonën e klientit me të bardhë të fortë. Le të vizatojmë një rreth të mbushur me ngjyrë të verdhë në zonën e klientit. Së pari ne duhet të kuptojmë konceptin e një konteksti grafik (një gjë tjetër e Windows). Ne vendosim parametrat e vizatimit në kontekstin grafik dhe më pas quajmë një rutinë të përgjithshme të vizatimit të rrethit. Gjërat që duhet të vendosim në këtë shembull janë nëse rrethi ka një kufi, stilin e vijës kufitare, ngjyrën e kufirit, nëse rrethi është i mbushur, ngjyra e mbushjes dhe modeli i mbushjes. Ju mund të shihni kodin e mësipërm që bën diçka të ngjashme për të mbushur zonën e klientit me një drejtkëndësh të bardhë të ngurtë të mbushur pa kufi. Vlerat në kontekstin grafik nuk mbahen mend midis secilës thirrje të funksionit të bojës, kështu që ju duhet të vendosni vlerat çdo herë (ato mbahen mend me funksionin e bojës).

Në kodin e mësipërm mund të shihni që mbushja është e ndezur dhe modeli i mbushjes është i fikur, kështu që nuk kemi nevojë t'i vendosim përsëri. Ne duhet të vendosim kufirin, stilin e vijës kufitare në të ngurtë, ngjyrën e përparme të kufirit në të zezë dhe ngjyrën ta mbushim në të verdhë si kjo:

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

Shtoni këtë kod në komentin në këtë funksion ku thotë të shtoni kodin tuaj. Tjetra ne duhet të vizatojmë një rreth i cili bëhet kështu:

mw_gl_circle (vizatoni_info, 30, 30, 15);

Kjo tërheq një rreth në koordinatat 30, 30 me rreze 15. Rindërtoni kodin dhe përsëriteni atë dhe do të shihni një rreth në dritare siç tregohet më sipër. Do të vini re se rrethi dhe butoni mbivendosen, por butoni është në krye. Kjo është sipas dizajnit. Kontrollet janë gjithmonë në krye të çdo gjëje që ju tërheqni në zonën e klientit.

Hapi 8: Të dhënat e dritares

Të dhënat e dritares
Të dhënat e dritares

Deri më tani ne kemi zbatuar kodin tonë në funksionin e mesazheve të Dritares 1 (për të trajtuar mesazhet hyrëse) dhe funksionin e tij të bojës (për të tërhequr zonën e klientit të dritares). Tani është koha për të lidhur të dyja. Le të mbushim rrethin e vizatuar në funksionin e bojës me ngjyrën që përdoruesi zgjedh nga zgjedhësi i ngjyrave kur shtypet butoni. Mos harroni se ne nuk e quajmë funksionin bojë, menaxheri i dritares e bën atë, kështu që funksioni ynë i mesazhit (i cili e di ngjyrën e zgjedhur) nuk mund ta thërrasë funksionin e bojës drejtpërdrejt vetë. Në vend të kësaj ne duhet të ruajmë të dhënat dhe t'i bëjmë të ditur menaxherit të dritares se kërkohet një rilyej. Menaxheri i dritares pastaj do të thërrasë funksionin bojë i cili mund të përdorë të dhënat e ruajtura.

Në krye të W1.c do të shihni një strukturë të zbrazët të të dhënave dhe një objekt të këtij lloji të deklaruar nga gjeneruesi i kodit si ky:

typedef strukt

{ / * Shtoni anëtarët e të dhënave tuaja këtu * / char dummy; /* Disa përpilues ankohen për struktura boshe; hiqeni këtë kur shtoni anëtarët tuaj */} window_W1_data_t; dritare statike_W1_data_t dritare_W1_data;

Kjo është ajo ku ne i ruajmë të dhënat tona në mënyrë që të ruhen nëpër thirrje dhe të njihen si të dhënat e dritares. Ne vetëm duhet të ruajmë ngjyrën e zgjedhur këtu, si kjo:

typedef strukt

{ / * Shtoni anëtarët e të dhënave tuaja këtu * / mw_hal_lcd_colour_t zgjedhur_colour; } dritare_W1_data_t; dritare statike_W1_data_t window_W1_data = {MW_HAL_LCD_YELLOW};

Ne do t'i japim një ngjyrë fillestare të verdhë. Tani në funksionin e mesazhit ne do ta ndryshojmë pak kodin për të ruajtur ngjyrën e zgjedhur këtu si kjo:

rasti MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE:

{window_W1_data.chosen_colour = mesazh-> data_data; } pushim;

Pastaj ne do të ndryshojmë funksionin e bojës për të përdorur këtë vlerë kur vizaton rrethin si kjo:

mw_gl_set_solid_fill_colour (dritare_W1_data.zgjedhje_ngjyrë);

Tani ne kemi ndryshuar të dhënat nga të cilat varet përmbajtja e dritares, kështu që duhet të bëjmë të ditur menaxherit të dritares se dritarja ka nevojë për ngjyrosje. Ne e bëjmë atë në funksionin e mesazhit kur dialogu merr mesazhin OK, si kjo:

mw_paint_window_client (mesazh-> doreza e marrësit);

Kjo nuk bën që dritarja të pikturohet drejtpërdrejt. Shtë një funksion i dobishëm që i dërgon një mesazh menaxherit të dritares se një dritare duhet të rilyhet (nëse futeni në të mund të shihni se si ndodh kjo). Dritarja që duhet të rilyhet në këtë rast është vetë, dhe doreza në dritare është në parametrin e mesazhit në funksionin e mbajtësit të mesazheve.

I gjithë skedari tani duket kështu nëse nuk jeni të sigurt se ku shkojnë disa nga fragmentet e kodit më lart:

#përfshi

#include "miniwin.h" #include "miniwin_user.h" #include "W1.h" typedef struct { / * Shtoni anëtarët e të dhënave tuaja këtu * / mw_hal_lcd_colour_t zgjedhur_colour; } dritare_W1_data_t; dritare statike_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, "Parametri i treguesit të pavlefshëm"); / * Plotësoni zonën e klientit të dritares me të bardhë të fortë */ 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). gjerësi, mw_get_window_client_rect (hand_ window). lartësi); / * Shtoni kodin e pikturës së dritares këtu */ mw_gl_set_fg_colour (MW_HAL_LCD_BLACK); mw_gl_set_solid_fill_colour (dritare_W1_data.zgjedhje_ngjyrë); mw_gl_set_line (MW_GL_SOLID_LINE); mw_gl_set_border (MW_GL_BORDER_ON); mw_gl_circle (vizatoni_info, 30, 30, 15); } void window_W1_message_function (const mw_message_t *message) {MW_ASSERT (mesazh! = (void *) 0, "Parametri i treguesit të pavlefshëm"); / * Linja tjetër ndalon paralajmërimet e përpiluesit pasi ndryshorja aktualisht nuk përdoret */ (void) window_W1_data; kaloni (mesazhi-> mesazhi_id) {rasti MW_WINDOW_CREATED_MESSAGE: / * Shtoni ndonjë kod fillestar të dritares këtu * / pushim; rasti MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Shto kodin e trajtimit të menusë së dritares këtu * / pushim; rasti MW_BUTTON_PRESSED_MESSAGE: nëse (mesazh-> dërguesi_doreni == butoni_B1_handle) { / * Shtoni kodin tuaj të mbajtësit për këtë kontroll këtu * / mw_create_window_dialog_colour_chooser (10, 10, "Ngjyra", MW_HAL_LCD_RED,> mesazh, false-, mesazh } pushim; rasti MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE: {window_W1_data.chosen_colour = mesazh-> data_data; mw_paint_window_client (mesazh-> doreza e marrësit); } pushim; parazgjedhje: / * Mbani MISRA të lumtur * / pushim; }}

Ndërtoni dhe vraponi përsëri dhe duhet të jeni në gjendje të vendosni ngjyrën e mbushjes së rrethit.

Ky shembull i të dhënave të dritares përdor të dhëna që ruhen në një strukturë të të dhënave statike në krye të skedarit burimor. Kjo është mirë nëse keni vetëm një shembull të dritares, siç bëjmë në këtë shembull, por nëse keni më shumë se një shembull atëherë të gjithë do të ndajnë të njëjtën strukturë të të dhënave. Possibleshtë e mundur që të ketë të dhëna për shembull, kështu që raste të shumta të të njëjtit lloj dritareje kanë të dhënat e tyre. Kjo shpjegohet në dokumentacionin MiniWin që gjendet në drejtorinë e dokumenteve. Shembulli i skedarit e përdor atë për të treguar imazhe të shumta në të njëjtin lloj dritareje (siç shihet në imazhin kryesor në krye të këtij udhëzuesi).

Hapi 9: Disa Argëtime Fontale Finale

Disa Fun Font Font
Disa Fun Font Font

MiniWin mbështet interpretimin e shkronjave TrueType. Nëse ka një gjë që e bën ndërfaqen tuaj të përdoruesit të duket mirë, janë shkronjat tërheqëse. Ky hap i fundit tregon se si të jepni një font TrueType në një dritare MiniWin.

Ka dy mënyra për të dhënë fontet TrueType. Njëra është t'i vizatoni ato drejtpërdrejt në zonën e klientit tuaj siç ishte bërë për rrethin më herët, tjetra është të shtoni një kontroll të kutisë së tekstit në dritaren tuaj. Ne po bëjmë këtë të fundit pasi është më e lehtë.

Tani do të shtojmë një kontroll të kutisë së tekstit në skedarin tonë të konfigurimit JSON. Shtojeni atë në përkufizimin e Dritares 2 në mënyrë që të duket kështu:

si kjo:

{

"Emri": "W2", "Titulli": "Dritarja 2", "X": 50, "Y": 65, "Gjerësia": 100, "Lartësia": 80, "Kufiri": i vërtetë, "TitulliBar": true, "Visible": true, "Minimized": false, "TextBoxes": [{"Emri": "TB1", "X": 0, "Y": 0, "Gjerësia": 115, "Lartësia": 50, "Justifikimi": "Qendra", "BackgroundColour": "MW_HAL_LCD_YELLOW", "ForegroundColour": "MW_HAL_LCD_BLACK", "Font": "mf_rlefont_BLKCHCRY16", "Enabled": true, "Visible": true}}

Një fjalë e shpejtë për fontet TrueType në MiniWin. Fontet vijnë në skedarë.ttf. Në menaxherët e dritareve në kompjuterë më të mëdhenj, ato paraqiten në ekranin tuaj kur ato janë të nevojshme. Kjo kërkon shumë fuqi dhe memorie përpunuese dhe nuk është e përshtatshme për pajisje të vogla. Në MiniWin ato përpunohen paraprakisht në bitmap dhe lidhen në kohën e përpilimit në një madhësi dhe stil të caktuar të shkronjave (të theksuara, të pjerrëta etj.), Domethënë ju duhet të vendosni se cilat shkronja në çfarë madhësie dhe stili do të përdorni në kohën e përpilimit. Kjo është bërë për ju për dy shkronja shembull në skedarin zip MiniWin që keni shkarkuar. Nëse dëshironi të përdorni shkronja të tjera në madhësi dhe stile të tjera, shihni dokumentacionin MiniWin në dosjen e dokumenteve. Ka mjete në MiniWin për Windows dhe Linux për përpunimin paraprak të skedarëve.ttf në skedarët e kodit burimor që mund të futni në projektin tuaj.

Dhe një fjalë e dytë e shpejtë - shumica e shkronjave janë të drejta të autorit, përfshirë ato që do të gjeni në Microsoft Windows. Përdorni ato sipas dëshirës për përdorim personal, por çdo gjë që publikoni duhet të siguroheni që licenca me të cilën janë publikuar fontet e lejon atë, siç është rasti për 2 fontet e përfshira në MiniWin, por jo fontet e Microsoft -it!

Kthehu tek kodi! Krijoni, lëshoni skedarë, ndërtoni dhe përsëritni si më parë dhe do të shihni që Dritarja 2 tani ka një tekst të paracaktuar në një sfond të verdhë me një font të çuditshëm. Le të ndryshojmë tekstin duke redaktuar skedarin burimor të Window 2 W2.c.

Ne duhet të komunikojmë me kutinë e tekstit që sapo kemi krijuar dhe mënyra se si e bëni këtë si çdo komunikim në MiniWin është t'i dërgoni atij një mesazh. Ne duam të vendosim tekstin në kontroll kur të krijohet dritarja, por para se të shfaqet, kështu që shtojmë kod në mbajtësin e mesazheve në rastin MW_WINDOW_CREATED_MESSAGE. Kjo merret nga kodi i dritares pak para se të shfaqet dritarja dhe është menduar për inicime të tilla. Gjeneratori i kodit krijoi një mbajtës vendesh që duket kështu në funksionin e mbajtësit të mesazheve:

rasti MW_WINDOW_CREATED_MESSAGE:

/ * Shtoni ndonjë kod fillestar të dritares këtu */ pushim;

Këtu do të postojmë një mesazh te kontrolli i kutisë së tekstit duke i thënë se çfarë teksti duam të shfaqet duke përdorur funksionin mw_post_message si ky:

rasti MW_WINDOW_CREATED_MESSAGE:

/ * Shto çdo kod fillestar të dritares këtu */ mw_post_message (MW_TEXT_BOX_SET_TEXT_MESSAGE, mesazh-> doreza e marrësit, text_box_TB1_handle, 0UL, "Ishte një natë e errët dhe e stuhishme …", MW_CONTROL_MESSAGE); pushim;

Këto janë parametrat:

  • MW_TEXT_BOX_SET_TEXT_MESSAGE - Ky është lloji i mesazhit që po i dërgojmë kontrollit. Ato janë të shënuara në miniwin.h dhe të dokumentuara në dokumentacion.
  • mesazh-> marrësi_dore - Nga kush vjen mesazhi - kjo dritare - doreza e së cilës është në parametrin e mesazhit që kalon në funksionin e mbajtësit të mesazheve.
  • text_box_TB1_handle - Kujt po i dërgojmë mesazh - doreza e kontrollit të kutisë së tekstit. Këto janë të listuara në skedarin e gjeneruar miniwin_user.h.
  • 0UL - Vlera e të dhënave, asgjë në këtë rast.
  • "Ishte një natë e errët dhe e stuhishme …" - Vlera e treguesit - teksti i ri.
  • MW_CONTROL_MESSAGE - Lloji i marrësit i cili është një kontroll.

Kjo eshte. Rindërtoni dhe përsëritni si zakonisht dhe do të merrni kutinë e tekstit që shfaqet si në imazhin e mësipërm.

Postimi i mesazheve është themelor për MiniWin (siç është për të gjithë menaxherët e dritareve). Për më shumë shembuj shikoni projektet shembull në skedarin zip dhe për një shpjegim gjithëpërfshirës lexoni pjesën mbi mesazhet MiniWin në dokumentacion.

Hapi 10: Shkoni Më tej

Image
Image

Kjo është ajo për këtë hyrje themelore në MiniWin. MiniWin mund të bëjë shumë më tepër sesa është demonstruar këtu. Për shembull, ekrani në tabelë i përdorur në këtë udhëzues është i vogël dhe kontrollet janë të vogla dhe duhet të përdoren me një diber. Sidoqoftë, shembuj të tjerë dhe pajisjet përdorin kontrolle më të mëdha (ka 2 madhësi) në ekranet më të mëdha dhe këto mund të përdoren me gisht.

Ka shumë lloje të tjera kontrolli nga ato të demonstruara këtu. Për kontrolle të mëtejshme hidhini një sy shembujve të ndryshëm të skedarëve JSON në dosjen e gjeneruesit të kodit. Të gjitha llojet e kontrollit janë të mbuluara në këta shembuj.

Windows ka shumë mundësi. Kufiri, shiriti i titullit dhe ikonat janë të gjitha të konfigurueshme. Ju mund të keni shirita rrotullimi dhe zona të rrotullimit të klientëve të dritareve, raste të shumta të të njëjtit lloj dritareje dhe dritaret mund të jenë të zhveshura (vetëm një zonë klienti, pa një kufi ose shirit titulli) që do të thotë se ato janë fiksuar në kohën e përpilimit në vend në ekran (shikoni imazhin në këtë pjesë me madhësi ikonash të mëdha - këto janë në të vërtetë 6 dritare të zhveshura).

MiniWin nuk përdor memorie dinamike. Kjo e bën atë të përshtatshëm për pajisje të vogla të kufizuara dhe është një kërkesë për disa projekte të ngulitura. MiniWin dhe kodi që gjeneron është gjithashtu plotësisht MISRA 2012 në përputhje me nivelin 'e kërkuar'.

Për informacione të mëtejshme hidhini një sy dosjes së dokumenteve për dokumentacionin dhe gjithashtu aplikacionet e tjera shembull në skedarin zip. Ka shembuj këtu që tregojnë se si të përdorni të gjitha tiparet e MiniWin dhe si të integroni MiniWin me FatFS dhe FreeRTOS.

Recommended: