Mündəricat:

Daxili Pəncərə Meneceri: 10 addım
Daxili Pəncərə Meneceri: 10 addım

Video: Daxili Pəncərə Meneceri: 10 addım

Video: Daxili Pəncərə Meneceri: 10 addım
Video: Kim nə başa düşdü ❓ 2024, Iyul
Anonim
Daxili Pəncərə Meneceri
Daxili Pəncərə Meneceri
Daxili Pəncərə Meneceri
Daxili Pəncərə Meneceri
Daxili Pəncərə Meneceri
Daxili Pəncərə Meneceri
Daxili Pəncərə Meneceri
Daxili Pəncərə Meneceri

Bu layihə, LCD paneli və toxunma ekranı olan quraşdırılmış mikro nəzarətçi üzərində daşınan üst-üstə düşən pəncərələri olan bir pəncərə menecerinin necə tətbiq olunacağını göstərir. Bunu etmək üçün kommersiya olaraq mövcud olan proqram paketləri var, lakin pula başa gəlir və bağlı mənbəyidir. MiniWin adlanan bu pulsuz və açıq mənbəyidir. Tamamilə uyğun C99 ilə yazılmışdır və C və ya C ++ tətbiqlərində istifadə edilə bilər. MiniWin -in məqsədləri, istifadəsi asan, dəyişdirilməsi asan, genişləndirilə bilən, geniş çeşidli aparatlara daşınan və çox qaynaqlı olmamaqdır.

Pəncərələrinizi idarə etmək üçün kodu təmin etməklə yanaşı, MiniWin -də istifadəçi interfeysi idarəetmə kolleksiyası var - düymələr, sürgülər, irəliləyiş çubuqları, ağaclar və s. Eyni tipli birdən çox pəncərəyə və ya birdən çox nümunəyə sahib ola bilərsiniz. Pəncərələri gəzdirmək, ölçüsünü artırmaq, böyütmək, kiçiltmək, bağlamaq olar - daha böyük pəncərə menecerlərində pəncərələrlə etdiyiniz adi işlər. Kerning və yuvarlaqlaşdırma əleyhinə olan TrueType şriftləri (mətnin smooooooth görünməsini təmin edir) cəlbedici mətn göstərilməsi üçün də dəstəklənir.

Hər bir pəncərədə bir müştəri sahəsi var (sərhədin içərisində və üst çubuğun altındakı yer). Bunun üzərinə bir dialoq qurmaq üçün nəzarət əlavə edə bilərsiniz və ya istədiyiniz hər şeyi çəkmək üçün daxili qrafik kitabxanasından istifadə edə bilərsiniz. Bütün qrafik kitabxana funksiyaları pəncərədən xəbərdardır. Pəncərənizin harada olması, nə ilə üst -üstə düşməsi və ya minimuma endirilməsi barədə narahat olmağınıza ehtiyac yoxdur.

Öz pəncərələrinizi düzəltməklə yanaşı, bir neçə standart dialoq da var - məsələn, təsdiq dialoqları (sadəcə OK və ya Bəli/Xeyr düymələri), vaxt/tarix təyin edənlər, fayl seçiciləri, rəng seçicilər və s.

MiniWin, standart bir Windows meneceri dizayn mesaj sırası sistemindən istifadə edir. Windows mesajlar vasitəsilə bir -biri ilə və pəncərə meneceri ilə qarşılıqlı əlaqə qura bilər. İşləri birbaşa etmək üçün funksiyalara zəng etmirsiniz, növbəyə bir mesaj əlavə edirsiniz və pəncərə meneceri bunu sizin üçün qəbul edəcək.

MiniWin, ST, NXP və Renesas mikro nəzarətçi satıcılarının sensor ekranlı standart inkişaf lövhələrinə köçürüldü. Bütün bu cihazlar üçün hardware sürücüləri və nümunə layihələr var. Əlavə olaraq MiniWin Windows və ya Linux üçün qurula bilər ki, quraşdırılmış qurğunuzu əldə etməzdən əvvəl istifadəçi interfeysi kodunuzu simulyasiya edə biləsiniz.

MiniWin -də kod generatoru var. İnsan tərəfindən oxunan JSON faylı yaratmaq üçün pəncərələrinizi və idarəetmələrinizi sadə bir şəkildə təyin edə bilərsiniz və kod generatoru faylı təhlil edir və sizin üçün kodu yaradır (izləmək üçün çoxlu nümunələr var). Yalnız qurula bilən Windows və ya Linux tam simulyator tətbiqetmələri yaradır və MiniWin pəncərələriniz işləyən simulyasiya edilmiş LCD ekranınız var. Eyni yaradılan kodu götürüb gömülü bir layihəyə buraxa və eyni pəncərələri və idarə olunan anları sonradan quraşdırılmış aparatınızda göstərən eyni koda sahib ola bilərsiniz.

MiniWin, quraşdırılmış cihazda əməliyyat dəstəyi tələb etmir. Hamısı tək bir mövzuda işləyir. MiniWin, quraşdırılmış bir prosessorda işləyən RTOS ilə birləşdirilə bilər və MiniWin -i FreeRTOS ilə birləşdirən nümunələr var.

Bu təlimat, QVGA sensor ekranı ilə təchiz edilmiş ucuz STM32F429 Discovery lövhəsini istifadə edərək MiniWin -in STM32 M4 prosessorunda necə işə salınacağını göstərir. Bunlar elektron komponent təchizatçınızdan asanlıqla əldə edilə bilər.

MiniWin orta səviyyəli mikro nəzarətçilərdə və yuxarıda işləyir.

Təchizat

STM32F429I-DISC1 inkişaf lövhəsi və mikro USB kabeli

Pulsuz olan STM32CubeIDE yükləyin.

Addım 1: Kodu əldə edin

Kodu əldə etmək
Kodu əldə etmək

Əvvəlcə STM32CubeIDE quraşdırmalısınız. Bunu ST saytından əldə edə bilərsiniz. Qeydiyyatdan keçməlisiniz və onu yükləmək və quraşdırmaq bir müddət çəkir. Hamısı pulsuzdur.

Quraşdırarkən MiniWin qaynağını yükləyin və açın. Böyükdür, ancaq bunun kiçik bir hissəsini istifadə edəcəksiniz. Buradakı yaşıl 'Klon və ya Yüklə' düyməsini basın …

github.com/miniwinwm/miniwinwm

sonra Zip Yüklə seçin. Məzmunu açın.

Addım 2: Nümunə Layihə Yaratmaq

Nümunə Layihə Yaratmaq
Nümunə Layihə Yaratmaq
Nümunə Layihə Yaratmaq
Nümunə Layihə Yaratmaq

Əvvəlcə nümunə layihələrdən birini quraq. Yaxşı birinə MiniWinSimple deyilir. STM32CubeIDE başladın və sonra bunu edin:

  1. Fayl | İdxal et…
  2. Ümumi açın və İş Sahəsinə Mövcud Layihəni seçin. Sonrakı.
  3. "Browse" düyməsini basın və MiniWin -in açıldığı yerə gedin. Sonra STM32CubeIDE / MiniWinSimple / STM32F429 qovluğuna gedin. Qovluq Seç düyməsini basın.
  4. Layihədə: MiniWinSimple_STM32F429 işarəsini vurun və sonra Bitir düyməsini basın.
  5. MiniWinSimple_STM32F429 layihəsi Project Explorer -də görünəcək. Seçin və sonra Project | Build Project ilə qurun.
  6. İndi USB kabelinizi lövhəyə və kompüterinizə qoşun və Run | Debug istifadə edərək işə salın və yükləndikdə Run | Resume seçin. İlk dəfə bir ekran kalibrləmə ekranı alacaqsınız, buna görə LCD ekrandakı 3 xaçın mərkəzinə toxunun. İndi ekrandakı pəncərə ilə qarşılıqlı əlaqə qura bilərsiniz.

Bir pəncərəni hərəkət etdirmək üçün başlıq çubuğundan sürüşdürün. Pəncərənin ölçüsünü dəyişdirmək üçün başlıq çubuğunun solundakı ağ üçbucaq işarəsindən istifadə edin. MiniWin istifadə olunan ekranlar çox kiçik olduğu üçün sərhədləri sürükləyərək MiniWin pəncərələrinin ölçüsü dəyişdirilə bilməz. Pəncərəni kiçiltmək, böyütmək və ya bağlamaq üçün başlıq çubuğunun sağ ucundakı nişanlardan istifadə edin (qapanma əlil ola bilər). Pəncərə kiçildikdə, kiçildilmiş nişanları gəzdirə bilməzsiniz. Aşağıdan soldan sağa doğru qururlar.

Addım 3: Kod Generatoru işə salın

Kod Generatoru işə salın
Kod Generatoru işə salın

İndi biz özümüzə məxsus bəzi pəncərələr yaradaraq yeni kodu daxil edərək nümunə layihəni dəyişəcəyik. Bunu etmək üçün kod generatorunu işə salacağıq.

  1. Əmr əmrini açın və MiniWin -i açdığınız qovluğa, sonra isə Tools / CodeGen qovluğuna gedin.
  2. Windows CodeGen.exe üçün icra olunan fayl artıq mövcuddur. Linux üçün make yazaraq qurmalısınız. (Yüklənmiş bir icra edilə bilən proqramı işə salmaqdan narahat olsanız da, Windows üçün mənbədən qura bilərsiniz, ancaq kompilyator və inkişaf mühitinin quraşdırılması lazımdır. Ətraflı məlumat üçün sənədlər qovluğundakı MiniWin sənədlərinə baxın).
  3. Bu qovluqda bəzi JSON sənədləri var. Example_empty.json istifadə edəcəyik. Windows və ya Linux üçün qurmaq üçün əvvəlcə redaktə etməlisiniz. Bir redaktorda açın və "TargetType" tapacağınız yuxarıda "Linux" və ya "Windows" dəyərini kod generatorunu işlədiyinizə dəyişdirin.
  4. İndi əmr satırına codegen example_empty.json yazın.
  5. STM32CubeIDE -də layihənizə gedin və MiniWinSimple_Common qovluğunu açın. Oradakı bütün faylları silin.
  6. "TargetName" ni JSON faylında "MiniWinGen" də standart olaraq buraxdıq, buna görə yaradılan kod qovluğumuzun adı budur. MiniWin və sonra MiniWinGen_Common qovluğunu açdığınız qovluğa gedin. İndi bütün bu faylları seçin və layihənizin MiniWinSimple_Common qovluğunda STM32CubeIDE -ə sürükləyib buraxın.
  7. İndi STM32CubeIDE -də layihəni yenidən qurun və yenidən başladın və yeni dizayn pəncərəniz görünəcək. Example_empty.json heç birini təyin etmədiyi üçün pəncərədəki düymə getdi.

Addım 4: Pəncərə əlavə edin

Pəncərə əlavə etmək
Pəncərə əlavə etmək

İndi JSON konfiqurasiya faylına ikinci bir pəncərə əlavə edəcəyik və kodu yenidən yaradacağıq.

1. Mətn redaktorunda example_empty.json açın.

2. "Windows" bölməsinin altında hazırda yalnız bir pəncərəsi olan bir sıra Windows tərifləri var. Bütün bunları kopyalayın…

{

"Ad": "W1", "Başlıq": "Pəncərə 1", "X": 10, "Y": 15, "Genişlik": 200, "Boy": 180, "Sərhəd": doğru, "TitleBar": doğru, "Görünən": doğru, "Kiçikləşdirilmiş": yalan}

və 2 tərifi ayıran vergüllə yenidən yapışdırın.

3. "W1" -i "W2" və "Window 1" -i "Window 2" olaraq dəyişdirin. "X", "Y", "Width" və "Height" parametrlərini, ekran çözünürlüğünün 240 eni 320 yüksəklikdə olduğunu nəzərə alaraq bəzi fərqli dəyərlərə dəyişdirin.

4. Faylı qeyd edin və kod generatorunu yenidən işə salın.

5. Faylları əvvəlki addımdakı kimi kopyalayın, yenidən qurun və yenidən başladın. İndi ekranda 2 pəncərəniz olacaq.

Addım 5: Nəzarət əlavə edin

Nəzarət əlavə etmək
Nəzarət əlavə etmək

İndi yeni pəncərənizə bir neçə nəzarət əlavə edəcəyik. Əvvəlki addımda olduğu kimi eyni faylı düzəldin.

1. W1 pəncərəsinin spesifikasiyasında son parametrdən sonra vergül əlavə edin ("Minimize": false) sonra bu mətni əlavə edin

"MenuBar": doğru, "MenuBarEnabled": doğru, "MenuItems": ["Fred", "Bert", "Pete", "Alf", "Ian"], "Düymələr": [{"Ad": "B1", "Etiket": "Button1", "X": 10, "Y": 10, "Enabled": true, "Visible": true}]

Bu bölmə 5 maddədən ibarət bir menyu çubuğu əlavə edir və onu aktivləşdirir (menyu çubuqları qlobal olaraq əlil ola bilər, sınayın). Ayrıca aktiv və görünən bir düymə əlavə edir (görünməz olaraq yaradıla bilər və sonra kodda görünə bilər).

2. Kodu yenidən yaradın, kopyalayın, yenidən qurun, hamısını əvvəlki kimi təkrarlayın.

Addım 6: Nəzarətçilərə nəsə etmək

Nəzarət Bir şey Etmək
Nəzarət Bir şey Etmək

İndi bir şey etməsi üçün lazım olan əsas istifadəçi interfeysinə sahibik. Bu nümunə üçün, Window 1 düyməsinə basıldığında bir rəng seçici informasiya qutusu açacağıq.

STM32CubeIDE -də layihənizə gedin və MiniWinSimple_Common qovluğunu açın və sonra W1.c faylını açın (bu faylın adı JSON faylındakı pəncərənin "Ad" sahəsinə uyğundur).

Bu faylda window_W1_message_function () funksiyasını tapacaqsınız. Bu belə görünür:

void window_W1_message_function (const mw_message_t *mesaj) {MW_ASSERT (mesaj! = (boş *) 0, "Sıfır göstərici parametri"); / * Növbəti sətir kompilyator xəbərdarlıqlarını dayandırır, çünki dəyişən hazırda istifadə edilmir */ (void) window_W1_data; switch (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Bura hər hansı bir pəncərə başlanğıc kodu əlavə edin * / break; case MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Pəncərə menyusu işləmə kodunu bura əlavə edin * / break; case MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Bu nəzarət üçün idarəçi kodunuzu bura əlavə edin / /} fasilə; default: / * MISRA'yı xoşbəxt tutun * / break; }}

Pəncərə meneceri bir şeyin baş verdiyini pəncərəyə bildirməli olduğu zaman bu pəncərə meneceri tərəfindən çağırılır. Bu vəziyyətdə, pəncərənin yeganə düyməsinə basıldığını bilmək maraqlıdır. Mesaj növləri üçün keçid ifadəsində MW_BUTTON_PRESSED_MESSAGE üçün bir iş görürsünüz. Bu kod düyməyə basıldıqda işləyir. Bu pəncərədə yalnız bir düymə var, amma daha çox ola bilər, buna görə də hansı düymənin olduğu yoxlanılır. Bu halda bu yalnız B1 düyməsi ola bilər (ad yenidən JSON faylındakı düymənin adına uyğun gəlir).

Bu halda etiketdən sonra rəng seçici dialoqunu açmaq üçün kodu əlavə edin:

mw_create_window_dialog_colour_chooser (10, 10, "Rəng", MW_HAL_LCD_RED, yalan, mesaj-> alıcı_handle);

Parametrlər aşağıdakı kimidir:

  • 10, 10, dialoqun ekranındakı yerdir
  • "Rəng" dialoqun başlığıdır
  • MW_HAL_LCD_RED, dialoqun başlayacağı standart rəngdir
  • saxta vasitələr böyük ölçü göstərmir (bunu doğru olaraq təyin etməyə çalışın və fərqi görün)
  • mesaj-> alıcı sapı bu dialoqun sahibidir, bu halda bu pəncərədir. Pəncərənin sapı funksiyanın mesaj parametrindədir. Dialoq cavabının göndəriləcəyi pəncərə budur.

İstifadəçi pəncərə menecerinin seçdiyi rəngin dəyərini öyrənmək üçün istifadəçi dialoqdakı OK düyməsini basdıqda pəncərəmizə seçilmiş rəngli bir mesaj göndərəcək. Buna görə də bu mesajı, keçid ifadəsindəki başqa bir halla belə görməliyik:

hal MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE:

{mw_hal_lcd_colour_t selected_colour = mesaj-> mesaj_datası; (etibarsız) selected_colour; } fasilə;

Seçilmiş rənglə hələ heç nə etmirik, buna görə də tərtibçi xəbərdarlığının qarşısını almaq üçün onu boş yerə qoyuruq. Bu funksiyanın son kodu indi belə görünür:

void window_W1_message_function (const mw_message_t *mesajı)

{MW_ASSERT (mesaj! = (Boş*) 0, "Sıfır göstərici parametri"); / * Növbəti sətir kompilyator xəbərdarlıqlarını dayandırır, çünki dəyişən hazırda istifadə edilmir */ (void) window_W1_data; switch (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Buraya hər hansı bir pəncərə başlanğıc kodu əlavə edin * / break; case MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Pəncərə menyusu işləmə kodunu bura əlavə edin * / break; case MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Buraya bu nəzarət üçün idarəçi kodunuzu əlavə edin * / mw_create_window_dialog_colour_chooser (10, 10, "Color", MW_HAL_LCD_RED,) } fasilə; hal MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE: {mw_hal_lcd_colour_t selected_colour = message-> message_data; (etibarsız) selected_colour; } fasilə; default: / * MISRA'yı xoşbəxt tut * / break; }}

Kodu işə salmaq yuxarıdakı şəkildə göstərilir. Bir dialoq göstərildikdə, başqa bir şey etməzdən əvvəl ona cavab verməli və onu ləğv etməli olduğunuzu görə bilərsiniz. Buna modal davranış deyilir. MiniWin -də dialoqlar və hamısı həmişə qlobal səviyyədədir və bir anda yalnız bir nümayişə sahib ola bilərsiniz. Burada daha çox izahat var …

en.wikipedia.org/wiki/Modal_window

Addım 7: Pəncərədə rəsm çəkin

Pəncərədə rəsm çəkmək
Pəncərədə rəsm çəkmək

İndiyə qədər yalnız nəzarət vasitələrindən istifadə etdik və onlar özlərini çəkirlər. Pəncərəmizdə xüsusi bir rəsm çəkməyin vaxtı gəldi. Çəkə biləcəyiniz hissə sərhədlərin içərisindədir (əgər varsa, onlar isteğe bağlıdır), sürüşmə çubuqlarının içərisində (təyin olunarsa, həm də isteğe bağlıdır) və başlıq çubuğunun altındadır (əgər varsa, bu da isteğe bağlıdır). Pəncərə terminologiyasında müştəri sahəsi adlanır.

MiniWin -də istifadə edə biləcəyiniz qrafik əmrləri kitabxanası var. Hamısı pəncərədən xəbərdardır. Bu o deməkdir ki, pəncərənin göründüyü, digər pəncərələr tərəfindən qismən gizlədildiyi, ekranın açıldığı, qismən söndüyü və ya tamamilə kənarda olduğu və ya çəkdiyiniz yerin koordinatı müştəri sahəsində və ya ondan kənarda olması barədə narahat olmağınız lazım deyil.. Hamısı sizin üçün qayğı göstərilir. Müştəri sahənizdən kənarda rəsm çəkə bilməzsiniz.

Windows terminologiyasında müştəri sahələrində rəsm çəkməyə rəsm deyilir və hər pəncərədə rəsm çəkdiyiniz bir boya funksiyası var. Boya funksiyanıza zəng etmirsiniz, lazım olduqda pəncərə meneceri bunu sizin üçün edir. Bir pəncərə köçürüldükdə və ya başqa bir pəncərənin mövqeyi və ya görünürlüyü dəyişdirildikdə lazımdır. Pəncərənin məzmunundan asılı olan bəzi məlumatlar dəyişdiyinə görə pəncərənizi yenidən rəngləməyinizə ehtiyacınız varsa (yəni, pəncərə menecerini bilməkdənsə, yenidən rənglənmənin lazım olduğunu bilirsiniz), o zaman pəncərə menecerinə yenidən rənglənmənin lazım olduğunu və zəng etdiyini bildirirsiniz. boya funksiyanız. Sən buna özün demirsən. (Bütün bunlar növbəti hissədə göstərilir).

Əvvəlcə boya funksiyanızı tapmalısınız. Kod generatoru bunu sizin üçün yaradır və əvvəlki hissədə dəyişdirilmiş mesaj işləmə funksiyasının üstündədir. Layihənizə gedin və W1.c faylını yenidən açın.

Bu faylda window_W1_paint_function () funksiyasını tapacaqsınız. Bu belə görünür:

void window_W1_paint_function (mw_handle_t window_handle, const mw_gl_draw_info_t *draw_info)

{MW_ASSERT (draw_info! = (Void*) 0, "Sıfır göstərici parametri"); / * Pəncərənin müştəri sahəsini qatı ağ ilə doldurun */ 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); / * Buraya pəncərə rəsm kodunu əlavə edin */}

Bu, yaranan çılpaq koddur və etdiyi hər şey müştəri sahəsini ağ rənglə doldurmaqdır. Müştəri sahəsinə sarı dolu bir dairə çəkək. Əvvəlcə bir qrafik kontekstini (başqa bir pəncərə işi) başa düşməliyik. Qrafik kontekstində rəsm parametrlərini təyin edirik və sonra ümumi bir dairə çəkmə rutini çağırırıq. Bu nümunədə təyin etməli olduğumuz şeylər, dairənin bir haşiyə, sərhəd xətti tərzi, haşiyə rəngi, dairənin doldurulub doldurulmaması, dolğun rəng və doldurma nümunəsidir. Müştəri sahəsini sərhədsiz bərk ağ rəngli düzbucaqlı ilə doldurmaq üçün oxşar bir şey edən yuxarıdakı kodu görə bilərsiniz. Qrafik kontekstindəki dəyərlər, boya funksiyasının hər bir çağırışı arasında xatırlanmır, buna görə hər dəfə dəyərləri təyin etməlisiniz (baxmayaraq ki, onlar boya funksiyası ilə xatırlanır).

Yuxarıdakı kodda, doldurmanın açıq olduğunu və doldurma modelinin söndürüldüyünü görə bilərsiniz, buna görə onları yenidən təyin etməyə ehtiyac yoxdur. Sərhəd xəttini, sərhəd xətti üslubunu bərk, sərhəd ön plan rəngini qara rəngə və rəngi sarıya belə doldurmalıyıq:

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

Kodunuzu əlavə etməyi söylədiyi bu funksiyadakı şərhə bu kodu əlavə edin. Sonra aşağıdakı kimi bir dairə çəkməliyik:

mw_gl_circle (draw_info, 30, 30, 15);

Bu, 30, 30 koordinatlarında radius 15 olan bir dairə çəkir. Kodu yenidən qurun və yenidən başladın və yuxarıda göstərildiyi kimi pəncərədə bir dairə görəcəksiniz. Dairənin və düymənin üst -üstə düşdüyünü, ancaq düymənin yuxarıda olduğunu görəcəksiniz. Bu dizaynla bağlıdır. Nəzarətlər həmişə müştəri sahəsinə çəkdiyiniz hər şeyin üstündədir.

Addım 8: Pəncərə Məlumatları

Pəncərə Məlumatları
Pəncərə Məlumatları

İndiyə qədər Window 1 -in mesaj funksiyasında (gələn mesajları idarə etmək üçün) və onun boya funksiyasında (pəncərənin müştəri sahəsini çəkmək üçün) öz kodumuzu tətbiq etdik. İndi ikisini bağlamağın vaxtı gəldi. Boya funksiyasında çəkilmiş dairəni düyməyə basıldıqda istifadəçinin rəng seçicisi tərəfindən seçdiyi rənglə doldurmağa imkan verir. Unutmayın ki, biz boya funksiyasına zəng etmirik, bunu pəncərə meneceri edir, buna görə də mesaj funksiyamız (seçilmiş rəngi bilən) boya funksiyasını birbaşa özü adlandıra bilməz. Bunun əvəzinə məlumatları önbelleğe almalı və pəncərə menecerinə yenidən rənglənmənin lazım olduğunu bildirməliyik. Pəncərə meneceri, önbelleğe alınan məlumatları istifadə edə biləcək boya funksiyasını çağıracaq.

W1.c -nin yuxarısında boş bir məlumat quruluşu və bu cür kod generatoru tərəfindən elan edilmiş bu tip bir obyekt görəcəksiniz:

typedef quruluşu

{ / * Məlumat üzvlərinizi bura əlavə edin * / char dummy; /* Bəzi tərtibçilər boş strukturlardan şikayət edirlər; üzvlərinizi əlavə edərkən bunu silin */} window_W1_data_t; statik window_W1_data_t window_W1_data;

Məlumatlarımızı zənglərdə saxladığımız və pəncərə məlumatları olaraq yadda saxladığımız yer budur. Yalnız seçilmiş rəngi burada saxlamalıyıq:

typedef quruluşu

{ / * Məlumat üzvlərinizi bura əlavə edin * / mw_hal_lcd_colour_t selected_colour; } window_W1_data_t; statik window_W1_data_t window_W1_data = {MW_HAL_LCD_YELLOW};

Sarı bir başlanğıc rəng verəcəyik. İndi mesaj funksiyasında seçilmiş rəngi burada belə saxlamaq üçün kodu bir qədər dəyişəcəyik:

hal MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE:

{window_W1_data.chosen_colour = mesaj-> mesaj_datası; } fasilə;

Sonra boya funksiyasını, dairəni belə çəkərkən bu dəyəri istifadə etmək üçün dəyişdirəcəyik:

mw_gl_set_solid_fill_colour (window_W1_data.chosen_colour);

İndi pəncərənin məzmununun asılı olduğu məlumatları dəyişdirdik, buna görə də pəncərə menecerinə pəncərənin yenidən rənglənməsi lazım olduğunu bildirməliyik. OK mesajı alındıqda bunu mesaj funksiyasında edirik:

mw_paint_window_client (mesaj-> alıcı_handle);

Bu, pəncərənin birbaşa rənglənməsinə səbəb olmur. Pəncərə menecerinə bir pəncərənin yenidən rənglənməsi lazım olduğunu bildirən bir köməkçi funksiyadır (içəri girsəniz bunun necə baş verdiyini görə bilərsiniz). Bu vəziyyətdə yenidən boyanması lazım olan pəncərə özüdür və pəncərənin sapı mesaj işləmə funksiyasındakı mesaj parametrindədir.

Yuxarıdakı bəzi kod parçalarının hara getdiyini bilmirsinizsə, bütün fayl indi belə görünür:

#daxil edin

#include "miniwin.h" #include "miniwin_user.h" #include "W1.h" typedef struct { / * Veri üzvlərinizi bura əlavə edin * / mw_hal_lcd_colour_t selected_colour; } window_W1_data_t; statik 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, "Sıfır göstərici parametri"); / * Pəncərənin müştəri sahəsini qatı ağ ilə doldurun */ 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); / * Buraya pəncərə rəsm kodunu əlavə edin */ 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 *mesaj) {MW_ASSERT (mesaj! = (boş *) 0, "Sıfır göstərici parametri"); / * Növbəti sətir kompilyator xəbərdarlıqlarını dayandırır, çünki dəyişən hazırda istifadə edilmir */ (void) window_W1_data; switch (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Buraya hər hansı bir pəncərə başlanğıc kodu əlavə edin * / break; case MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Pəncərə menyusu işləmə kodunu bura əlavə edin * / break; case MW_BUTTON_PRESSED_MESSAGE: if (message-> sender_handle == button_B1_handle) { / * Buraya bu nəzarət üçün idarəçi kodunuzu əlavə edin * / mw_create_window_dialog_colour_chooser (10, 10, "Color", MW_HAL_LCD_RED,) } fasilə; hal MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE: {window_W1_data.chosen_colour = message-> message_data; mw_paint_window_client (mesaj-> alıcı_handle); } fasilə; default: / * MISRA'yı xoşbəxt tut * / break; }}

Yenidən qurun və işləyin və dairənin doldurma rəngini təyin etməlisiniz.

Pəncərə məlumatlarının bu nümunəsi, mənbə faylının yuxarısındakı statik bir məlumat quruluşunda saxlanılan məlumatlardan istifadə edir. Bu nümunədə etdiyimiz kimi yalnız bir pəncərənin nümunəsi varsa, bu yaxşıdır, ancaq birdən çox nümunəniz varsa, hamısı eyni məlumat quruluşunu paylaşacaqlar. Hər bir nümunə məlumatına sahib olmaq mümkündür, buna görə eyni pəncərə tipli birdən çox nümunənin öz məlumatları var. Bu sənədlər qovluğunda olan MiniWin sənədlərində izah edilmişdir. Fayl nümunəsi eyni pəncərə tipində birdən çox şəkil göstərmək üçün istifadə edir (bu təlimatın ən başındakı əsas şəkildən göründüyü kimi).

Addım 9: Bəzi Final Font Əyləncə

Bəzi Final Font Əyləncə
Bəzi Final Font Əyləncə

MiniWin TrueType şrift göstərməsini dəstəkləyir. İstifadəçi interfeysinizin yaxşı görünməsini təmin edən bir şey varsa, cəlbedici şriftlərdir. Bu son addım, MiniWin pəncərəsində TrueType şriftinin necə göstəriləcəyini göstərir.

TrueType şriftlərini göstərməyin iki yolu var. Biri, əvvəllər dairə üçün edildiyi kimi onları birbaşa müştəri sahəsinə çəkmək, digəri isə pəncərənizə bir mətn qutusu nəzarəti əlavə etməkdir. Daha asan olduğu üçün ikincisini edirik.

İndi JSON konfiqurasiya faylımıza bir mətn qutusu nəzarəti əlavə edəcəyik. Window 2 -nin tərifinə əlavə edin ki, belə görünsün:

bunun kimi:

{

"Ad": "W2", "Başlıq": "Pəncərə 2", "X": 50, "Y": 65, "Genişlik": 100, "Boy": 80, "Sərhəd": doğru, "TitleBar": doğru, "Görünən": doğru, "Kiçikləşdirilmiş": yanlış, "Mətn Qutusu": [{"Ad": "TB1", "X": 0, "Y": 0, "Genişlik": 115, "Boy": 50, "Əsaslandırma": "Mərkəz", "Arka Plan Rəngi": "MW_HAL_LCD_YELLOW", "Ön Plan Rəngi": "MW_HAL_LCD_BLACK", "Şrift": "mf_rlefont_BLKCHCRY16", "Aktiv": doğru, "} Görünür":

MiniWin -də TrueType şriftləri haqqında qısa bir söz. Şriftlər.ttf fayllarına daxil olur. Daha böyük kompüterlərdəki pəncərə menecerlərində bunlar lazım olduqda ekranınızda göstərilir. Bu çox işləmə gücü və yaddaş tələb edir və kiçik cihazlar üçün uyğun deyil. MiniWin-də bitmaplərə əvvəlcədən işlənir və tərtib zamanı sabit bir yazı tipi ölçüsündə və üslubunda (qalın, italik və s.) Əlaqələndirilir, yəni tərtib edərkən hansı ölçüdə və üslubda istifadə edəcəyinizə qərar verməlisiniz. Yüklədiyiniz MiniWin zip faylındakı iki nümunə şrift üçün bu sizin üçün edildi. Başqa ölçülərdə və üslublarda başqa şriftlərdən istifadə etmək istəyirsinizsə docs qovluğundakı MiniWin sənədlərinə baxın. Windows və Linux üçün MiniWin-də.ttf fayllarını mənbə kodu sənədlərinə əvvəlcədən işlətmək üçün layihələrinizə daxil edə biləcəyiniz vasitələr var.

Və ikinci sürətli söz - Microsoft Windows -da tapa biləcəyiniz şriftlər də daxil olmaqla əksər şriftlər müəllif hüququdur. Şəxsi istifadə üçün istədiyiniz kimi istifadə edin, ancaq nəşr etdiyiniz hər şey, fontların nəşr olunduğu lisenziyanın, MiniWin -ə daxil olan 2 şriftdə olduğu kimi, icazə verdiyinə əmin olmalısınız, ancaq Microsoft -un şriftlərində!

Qaydaya qayıdın! Faylları yaradın, buraxın, qurun və əvvəlki kimi yenidən işlədin və görəcəksiniz ki, Window 2 -də indi ağılsız bir şriftdə sarı bir fonda bəzi standart mətnlər var. Window 2 -nin W2.c. mənbə faylını redaktə edərək mətni dəyişməyə imkan verir.

Yeni yaratdığımız mətn qutusu ilə ünsiyyət qurmalıyıq və bunu etmək üsulunuz MiniWin -də hər hansı bir ünsiyyət kimi bir mesaj göndərməkdir. Pəncərə yaradıldıqda, lakin görünməmişdən əvvəl mətni idarəetmədə təyin etmək istəyirik, buna görə MW_WINDOW_CREATED_MESSAGE halda mesaj işləyicisinə kod əlavə edirik. Bu, pəncərə görünməzdən əvvəl pəncərə kodu tərəfindən qəbul edilir və bu kimi başlanğıclar üçün nəzərdə tutulmuşdur. Kod generatoru, mesaj işləmə funksiyasında belə görünən bir yer sahibi yaratdı:

hal MW_WINDOW_CREATED_MESSAGE:

/ * İstənilən pəncərənin başlanğıc kodunu bura əlavə edin */ break;

Burada mw_post_message funksiyasından istifadə edərək hansı mətnin göstərilməsini istədiyimizi bildirən mətn qutusu nəzarətinə bir mesaj göndərəcəyik:

hal MW_WINDOW_CREATED_MESSAGE:

/ * Buraya hər hansı bir pəncərə başlanğıc kodu əlavə edin */ mw_post_message (MW_TEXT_BOX_SET_TEXT_MESSAGE, mesaj-> alıcı_handle, text_box_TB1_handle, 0UL, "Qaranlıq və fırtınalı bir gecə idi …", MW_CONTROL_MESSAGE); fasilə;

Bunlar parametrlərdir:

  • MW_TEXT_BOX_SET_TEXT_MESSAGE - Nəzarətə göndərdiyimiz mesaj növüdür. Onlar miniwin.h -də verilmişdir və sənədlərdə sənədləşdirilmişdir.
  • message-> alıcı_handle - Mesajın kim olduğu - bu pəncərə - sapı mesaj işləmə funksiyasına verilən mesaj parametrindədir.
  • text_box_TB1_handle - Mesajı kimə göndəririk - mətn qutusu idarəetmə qolu. Bunlar yaradılan miniwin_user.h faylında verilmişdir.
  • 0UL - Məlumat dəyəri, bu vəziyyətdə heç bir şey yoxdur.
  • "Qaranlıq və fırtınalı bir gecə idi …" - İşarəçi dəyəri - yeni mətn.
  • MW_CONTROL_MESSAGE - Nəzarət edən alıcı növü.

Bu belədir. Həmişə olduğu kimi yenidən qurun və yenidən başladın və yuxarıdakı şəkildəki kimi görünən mətn qutusunu alacaqsınız.

Mesaj göndərmə MiniWin üçün əsasdır (bütün pəncərə menecerlərində olduğu kimi). Daha çox nümunə üçün zip faylındakı nümunə layihələrə baxın və hərtərəfli izahat üçün sənədlərdəki MiniWin mesajları bölməsini oxuyun.

Addım 10: İrəli gedin

Image
Image

MiniWin -ə bu əsas giriş üçün budur. MiniWin burada nümayiş olunduğundan daha çox şey edə bilər. Məsələn, bu təlimatda istifadə olunan lövhədəki ekran kiçikdir və idarəetmə elementləri kiçikdir və bir çubuqla istifadə olunmalıdır. Bununla birlikdə, digər nümunələr və aparatlar daha böyük ekranlarda daha böyük idarəetmə vasitələrindən istifadə edir (2 ölçü var) və bunlar barmaqla idarə oluna bilər.

Burada göstərilənlərdən daha çox nəzarət növləri var. Əlavə nəzarətlər üçün kod generatoru qovluğundakı müxtəlif JSON sənədlərinə baxın. Bütün nəzarət növləri bu nümunələrdə verilmişdir.

Windows -da bir çox seçim var. Sərhəd, başlıq çubuğu və nişanlar hamısı konfiqurasiya edilə bilər. Sürüşmə çubuqlarına və sürüşmə pəncərəsinin müştəri sahələrinə sahib ola bilərsiniz, eyni pəncərə tipli bir çox nümunə və pəncərələr çılpaq ola bilər (yalnız müştəri sahəsi, haşiyəsi və ya başlıq çubuğu yoxdur), bu da onların ekrandakı kompilyasiya vaxtında sabit olması deməkdir (böyük ölçülü nişanlar olan bu hissədəki görüntüyə baxın - bunlar əslində 6 çılpaq pəncərələrdir).

MiniWin dinamik yaddaşdan istifadə etmir. Bu, kiçik məhdud cihazlara uyğun hala gətirir və bəzi quraşdırılmış layihələr üçün bir tələbdir. MiniWin və yaratdığı kod da 'tələb olunan' səviyyəyə tam olaraq MISRA 2012 -ə uyğundur.

Əlavə məlumat üçün sənədlər üçün sənədlər qovluğuna və zip faylındakı digər nümunə tətbiqlərə baxın. Burada MiniWin -in bütün xüsusiyyətlərindən necə istifadə olunacağını və MiniWin -in FatFS və FreeRTOS ilə necə birləşdiriləcəyini göstərən nümunələr var.

Tövsiyə: