Orodha ya maudhui:

Kidhibiti cha Dirisha Iliyopachikwa: Hatua 10
Kidhibiti cha Dirisha Iliyopachikwa: Hatua 10

Video: Kidhibiti cha Dirisha Iliyopachikwa: Hatua 10

Video: Kidhibiti cha Dirisha Iliyopachikwa: Hatua 10
Video: EXCLUSIVE: Captain Ray Bowyer on his SHOCKING Encounter w/ MASSIVE UFOs, Alderney 2007 | UFO / UAP 2024, Novemba
Anonim
Kidhibiti cha Dirisha Iliyopachikwa
Kidhibiti cha Dirisha Iliyopachikwa
Kidhibiti cha Dirisha Iliyopachikwa
Kidhibiti cha Dirisha Iliyopachikwa
Kidhibiti cha Dirisha Iliyopachikwa
Kidhibiti cha Dirisha Iliyopachikwa
Kidhibiti cha Dirisha Iliyopachikwa
Kidhibiti cha Dirisha Iliyopachikwa

Mradi huu unaonyesha jinsi ya kutekeleza kidhibiti cha madirisha na windows inayoweza kuingiliana kwenye kidhibiti-kilichowekwa ndani na jopo la LCD na skrini ya kugusa. Kuna vifurushi vya programu vinavyopatikana kibiashara kufanya hivyo lakini zinagharimu pesa na ni chanzo kilichofungwa. Hii inaitwa MiniWin, ni chanzo cha bure na wazi. Imeandikwa kwa kufuata kabisa C99 na inaweza kutumika katika programu ya C au C ++. Malengo ya MiniWin ni kuwa rahisi kutumia, rahisi kurekebisha, kupanuka, kubeba kwa vifaa anuwai, na sio njaa sana ya rasilimali.

Pamoja na kutoa nambari ya kusimamia windowsWini yako ina mkusanyiko wa vidhibiti vya kiolesura cha mtumiaji - vifungo, vitelezi, baa za maendeleo, miti n.k. Unaweza kuwa na windows nyingi za aina tofauti au visa anuwai vya aina moja. Windows zinaweza kuzungushwa, kubadilishwa ukubwa, kuongezwa, kupunguzwa, kufungwa - vitu vyote vya kawaida unavyofanya na windows katika mameneja wa windows kubwa. Fonti za TrueType zilizo na kerning na anti-aliasing (hufanya maandishi yaonekane laini!

Katika kila dirisha una eneo la mteja (nafasi yako ndani ya mpaka na chini ya upau wa juu). Juu ya hii unaweza kuongeza vidhibiti ili kufanya mazungumzo au unaweza kutumia maktaba ya picha iliyojengwa kuteka chochote unachotaka. Kazi zote za maktaba ya picha zinafahamu dirisha. Haupaswi kuwa na wasiwasi juu ya wapi dirisha lako liko, ni nini kinachoingiliana au ikiwa imepunguzwa.

Kwa kuongezea kutengeneza windows yako mwenyewe pia kuna mazungumzo kadhaa ya kawaida yaliyojumuishwa ambayo ni rahisi sana kuyathibitisha - kwa mfano mazungumzo ya uthibitisho (tu vifungo sawa au Ndio / Hapana), seti za wakati / tarehe, wachaguzi wa faili, wateuzi wa rangi n.k.

MiniWin hutumia mfumo wa foleni wa muundo wa meneja wa windows windows. Windows zinaweza kuingiliana na kila mmoja na meneja wa dirisha kupitia ujumbe. Hauiti kazi kufanya vitu moja kwa moja, unaongeza ujumbe kwenye foleni na msimamizi wa dirisha atakuandikia.

MiniWin imesafirishwa kwa bodi za kawaida za maendeleo na maonyesho ya skrini ya kugusa kutoka kwa wachuuzi wa vidhibiti vidogo ST, NXP na Renesas. Kuna madereva ya vifaa na miradi ya mfano kwa vifaa hivi vyote. Kwa kuongeza MiniWin inaweza kujengwa kwa Windows au Linux ili uweze kuiga nambari yako ya kiolesura cha mtumiaji kabla ya kupata vifaa vyako vilivyoingia.

MiniWin ina jenereta ya nambari. Unaweza kutaja windows na vidhibiti vyako kwa njia rahisi kuunda faili ya JSON inayoweza kusomeka kwa binadamu na jenereta ya nambari hupitisha faili na kukutengenezea nambari (kuna mifano mingi ya kufuata). Inaunda programu kamili za Windows au Linux ambazo zinaweza kujengwa tu na kuna onyesho lako la LCD la kuiga na MiniWin windows yako inafanya kazi. Unaweza kuchukua nambari ile ile iliyozalishwa na kuiacha kwenye mradi uliopachikwa na uwe na nambari ile ile inayoonyesha windows sawa na wakati wa kudhibiti baadaye kwenye vifaa vyako vilivyoingia.

MiniWin haihitaji msaada wowote wa uendeshaji kwenye kifaa kilichopachikwa. Yote inaendesha kwa uzi mmoja. MiniWin inaweza kuunganishwa na RTOS inayoendesha kwenye processor iliyowekwa na kuna mifano inayojumuisha MiniWin na FreeRTOS.

Mafundisho haya yanaonyesha jinsi ya kupata MiniWin na kuendesha kwenye processor ya STM32 M4 ukitumia bodi ya bei nafuu ya Ugunduzi ya STM32F429 ambayo inakuja na onyesho la skrini ya kugusa ya QVGA tayari imeambatanishwa. Hizi zinapatikana kwa urahisi kutoka kwa muuzaji wako wa vifaa vya elektroniki.

MiniWin inaendesha kwa vidhibiti vidogo vya katikati na anuwai.

Vifaa

Bodi ya maendeleo ya STM32F429I-DISC1 na kebo ndogo ya USB

Upakuaji wa STM32CubeIDE ambayo ni bure.

Hatua ya 1: Kupata Msimbo

Kupata Kanuni
Kupata Kanuni

Kwanza kabisa unahitaji STM32CubeIDE imewekwa. Unapata hiyo kutoka kwa wavuti ya ST. Lazima ujiandikishe na inachukua muda kupakua na kuisakinisha. Yote ni bure.

Wakati hiyo inasakinisha kupakua chanzo cha MiniWin na uifungue. Ni kubwa, lakini utatumia tu sehemu ndogo yake. Bonyeza kitufe cha kijani 'Clone au Pakua' hapa…

github.com/miniwinwm/miniwinwm

kisha chagua Pakua Zip. Unzip yaliyomo.

Hatua ya 2: Kuunda Mradi wa Mfano

Kujenga Mradi wa Mfano
Kujenga Mradi wa Mfano
Kujenga Mradi wa Mfano
Kujenga Mradi wa Mfano

Kwanza lets kujenga moja ya miradi ya mfano. Mzuri huitwa MiniWinSimple. Anzisha STM32CubeIDE kisha fanya hivi:

  1. Chagua Faili | Ingiza…
  2. Fungua Jumla na uchague Mradi Uliopo kwenye Sehemu ya Kazi. Ifuatayo.
  3. Bonyeza Vinjari na uende mahali ulipofungua MiniWin. Kisha nenda kwenye folda ya STM32CubeIDE / MiniWinSimple / STM32F429. Bonyeza Chagua Folda.
  4. Katika Mradi: tiki MiniWinSimple_STM32F429 kisha bonyeza Maliza.
  5. Mradi wa MiniWinSimple_STM32F429 utaonekana kwenye Mradi wako wa Mradi. Chagua kisha ujenge na Mradi | Jenga Mradi.
  6. Sasa ingiza kebo yako ya USB kwenye ubao na kompyuta yako na uitumie kwa kutumia Run | Debug na inapopakuliwa chagua Run | Resume. Utapata onyesho la usawa wa skrini mara ya kwanza kwa hivyo gusa katikati ya misalaba 3 kwenye onyesho la LCD. Sasa unaweza kuingiliana na dirisha kwenye onyesho.

Ili kusogeza dirisha iburute kwa upau wake wa kichwa. Kubadilisha ukubwa wa dirisha tumia ikoni nyeupe ya pembetatu upande wa kushoto wa mwambaa wa kichwa. Madirisha ya MiniWin hayawezi kubadilishwa ukubwa kwa kuvuta mipaka kwani maonyesho MiniWin hutumiwa ni ndogo sana. Ili kupunguza, kuongeza au kufunga dirisha tumia aikoni kwenye mkono wa kulia mwisho wa upau wa kichwa (karibu inaweza kulemazwa). Dirisha linapopunguzwa huwezi kusogeza ikoni zilizopunguzwa kuzunguka. Wanajenga kutoka chini kushoto kwenda kulia.

Hatua ya 3: Kuendesha Jenereta ya Msimbo

Kuendesha Jenereta ya Msimbo
Kuendesha Jenereta ya Msimbo

Sasa tutabadilisha mradi wa mfano kwa kutengeneza madirisha yetu wenyewe na kuacha nambari mpya. Ili kufanya hivyo tutaendesha jenereta ya nambari.

  1. Fungua kidokezo cha amri na uende kwenye folda ambapo umefungua MiniWin na kisha folda ya Zana / CodeGen.
  2. Inayoweza kutekelezwa kwa Windows CodeGen.exe tayari inapatikana. Kwa Linux lazima uijenge kwa kuandika make. (Unaweza pia kuijenga kutoka kwa chanzo cha Windows ikiwa una wasiwasi kuendesha inayoweza kutekelezwa lakini unahitaji mkusanyaji na mazingira ya maendeleo yaliyosanikishwa. Tazama nyaraka za MiniWin kwenye folda ya hati kwa maelezo).
  3. Katika folda hii kuna mfano faili za JSON. Tutatumia example_empty.json. Unahitaji kuhariri kwanza kuiweka kwa Windows au Linux. Fungua kwa hariri na juu ambapo utapata "TargetType" badilisha thamani ya "Linux" au "Windows" kwa kile unachotumia jenereta ya nambari.
  4. Sasa andika codegen example_empty.json katika haraka ya amri.
  5. Nenda kwa mradi wako katika STM32CubeIDE na ufungue folda MiniWinSimple_Common. Futa faili zote huko.
  6. Tuliacha "TargetName" katika faili ya JSON kama chaguo-msingi katika "MiniWinGen" kwa hivyo hilo ndilo jina la folda yetu ya nambari iliyotengenezwa. Nenda kwenye folda ambapo umefungua MiniWin na folda ya MiniWinGen_Common. Sasa chagua faili hizi zote na uburute na uangushe kisha kwenye STM32CubeIDE kwenye folda ya MiniWinSimple_Common ya mradi wako.
  7. Sasa jenga upya na urejeshe mradi katika STM32CubeIDE na dirisha lako mpya la muundo litaonekana. Kitufe kwenye dirisha kimeenda kwa sababu example_empty.json haifafanua yoyote.

Hatua ya 4: Kuongeza Dirisha

Kuongeza Dirisha
Kuongeza Dirisha

Sasa tutaongeza dirisha la pili kwenye faili ya usanidi wa JSON na tuzindue tena nambari hiyo.

1. Fungua example_empty.json katika kihariri cha maandishi.

2. Chini ya sehemu ya "Windows" kuna safu ya ufafanuzi wa windows ambao kwa sasa una dirisha moja tu. Nakili haya yote…

{

"Jina": "W1", "Kichwa": "Dirisha 1", "X": 10, "Y": 15, "Upana": 200, "Urefu": 180, "Mpaka": kweli, "TitleBar": kweli, "Inaonekana": kweli, "imepunguzwa": uwongo}

na ibandike tena na koma iliyotenganisha ufafanuzi 2.

3. Badilisha "W1" kuwa "W2" na "Window 1" iwe "Window 2". Badilisha "X", "Y", "Upana" na "Urefu" kwa maadili tofauti tofauti ukizingatia azimio la skrini ni 240 pana na 320 juu.

4. Hifadhi faili na endesha jenereta ya nambari tena.

5. Nakili faili kama ilivyo katika hatua ya awali, jenga upya na uirudishe. Sasa utakuwa na madirisha 2 kwenye onyesho lako.

Hatua ya 5: Kuongeza Udhibiti

Inaongeza Udhibiti
Inaongeza Udhibiti

Sasa tutaongeza vidhibiti kwenye dirisha lako jipya. Hariri faili sawa na katika hatua ya awali.

1. Katika vipimo vya dirisha W1 ongeza koma baada ya mpangilio wa mwisho ("Imepunguzwa": uwongo) kisha ongeza maandishi haya

"MenuBar": kweli, "MenuBarEnabled": kweli, "MenuItems": ["Fred", "Bert", "Pete", "Alf", "Ian"], "Vifungo": [{"Jina": "B1", "Lebo": "Kitufe1", "X": 10, "Y": 10, "Imewezeshwa": kweli, "Inaonekana": kweli}]

Sehemu hii inaongeza bar ya menyu na vitu 5 na inaiwezesha (baa za menyu zinaweza kuzimwa ulimwenguni, jaribu). Pia inaongeza kitufe ambacho kimewezeshwa na kuonekana (zinaweza kuundwa bila kuonekana na kisha zikaonekana kwa nambari baadaye).

2. Zalisha msimbo tena, unakili kote, jenga upya, urejeshe yote kama hapo awali.

Hatua ya 6: Kufanya Udhibiti Kufanya Kitu

Kufanya Udhibiti Kufanya Kitu
Kufanya Udhibiti Kufanya Kitu

Sasa tuna kiolesura cha msingi cha mtumiaji tunahitaji kuifanya ifanye kitu. Kwa mfano huu tutaibuka mazungumzo ya kichagua rangi wakati kitufe kwenye Dirisha 1 kinabanwa.

Nenda kwa mradi wako katika STM32CubeIDE na ufungue folda ya MiniWinSimple_Common na kisha ufungue faili W1.c (jina la faili hii linalingana na uwanja wa "Jina" la dirisha kwenye faili ya JSON wakati nambari ilitengenezwa).

Katika faili hii utapata kazi windows_W1_message_function (). Inaonekana kama hii:

utupu windows_W1_message_function (const mw_message_t * message) {MW_ASSERT (message! = (void *) 0, "Null pointer parameter"); / * Mstari unaofuata unasimamisha maonyo ya mkusanyaji kwani ubadilishaji hautumiwi kwa sasa * / (batili) window_W1_data; badilisha (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Ongeza nambari yoyote ya uanzishaji wa windows hapa * / break; kesi MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Ongeza nambari ya utunzaji wa menyu hapa * / break; kesi MW_BUTTON_PRESSED_MESSAGE: ikiwa (message-> sender_handle == button_B1_handle) {/ * Ongeza nambari yako ya mshughulikiaji wa udhibiti huu hapa * /} kuvunja; default: / * Weka MISRA furaha * / mapumziko; }}

Hii inaitwa na msimamizi wa dirisha la dirisha hili wakati wowote msimamizi wa dirisha anapohitaji basi dirisha kujua kwamba kuna jambo limetokea. Katika kesi hii tunavutiwa kujua kwamba kitufe cha dirisha tu kimesisitizwa. Katika taarifa ya kubadili aina za ujumbe utaona kesi ya MW_BUTTON_PRESSED_MESSAGE. Nambari hii inatumika wakati kifungo kimeshinikizwa. Kuna kifungo kimoja tu kwenye dirisha hili, lakini kunaweza kuwa na zaidi, kwa hivyo hundi inafanywa juu ya kifungo gani. Katika kesi hii inaweza kuwa kifungo B1 tu (jina linalingana na jina la kitufe kwenye faili ya JSON tena).

Kwa hivyo baada ya lebo hii ya kesi ongeza nambari ili kutoa mazungumzo ya kuchagua rangi, ambayo ni hii:

mw_create_window_dialog_colour_chooser (10, 10, "Colour", MW_HAL_LCD_RED, uongo, ujumbe-> mpokeaji_mshikashikaji);

Vigezo ni kama ifuatavyo:

  • 10, 10 ni eneo kwenye skrini ya mazungumzo
  • "Rangi" ni jina la mazungumzo
  • MW_HAL_LCD_RED ndio rangi chaguomsingi ambayo mazungumzo yataanza nayo
  • Njia za uwongo hazionyeshi ukubwa mkubwa (jaribu kuiweka kuwa kweli na uone tofauti)
  • ujumbe-> mpokeaji wa mpokeaji ni nani anamiliki mazungumzo haya, katika kesi hii ni dirisha hili. Ushughulikiaji wa dirisha uko katika parameter ya ujumbe wa kazi. Hili ni dirisha ambalo majibu ya mazungumzo yatatumwa.

Ili kujua thamani ya rangi ambayo mtumiaji alichagua meneja wa dirisha atatuma dirisha letu ujumbe na rangi iliyochaguliwa wakati mtumiaji anabonyeza kitufe cha OK kwenye mazungumzo. Kwa hivyo tunahitaji kukatiza ujumbe huu pia na kesi nyingine kwenye taarifa ya kubadili ambayo inaonekana kama hii:

kesi MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE:

{mw_hal_lcd_colour_t selected_colour = message-> ujumbe_data; (batili) rangi_ iliyochaguliwa; } kuvunja;

Hatufanyi chochote na rangi iliyochaguliwa bado kwa hivyo tunaitupa tu ili kuzuia onyo la mkusanyaji. Nambari ya mwisho ya kazi hii sasa inaonekana kama hii:

batili windows_W1_message_function (const mw_message_t * ujumbe)

{MW_ASSERT (ujumbe! = (Utupu *) 0, "Kigezo cha null pointer"); / * Mstari unaofuata unasimamisha maonyo ya mkusanyaji kwani ubadilishaji hautumiwi kwa sasa * / (batili) window_W1_data; badilisha (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Ongeza nambari yoyote ya uanzishaji wa windows hapa * / break; kesi MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Ongeza nambari ya utunzaji wa menyu hapa * / break; kesi MW_BUTTON_PRESSED_MESSAGE: ikiwa (message-> sender_handle == button_B1_handle) {/ * Ongeza nambari yako ya kushughulikia kwa udhibiti huu hapa * / mw_create_window_dialog_colour_chooser (10, 10, "Colour", MW_HAL_LCD_RED, uwongo, ujumbe-> mpokeaji_pata) } kuvunja; kesi MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE: {mw_hal_lcd_colour_t selected_colour = message-> message_data; (batili) rangi_ iliyochaguliwa; } kuvunja; default: / * Weka MISRA furaha * / mapumziko; }}

Kuendesha msimbo kunaonyeshwa kwenye picha hapo juu. Unaweza kugundua kuwa wakati mazungumzo yanaonyesha lazima ujibu na kuikataa kabla ya kufanya kitu kingine chochote. Hii inaitwa tabia ya modali. Dialogs katika MiniWin na zote kawaida ulimwenguni na unaweza kuwa na onyesho moja kwa wakati mmoja. Kuna maelezo zaidi hapa…

en.wikipedia.org/wiki/Modal_window

Hatua ya 7: Kuchora kwenye Dirisha

Kuchora kwenye Dirisha
Kuchora kwenye Dirisha

Hadi sasa tumetumia vidhibiti tu, na wanajichora. Ni wakati wa kufanya uchoraji wa kawaida kwenye dirisha letu. Sehemu unayoweza kuchora iko ndani ya mipaka (ikiwa ni yoyote, ni ya hiari), ndani ya baa za kusogeza (ikiwa imefafanuliwa, pia hiari) na chini ya kichwa cha kichwa (ikiwa kuna moja, hiyo ni hiari pia). Inaitwa eneo la mteja katika istilahi za dirisha.

Kuna maktaba ya amri za picha kwenye MiniWin ambayo unaweza kutumia. Wote wanajua dirisha. Hiyo inamaanisha kuwa sio lazima kuwa na wasiwasi ikiwa dirisha linaonekana, limefichwa kwa sehemu na madirisha mengine, kuwashwa, kuzimwa au kuzima kabisa skrini, au ikiwa uratibu wa mahali unachora uko kwenye eneo la mteja au zaidi yake. Yote yametunzwa kwako. Huwezi kuchora nje ya eneo la mteja wako.

Kuchora juu ya maeneo ya mteja katika istilahi ya windows inaitwa uchoraji na kila dirisha ina kazi ya rangi mahali unapofanya kuchora kwako. Hutaita kazi yako ya rangi, msimamizi wa dirisha hukufanyia wakati inahitajika. Inahitajika wakati dirisha linahamishwa au dirisha lingine juu limebadilisha msimamo au mwonekano wake. Ikiwa unahitaji kupakwa rangi kwa dirisha lako kwa sababu data zingine ambazo yaliyomo kwenye dirisha hutegemea zimebadilika (yaani unajua kuwa upakaji rangi unahitajika badala ya meneja wa dirisha kujua), basi unamwambia msimamizi wa dirisha kwamba upakaji rangi unahitajika na inaita kazi yako ya rangi. Hauiti mwenyewe. (Hii yote imeonyeshwa katika sehemu inayofuata).

Kwanza, unahitaji kupata kazi yako ya rangi. Jenereta ya nambari imekutengenezea na iko juu tu ya kazi ya kushughulikia ujumbe iliyobadilishwa katika sehemu iliyopita. Nenda kwenye mradi wako na ufungue faili W1.c tena.

Katika faili hii utapata kazi windows_W1_paint_function (). Inaonekana kama hii:

utupu wa windows_W1_paint_function (mw_handle_t window_handle, const mw_gl_draw_info_t * draw_info)

{MW_ASSERT (draw_info! = (Batili *) 0, "Kigezo cha null pointer"); / * Jaza eneo la mteja wa dirisha na nyeupe nyeupe * / 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_ mstatili (draw_info, 0, 0, mw_get_window_client_rect (window_handle).width, mw_get_window_client_rect (window_handle). urefu); / * Ongeza nambari ya kuchora ya dirisha hapa * /}

Hii ndio nambari iliyotengenezwa wazi na inachofanya ni kujaza eneo la mteja na nyeupe nyeupe. Hebu chora mduara uliojaa manjano kwenye eneo la mteja. Kwanza tunapaswa kuelewa dhana ya muktadha wa picha (kitu kingine cha windows). Tunaweka vigezo vya kuchora katika muktadha wa picha na kisha tunaita utaratibu wa kuchora mduara wa generic. Vitu tunavyopaswa kuweka katika mfano huu ni ikiwa duara ina mpaka, mtindo wa laini ya mpaka, rangi ya mpaka, ikiwa duara imejazwa, jaza rangi na ujaze muundo. Unaweza kuona nambari iliyo hapo juu ambayo inafanya kitu sawa na kujaza eneo la mteja na mstatili mweupe uliojaa usio na mpaka. Thamani katika muktadha wa picha hazikumbuki kati ya kila simu ya kazi ya rangi kwa hivyo lazima usanidi maadili kila wakati (zinakumbukwa na kazi ya rangi ingawa).

Katika nambari hapo juu unaweza kuona kuwa kujaza kumewashwa na muundo wa kujaza umezimwa, kwa hivyo hatuitaji kuweka hizo tena. Tunahitaji kuweka mpaka, mtindo wa laini ya mpaka kuwa dhabiti, rangi ya mbele ya mpaka kuwa nyeusi na kujaza rangi ya manjano kama hii:

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

Ongeza nambari hii kwenye maoni katika kazi hii ambapo inasema kuongeza nambari yako. Ifuatayo tunahitaji kuteka duara ambayo imefanywa kama hii:

mw_gl_circle (kuteka_info, 30, 30, 15);

Hii inachora mduara katika kuratibu 30, 30 na eneo la radius 15. Jenga tena nambari hiyo na uirejeshe tena na utaona duara kwenye dirisha kama inavyoonyeshwa hapo juu. Utagundua kuwa duara na kitufe vinaingiliana lakini kitufe kiko juu. Hii ni kwa kubuni. Udhibiti huwa juu ya kila kitu unachochora kwenye eneo la mteja.

Hatua ya 8: Takwimu za Dirisha

Takwimu za Dirisha
Takwimu za Dirisha

Hadi sasa tumetekeleza nambari yetu mwenyewe katika kazi ya ujumbe wa Window 1 (kushughulikia ujumbe unaoingia) na kazi yake ya rangi (kuteka kwenye eneo la mteja wa dirisha). Sasa ni wakati wa kuunganisha hizi mbili. Wacha tujaze duara iliyochorwa kwenye kazi ya rangi na rangi ambayo mtumiaji anachagua na kichagua rangi wakati kitufe kilibanwa. Kumbuka kwamba hatuiti kazi ya rangi, meneja wa dirisha hufanya hivyo, kwa hivyo ujumbe wetu wa kazi (ambao unajua rangi iliyochaguliwa) hauwezi kuita kazi ya rangi moja kwa moja yenyewe. Badala yake tunahitaji kuhifadhi data na kumruhusu meneja wa dirisha kujua kuwa rangi inahitajika. Meneja wa dirisha ataita kazi ya rangi ambayo inaweza kutumia data iliyohifadhiwa.

Juu ya W1.c utaona muundo wa data tupu na kitu cha aina hii kilichotangazwa na jenereta ya nambari kama hii:

typedef muundo

{/ * Ongeza washiriki wako wa data hapa * / char dummy; / * Watunzi wengine wanalalamika juu ya ujengaji mtupu; ondoa hii unapoongeza washiriki wako * /} dirisha_W1_data_t; tuli window_W1_data_t dirisha_W1_data;

Hapa ndipo tunapochukua data yetu ili ihifadhiwe kwenye simu na inajulikana kama data ya dirisha. Tunahitaji tu kuhifadhi rangi iliyochaguliwa hapa, kama hii:

typedef muundo

{/ * Ongeza wanachama wako wa data hapa * / mw_hal_lcd_colour_t kheth_colour; } dirisha_W1_data_t; tuli window_W1_data_t window_W1_data = {MW_HAL_LCD_YELLOW};

Tutaipa rangi ya kuanzia ya manjano. Sasa katika kazi ya ujumbe tutabadilisha nambari kidogo ili kuokoa rangi iliyochaguliwa hapa kama hii:

kesi MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE:

{window_W1_data.chosen_colour = message-> ujumbe_data; } kuvunja;

Kisha tutabadilisha kazi ya rangi ili kutumia thamani hii wakati inachora duara kama hii:

mw_gl_set_solid_fill_colour (dirisha_W1_data.chaguo_chaji);

Sasa tumebadilisha data ambayo yaliyomo kwenye dirisha inategemea, kwa hivyo tunahitaji kumruhusu meneja wa dirisha kujua kwamba dirisha linahitaji kupakwa rangi tena. Tunafanya katika kazi ya ujumbe wakati ujumbe wa mazungumzo ya OK unapokelewa, kama hii:

mw_paint_window_client (ujumbe-> mpokeaji_mshirika);

Hii haisababisha dirisha kupakwa rangi moja kwa moja. Ni kazi ya matumizi ambayo hutuma ujumbe kwa msimamizi wa dirisha kwamba dirisha inahitaji kupakwa rangi (ikiwa utaingia ndani unaweza kuona jinsi hii inatokea). Dirisha ambalo linahitaji kupakwa rangi tena katika kesi hii ni yenyewe, na kipini cha dirisha kiko kwenye parameter ya ujumbe kwa kazi ya kushughulikia ujumbe.

Faili nzima sasa inaonekana kama hii ikiwa huna uhakika ambapo baadhi ya vijisehemu vya nambari hapo juu huenda:

# pamoja

# pamoja na "miniwin.h" # pamoja na "miniwin_user.h" # pamoja na "W1.h" typedef struct {/ * Ongeza wanachama wako wa data hapa * / mw_hal_lcd_colour_t selected_colour; } dirisha_W1_data_t; tuli window_W1_data_t window_W1_data = {MW_HAL_LCD_YELLOW}; batili window_W1_paint_function (mw_handle_t window_handle, const mw_gl_draw_info_t * draw_info) {MW_ASSERT (draw_info! = (batili *) 0, "Kigezo cha null pointer"); / * Jaza eneo la mteja wa dirisha na nyeupe nyeupe * / 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_ mstatili (draw_info, 0, 0, mw_get_window_client_rect (window_handle).width, mw_get_window_client_rect (window_handle). urefu); / * Ongeza nambari ya uchoraji wa dirisha hapa * / mw_gl_set_fg_colour (MW_HAL_LCD_BLACK); mw_gl_set_solid_fill_colour (dirisha_W1_data.chaguo_chaji); mw_gl_set_line (MW_GL_SOLID_LINE); mw_gl_set_border (MW_GL_BORDER_ON); mw_gl_circle (kuteka_info, 30, 30, 15); } batili window_W1_message_function (const mw_message_t * message) {MW_ASSERT (message! = (void *) 0, "Null pointer parameter"); / * Mstari unaofuata unasimamisha maonyo ya mkusanyaji kwani ubadilishaji hautumiwi kwa sasa * / (batili) window_W1_data; badilisha (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Ongeza nambari yoyote ya uanzishaji wa windows hapa * / break; kesi MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Ongeza nambari ya utunzaji wa menyu hapa * / break; kesi MW_BUTTON_PRESSED_MESSAGE: ikiwa (message-> sender_handle == button_B1_handle) {/ * Ongeza nambari yako ya kushughulikia kwa udhibiti huu hapa * / mw_create_window_dialog_colour_chooser (10, 10, "Colour", MW_HAL_LCD_RED, uwongo, ujumbe-> mpokeaji_pata) } kuvunja; kesi MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE: {window_W1_data.chosen_colour = message-> message_data; mw_paint_window_client (ujumbe-> mpokeaji_mshirika); } kuvunja; default: / * Weka MISRA furaha * / mapumziko; }}

Jenga na kukimbia tena na unapaswa kuweka rangi ya kujaza ya mduara.

Mfano huu wa data ya windows hutumia data iliyohifadhiwa katika muundo wa data tuli tuli juu faili ya chanzo. Hii ni sawa ikiwa una mfano mmoja tu wa dirisha, kama tunavyofanya katika mfano huu, lakini ikiwa una zaidi ya mfano mmoja basi wote watashiriki muundo huo wa data. Inawezekana kuwa na data ya kila mfano kwa hivyo visa kadhaa vya aina hiyo ya dirisha vina data zao. Hii imeelezewa katika hati ya MiniWin inayopatikana kwenye saraka ya hati. Mfano wa faili hutumia kuonyesha picha nyingi katika aina moja ya dirisha (kama inavyoonekana kwenye picha kuu juu kabisa ya hii inayoweza kufundishwa).

Hatua ya 9: Furaha Fonti ya Mwisho

Furaha Fonti ya Mwisho
Furaha Fonti ya Mwisho

MiniWin inasaidia utoaji wa fonti ya TrueType. Ikiwa kuna jambo moja ambalo hufanya interface yako ya mtumiaji ionekane ni fonti zinazovutia. Hatua hii ya mwisho inaonyesha jinsi ya kutoa font ya TrueType kwenye Dirisha la MiniWin.

Kuna njia mbili za kutoa fonti za TrueType. Moja ni kuwavuta moja kwa moja kwenye eneo la mteja wako kama ilifanywa kwa mduara mapema, na nyingine ni kuongeza udhibiti wa sanduku la maandishi kwenye dirisha lako. Tunafanya mwisho kwani ni rahisi.

Sasa tutaongeza udhibiti wa kisanduku cha maandishi kwenye faili yetu ya usanidi wa JSON. Ongeza kwenye ufafanuzi wa Dirisha 2 ili iweze kuonekana kama hii:

kama hii:

{

"Jina": "W2", "Kichwa": "Dirisha 2", "X": 50, "Y": 65, "Upana": 100, "Urefu": 80, "Mpaka": kweli, "TitleBar": kweli, "Inaonekana": kweli, "imepunguzwa": uwongo, "TextBoxes": [{"Jina": "TB1", "X": 0, "Y": 0, "Upana": 115, "Urefu": 50, "Kuhesabiwa haki": "Kituo", "BackgroundColour": "MW_HAL_LCD_YELLOW", "ForegroundColour": "MW_HAL_LCD_BLACK", "Fonti": "mf_rlefont_BLKCHCRY16", "Imewezeshwa": kweli, "Inaonekana": kweli}]}}

Neno la haraka kuhusu fonti za TrueType katika MiniWin. Fonti huja katika faili za.ttf. Katika mameneja wa windows kwenye kompyuta kubwa hizi hutolewa kwenye onyesho lako wakati zinahitajika. Hii inachukua nguvu nyingi za usindikaji na kumbukumbu na haifai kwa vifaa vidogo. Katika MiniWin wamechakatwa mapema kuwa bitmaps na kuunganishwa wakati wa kukusanya kwa saizi ya fonti na mtindo (herufi, italiki nk) kwa hivyo lazima uamue ni fonti gani kwa saizi na mtindo gani utatumia wakati wa kukusanya. Hii imefanywa kwako kwa fonts mbili za mfano katika faili ya zip ya MiniWin uliyopakua. Ikiwa unataka kutumia fonti zingine kwa saizi zingine na mitindo angalia nyaraka za MiniWin kwenye folda ya hati. Kuna zana katika MiniWin ya Windows na Linux kwa usindikaji wa faili za.ttf katika faili za nambari za chanzo unaweza kushuka kwenye mradi wako.

Na neno la pili la haraka - fonti nyingi ni hakimiliki, pamoja na zile utakazopata katika Microsoft Windows. Zitumie kwa mapenzi kwa matumizi ya kibinafsi, lakini chochote unachochapisha lazima uhakikishe kuwa leseni fonti zimechapishwa na inaruhusu, kama ilivyo kwa fonti 2 zilizojumuishwa katika MiniWin, lakini sio fonti za Microsoft!

Rudi kwenye msimbo! Tengeneza, dondosha faili, jenga na urejeshe kama hapo awali na utaona Dirisha 2 sasa ina maandishi ya msingi kwenye msingi wa manjano kwenye font ya wacky. Wacha tubadilishe maandishi kwa kuhariri faili ya chanzo ya Window 2 W2.c.

Tunahitaji kuwasiliana na kisanduku cha maandishi ambacho tumetengeneza tu na jinsi unavyofanya hivyo kama mawasiliano yoyote katika MiniWin ni kutuma ujumbe. Tunataka kuweka maandishi katika udhibiti wakati dirisha linaundwa lakini kabla ya kuonyeshwa, kwa hivyo tunaongeza nambari katika kishika ujumbe katika kesi ya MW_WINDOW_CREATED_MESSAGE. Hii inapokelewa na msimbo wa dirisha kabla tu ya dirisha kuonyeshwa na imekusudiwa kwa uanzishaji kama huu. Jenereta ya nambari iliunda kishikilia mahali ambacho kinaonekana kama hii katika kazi ya kushughulikia ujumbe:

kesi MW_WINDOW_CREATED_MESSAGE:

/ * Ongeza nambari yoyote ya kuanzisha dirisha hapa * / kuvunja;

Hapa tutatuma ujumbe kwa udhibiti wa kisanduku cha maandishi kuwaambia ni maandishi gani tunayotaka yaonyeshe kwa kutumia mw_post_message kazi kama hii:

kesi MW_WINDOW_CREATED_MESSAGE:

/ * Ongeza msimbo wowote wa kuanzisha hapa kuvunja;

Hizi ni vigezo:

  • MW_TEXT_BOX_SET_TEXT_MESSAGE - Hii ndio aina ya ujumbe ambao tunatuma kwa udhibiti. Zimeorodheshwa kwenye miniwin.h na zimehifadhiwa kwenye nyaraka.
  • ujumbe-> mpokeaji_handle - Huyu ndiye anayetoka ujumbe - dirisha hili - mpini ambao uko katika kigezo cha ujumbe uliopitishwa kwa kazi ya mshughulikiaji wa ujumbe.
  • text_box_TB1_handle - Ni nani tunatuma ujumbe kwa - mpini wa udhibiti wa kisanduku cha maandishi. Hizi zimeorodheshwa kwenye faili iliyotengenezwa miniwin_user.h.
  • 0UL - Thamani ya data, hakuna chochote katika kesi hii.
  • "Tulikuwa usiku wenye giza na dhoruba …" - Thamani ya Kiashiria - maandishi mapya.
  • MW_CONTROL_MESSAGE - Aina ya mpokeaji ambayo ni udhibiti.

Hiyo ndio. Jenga upya na ujirudishe kama kawaida na utapata kisanduku cha maandishi kuonyesha kama kwenye picha hapo juu.

Kuchapisha ujumbe ni muhimu kwa MiniWin (kama ilivyo kwa mameneja wote wa madirisha). Kwa mifano zaidi angalia miradi ya mfano kwenye faili ya zip na kwa maelezo kamili soma sehemu kwenye ujumbe wa MiniWin kwenye nyaraka.

Hatua ya 10: Kuendelea zaidi

Image
Image

Hiyo ni kwa utangulizi huu wa kimsingi kwa MiniWin. MiniWin inaweza kufanya mengi zaidi kuliko ilivyoonyeshwa hapa. Kwa mfano, skrini kwenye ubao inayotumiwa katika kufundisha hii ni ndogo na vidhibiti ni vidogo na vinahitaji kutumiwa na dibber. Walakini, mifano mingine na vifaa vinatumia vidhibiti vikubwa (kuna saizi 2) kwenye maonyesho makubwa na hizi zinaweza kuendeshwa kwa kidole.

Kuna aina nyingine nyingi za udhibiti kuliko zile zilizoonyeshwa hapa. Kwa udhibiti zaidi angalia mfano anuwai faili za JSON kwenye folda ya jenereta ya nambari. Aina zote za udhibiti zimefunikwa katika mifano hii.

Windows zina chaguzi nyingi. Mpaka, kichwa cha kichwa na ikoni zote zinaweza kusanidi. Unaweza kuwa na baa za kusogeza na kusogeza maeneo ya mteja wa windows, visa kadhaa vya aina moja ya windows na windows zinaweza kuwa uchi (tu eneo la mteja, hakuna mpaka au kichwa cha kichwa) ambayo inamaanisha kuwa wamewekwa wakati wa kukusanya mahali kwenye onyesho (angalia picha katika sehemu hii na saizi kubwa icon - hizi ni windows 6 uchi).

MiniWin haitumii kumbukumbu ya nguvu. Hii inafanya kuwa inafaa kwa vifaa vidogo vilivyozuiliwa na ni hitaji kwa miradi fulani iliyoingizwa. MiniWin na nambari inayotengeneza pia ni kamili MISRA 2012 inatii kiwango cha 'kinachohitajika'.

Kwa habari zaidi angalia folda ya hati kwa nyaraka na pia programu zingine za mfano kwenye faili ya zip. Kuna mifano hapa inayoonyesha jinsi ya kutumia huduma zote za MiniWin na jinsi ya kuunganisha MiniWin na FatFS na FreeRTOS.

Ilipendekeza: