Mundarija:

O'rnatilgan oyna menejeri: 10 qadam
O'rnatilgan oyna menejeri: 10 qadam

Video: O'rnatilgan oyna menejeri: 10 qadam

Video: O'rnatilgan oyna menejeri: 10 qadam
Video: BİR O'ZİNGİZ KO'RİNG / DUNYODAGİ ENG G'ALATİ ER-XOTİNLAR / Buni Bilasizmi? 2024, Noyabr
Anonim
O'rnatilgan oyna menejeri
O'rnatilgan oyna menejeri
O'rnatilgan oyna menejeri
O'rnatilgan oyna menejeri
O'rnatilgan oyna menejeri
O'rnatilgan oyna menejeri
O'rnatilgan oyna menejeri
O'rnatilgan oyna menejeri

Loyiha LCD displeyli va sensorli ekranli o'rnatilgan mikrokontrollerda harakatlanuvchi oynali oynali menejerni qanday amalga oshirishni ko'rsatadi. Buni amalga oshirish uchun sotuvda mavjud bo'lgan dasturiy paketlar mavjud, lekin ular qimmatga tushadi va yopiq manbadir. MiniWin deb nomlangan bu bepul va ochiq manbali. U to'liq mos keladigan C99 tilida yozilgan va uni C yoki C ++ ilovasida ishlatish mumkin. MiniWin -ning maqsadlari - ishlatish uchun qulay, o'zgartirish oson, kengaytirilishi mumkin, keng ko'lamli uskunalarga ko'chirilishi mumkin va resurslar juda och emas.

MiniWin -da derazalaringizni boshqarish kodini berish bilan bir qatorda, foydalanuvchi interfeysi boshqaruv elementlari to'plami mavjud - tugmalar, slayderlar, harakat paneli, daraxtlar va boshqalar. Sizda har xil turdagi yoki bir xil turdagi bir nechta oynalar bo'lishi mumkin. Windows -ni boshqa joyga ko'chirish, hajmini o'zgartirish, kattalashtirish, minimallashtirish va yopish mumkin - siz odatdagidek katta oynalar menejerlarida oynalar bilan bajarasiz. Matnni jozibali ko'rsatish uchun kerning va taxallusga qarshi (matnni smooooooth ko'rinishiga olib keladi) bo'lgan TrueType shriftlari ham qo'llab-quvvatlanadi.

Har bir oynada sizda mijozlar maydoni mavjud (sizning bo'sh joyingiz chegara ichida va yuqori paneldan pastda). Buning uchun siz dialogni boshqarish uchun boshqaruv elementlarini qo'shishingiz yoki xohlagan narsani chizish uchun o'rnatilgan grafik kutubxonasidan foydalanishingiz mumkin. Grafik kutubxonaning barcha funktsiyalari oynadan xabardor. Sizning derazangiz qayerda, nima bir -birining ustiga tushadi yoki u kichraytiriladimi, deb xavotir olmang.

O'zingizning derazalaringizga qo'shimcha ravishda, standart dialoglar ham mavjud, ularni tuzish juda oson - masalan, tasdiqlash dialoglari (faqat OK yoki Ha/Yo'q tugmalari), vaqt/sana sozlagichlari, fayl tanlagichlari, rang tanlovchilar va boshqalar.

MiniWin standart oyna menejerining xabarlar navbatini tuzish tizimidan foydalanadi. Windows bir -birlari va oyna boshqaruvchisi bilan xabarlar orqali o'zaro aloqada bo'lishi mumkin. Siz vazifalarni to'g'ridan -to'g'ri bajarishga chaqirmayapsiz, navbatga xabar qo'shasiz va oyna menejeri buni siz uchun qabul qiladi.

MiniWin ST, NXP va Renesas mikro-kontrollerlari sensorli displeyli standart ishlab chiqish platalariga ko'chirildi. Bu qurilmalar uchun apparat drayverlari va namunaviy loyihalar mavjud. Bundan tashqari, MiniWin Windows yoki Linux uchun o'rnatilishi mumkin, shunda siz o'rnatilgan uskunani olishdan oldin foydalanuvchi interfeysi kodini simulyatsiya qilishingiz mumkin.

MiniWin kod ishlab chiqaruvchisiga ega. Siz o'zingiz o'qiy oladigan JSON faylini yaratish uchun oyna va boshqaruv elementlarini belgilashingiz mumkin va kod generatori faylni tahlil qilib, siz uchun kodni yaratadi (ko'plab misollar bor). U Windows yoki Linux -ni to'liq simulyatorli dasturlarini yaratadi, ularni hozirgina qurish mumkin va sizning simulyatsiya qilingan LCD displeyingiz MiniWin oynalari bilan ishlaydi. Siz aynan bir xil ishlab chiqarilgan kodni olishingiz va uni ko'milgan loyihaga qo'yishingiz va bir xil oyna va boshqaruv qurilmalarini bir lahzadan keyin ko'rsatadigan kodga ega bo'lishingiz mumkin.

MiniWin o'rnatilgan qurilmada operatsion yordamni talab qilmaydi. Hammasi bitta ipda ishlaydi. MiniWin -ni o'rnatilgan protsessorda ishlaydigan RTOS bilan birlashtirish mumkin va MiniWin -ni FreeRTOS bilan birlashtirgan misollar mavjud.

Bu ko'rsatma QWGA sensorli displeyi bilan biriktirilgan arzon STM32F429 Discovery platasi yordamida MiniWin -ni STM32 M4 protsessorida qanday ishga tushirishni ko'rsatadi. Siz ularni elektron komponentlar etkazib beruvchisidan osongina olishingiz mumkin.

MiniWin o'rta va undan yuqori darajadagi mikro-kontrollerlarda ishlaydi.

Ta'minotlar

STM32F429I-DISC1 ishlab chiqish kartasi va mikro USB kabeli

STM32CubeIDE bepul yuklab olish.

1 -qadam: Kodni olish

Kodni olish
Kodni olish

Birinchidan, sizga STM32CubeIDE o'rnatilgan bo'lishi kerak. Siz buni ST veb -saytidan olasiz. Siz ro'yxatdan o'tishingiz kerak va uni yuklab olish va o'rnatish uchun biroz vaqt ketadi. Hammasi bepul.

O'rnatish paytida MiniWin manbasini yuklab oling va oching. Bu juda katta, lekin siz uning kichik qismini ishlatasiz. Yashil rangdagi "Klonlash yoki Yuklab olish" tugmasini bosing …

github.com/miniwinwm/miniwinwm

keyin Zip -ni yuklab olishni tanlang. Tarkibni oching.

2 -qadam: Misol loyihasini yaratish

Misol loyihasini yaratish
Misol loyihasini yaratish
Misol loyihasini yaratish
Misol loyihasini yaratish

Birinchidan, namunali loyihalardan birini yarataylik. Yaxshi biri MiniWinSimple deb nomlanadi. STM32CubeIDE -ni ishga tushiring, so'ngra quyidagilarni bajaring:

  1. Faylni tanlang | Import…
  2. Umumiy oynasini oching va Ishchi maydonda mavjud loyihani tanlang. Keyingi.
  3. Browse -ni bosing va MiniWin -ni ochgan joyga o'ting. Keyin STM32CubeIDE / MiniWinSimple / STM32F429 papkasiga o'ting. Jildni tanlash -ni bosing.
  4. Loyihada: MiniWinSimple_STM32F429 belgisini belgilang va "Finish" tugmasini bosing.
  5. MiniWinSimple_STM32F429 loyihasi Project Explorer -da paydo bo'ladi. Uni tanlang va keyin Project | Build Project yordamida yarating.
  6. Endi USB kabelingizni taxtaga va kompyuteringizga ulang va Run | Debug yordamida ishga tushiring va yuklab olinganda Run | Resume -ni tanlang. Siz birinchi marta ekranni kalibrlash ekranini olasiz, shuning uchun LCD displeydagi 3 ta xochning o'rtasiga teging. Endi siz displey oynasi bilan ishlashingiz mumkin.

Oynani siljitish uchun uni sarlavha satriga suring. Oynaning o'lchamini o'zgartirish uchun sarlavha satrining chap tomonidagi oq uchburchak belgisidan foydalaning. MiniWin oynalari o'lchamlarini o'zgartirish mumkin emas, chunki chegaralarni sudrab olib borish mumkin, chunki MiniWin displeylari juda kichik. Oynani minimallashtirish, kattalashtirish yoki yopish uchun sarlavha satrining o'ng uchidagi ikonkalardan foydalaning (yopish o'chirilgan bo'lishi mumkin). Agar oyna kichraytirilsa, siz kichraytirilgan piktogramma bo'ylab harakatlana olmaysiz. Ular pastki chapdan o'ngga yig'iladi.

3 -qadam: Kod generatorini ishga tushirish

Kod generatorini ishga tushirish
Kod generatorini ishga tushirish

Endi biz namunali loyihani o'zgartiramiz, biz o'zimizning derazalarimizni yaratamiz va yangi kodni qo'yamiz. Buning uchun biz kod generatorini ishga tushiramiz.

  1. Buyruqlar satrini oching va MiniWin -ni ochgan papkaga, so'ng Tools / CodeGen papkasiga o'ting.
  2. Windows CodeGen.exe uchun bajariladigan fayl allaqachon mavjud. Linux uchun uni make yozish orqali qurish kerak. (Agar siz yuklangan bajariladigan faylni ishga tushirishdan xavotirda bo'lsangiz, lekin uni Windows uchun manba yordamida tuzishingiz mumkin, lekin sizga kompilyator va ishlab chiqish muhiti o'rnatilgan bo'lishi kerak. Tafsilotlar uchun docs papkasidagi MiniWin hujjatlariga qarang).
  3. Bu papkada JSON fayllarining misollari bor. Biz example_empty.json dan foydalanamiz. Windows yoki Linux uchun sozlash uchun avval uni tahrir qilishingiz kerak. Uni tahrirlovchida oching va tepada "TargetType" ni toping, "Linux" yoki "Windows" qiymatini kod ishlab chiqaruvchisi ishlayotganiga o'zgartiring.
  4. Endi buyruq satriga codegen example_empty.json kiriting.
  5. STM32CubeIDE -dagi loyihangizga o'ting va MiniWinSimple_Common papkasini oching. U erdagi barcha fayllarni o'chirib tashlang.
  6. Biz JSON faylidagi "TargetName" ni "MiniWinGen" da sukut bo'yicha qoldirdik, shuning uchun bu biz yaratgan kod papkasining nomi. MiniWin va MiniWinGen_Common papkasini ochgan papkaga o'ting. Endi bu fayllarning barchasini tanlang va loyihangizning MiniWinSimple_Common papkasida STM32CubeIDE -ga sudrab olib tashlang.
  7. Endi STM32CubeIDE -da loyihani qayta ishga tushiring va yangi dizayn oynasi paydo bo'ladi. Example_empty.json hech narsani aniqlamagani uchun oynadagi tugma tugadi.

4 -qadam: oyna qo'shish

Oyna qo'shish
Oyna qo'shish

Endi biz JSON konfiguratsiya fayliga ikkinchi oynani qo'shamiz va kodni qayta tiklaymiz.

1. Example_empty.json -ni matn muharririda oching.

2. "Windows" bo'limi ostida hozircha bitta oyna bo'lgan oyna ta'riflari majmuasi mavjud. Bularning barchasini nusxalash …

{

"Ism": "W1", "Sarlavha": "1 -oyna", "X": 10, "Y": 15, "Kenglik": 200, "Balandlik": 180, "Chegara": to'g'ri, "TitleBar": rost, "Ko'rinadigan": rost, "Minimallashtirilgan": noto'g'ri}

va yana 2 ta ta'rifni ajratuvchi vergul bilan joylashtiring.

3. "W1" ni "W2" ga, "1 -oyna" ni "2 -oynaga" o'zgartiring. "X", "Y", "Kenglik" va "Balandlik" ni ekran o'lchamlari 240 kengligi 320 balandlikda ekanligini hisobga olgan holda turli qiymatlarga o'zgartiring.

4. Faylni saqlang va kod generatorini qayta ishga tushiring.

5. Fayllarni oldingi qadamdagidek nusxalash, qayta tuzish va qayta ishga tushirish. Endi sizning ekraningizda 2 ta oyna bo'ladi.

5 -qadam: Boshqaruv elementini qo'shish

Boshqaruvni qo'shish
Boshqaruvni qo'shish

Endi biz sizning yangi oynangizga ba'zi boshqaruv elementlarini qo'shamiz. Oldingi bosqichda bo'lgani kabi faylni tahrirlang.

1. W1 oynasi spetsifikatsiyasida oxirgi sozlamadan keyin vergul qo'shing ("Minimallashtirilgan": noto'g'ri) va keyin bu matnni qo'shing

"MenuBar": to'g'ri, "MenuBarEnabled": rost, "MenuItems": ["Fred", "Bert", "Pete", "Alf", "Ian"], "Tugmalar": [{"Name": "B1", "Label": "Button1", "X": 10, "Y": 10, "Enabled": true, "Visible": true}]

Bu bo'lim 5 ta elementdan iborat menyu satrini qo'shadi va uni yoqadi (menyu satrlarini butun dunyo bo'ylab o'chirib qo'yish mumkin, sinab ko'ring). Bundan tashqari, u yoqilgan va ko'rinadigan tugmachani qo'shadi (ularni ko'rinmas qilib yaratib, keyinroq kodda ko'rinadigan qilib qo'yish mumkin).

2. Kodni qayta yarating, nusxa ko'chiring, qayta tiklang, hammasini avvalgidek qayta ishga tushiring.

6 -qadam: Boshqaruvlarni biror narsa qilish

Boshqaruvlarni biror narsa qilish
Boshqaruvlarni biror narsa qilish

Endi bizda asosiy ishni bajaradigan interfeys mavjud. Bu misol uchun biz 1 -oynadagi tugma bosilganda rang tanlash vositasi dialogini ochamiz.

STM32CubeIDE -dagi loyihangizga o'ting va MiniWinSimple_Common papkasini oching va W1.c faylini oching (bu faylning nomi JSON faylidagi oynaning "Ismi" maydoniga mos keladi).

Bu faylda window_W1_message_function () funksiyasini topasiz. Bu shunday ko'rinadi:

void window_W1_message_function (const mw_message_t *xabar) {MW_ASSERT (xabar! = (bekor *) 0, "Null ko'rsatgich parametri"); / * Keyingi satr kompilyator ogohlantirishlarini to'xtatadi, chunki hozirda o'zgarmaydigan ishlatilmayapti */ (void) window_W1_data; switch (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Bu erga har qanday oyna boshlash kodini qo'shing * / break; case MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Bu erga oyna menyusiga ishlov berish kodini qo'shing * / break; MW_BUTTON_PRESSED_MESSAGE holati: if (message-> sender_handle == button_B1_handle) { / * Bu nazorat uchun ishlovchi kodini qo'shing * /} tanaffus; standart: / * MISRA -ni xursand qiling * / tanaffus; }}

Buni deraza menejeri deraza menejeri deraza biror narsa sodir bo'lganligini bildirishi kerak bo'lganda chaqiradi. Bu holda biz oynaning yagona tugmasi bosilganligini bilishdan manfaatdormiz. Xabar turlarini almashtirish bayonnomasida siz MW_BUTTON_PRESSED_MESSAGE holatini ko'rasiz. Bu kod tugma bosilganda ishlaydi. Bu oynada faqat bitta tugma bor, lekin undan ko'p bo'lishi mumkin, shuning uchun u qaysi tugma ekanligi tekshiriladi. Bunday holda, bu faqat B1 tugmasi bo'lishi mumkin (ism yana JSON faylidagi tugma nomiga mos keladi).

Shunday qilib, bu holatdan so'ng, rang tanlash oynasini ochish uchun kod qo'shing:

mw_create_window_dialog_colour_chooser (10, 10, "Rang", MW_HAL_LCD_RED, noto'g'ri, xabar-> qabul qiluvchining_ko'li);

Parametrlar quyidagicha:

  • 10, 10 - dialog oynasidagi joy
  • "Rang" - dialogning sarlavhasi
  • MW_HAL_LCD_RED - bu dialog boshlanadigan standart rang
  • yolg'on degani katta o'lchamni ko'rsatmaydi (uni rost qilib ko'ring va farqni ko'ring)
  • xabar-> qabul qiluvchining tutqichi-bu dialogning egasi, bu holda bu oyna. Oynaning tutqichi funksiyaning xabar parametrida joylashgan. Bu dialog oynasining javobi yuboriladigan oyna.

Foydalanuvchi oyna menejeri tanlagan rangning qiymatini bilish uchun, foydalanuvchi dialog oynasidagi OK tugmasini bosganida, bizning oynamizga tanlangan rang bilan xabar yuboradi. Shuning uchun, biz bu xabarni switch iborasidagi boshqa holat bilan tutib olishimiz kerak:

MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE holati:

{mw_hal_lcd_colour_t selected_colour = xabar-> xabar_data; (void) selected_colour; } tanaffus;

Biz tanlangan rang bilan hech narsa qilmayapmiz, shuning uchun kompilyator ogohlantirishining oldini olish uchun uni bekor qilib qo'yamiz. Bu funksiyaning oxirgi kodi endi shunday ko'rinadi:

void window_W1_message_function (const mw_message_t *xabari)

{MW_ASSERT (xabar! = (Bekor*) 0, "Null ko'rsatgich parametri"); / * Keyingi satr kompilyator ogohlantirishlarini to'xtatadi, chunki hozirda o'zgarmaydigan ishlatilmayapti */ (void) window_W1_data; switch (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Bu erga har qanday oyna boshlash kodini qo'shing * / break; case MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Bu erga oyna menyusiga ishlov berish kodini qo'shing * / break; MW_BUTTON_PRESSED_MESSAGE holati: if (message-> sender_handle == button_B1_handle) { / * Bu nazorat uchun ishlovchi kodini bu erga qo'shing * / mw_create_window_dialog_colour_chooser (10, 10, "Rang", MW_HAL_LCD_RED,; } tanaffus; MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE holati: {mw_hal_lcd_colour_t selected_colour = message-> message_data; (void) selected_colour; } tanaffus; standart: / * MISRA -ni xursand qiling * / tanaffus; }}

Kodni ishga tushirish yuqoridagi rasmda ko'rsatilgan. Dialog ko'rsatilayotganda, siz unga javob berishingiz va boshqa hech narsa qilishdan oldin uni o'chirishingiz kerakligini payqashingiz mumkin. Bunga modali xatti -harakatlar deyiladi. MiniWin -dagi dialoglar va har doim global miqyosda, sizda faqat bitta ko'rsatuv bo'lishi mumkin. Bu erda ko'proq tushuntirishlar bor …

uz.wikipedia.org/wiki/Modal_window

7 -qadam: Derazada rasm chizish

Derazada rasm chizish
Derazada rasm chizish

Hozircha biz faqat boshqaruv elementlaridan foydalanganmiz va ular o'zlarini chizishadi. Bizning derazamizga maxsus rasm chizish vaqti keldi. Siz chizishingiz mumkin bo'lgan qism chegaralar ichida (agar mavjud bo'lsa, ular ixtiyoriy), aylantirish paneli ichida (agar aniqlangan bo'lsa, ixtiyoriy) va sarlavha satrining ostida (agar bo'lsa, bu ixtiyoriy). Bu deraza terminologiyasida mijozlar maydoni deb ataladi.

MiniWin -da siz foydalanishingiz mumkin bo'lgan grafik buyruqlar kutubxonasi mavjud. Ularning barchasi derazadan xabardor. Bu shuni anglatadiki, agar deraza ko'rinadigan bo'lsa, boshqa derazalar tomonidan qisman yashiringan bo'lsa, ekran yoqilgan, qisman o'chirilgan yoki to'liq o'chirilgan bo'lsa yoki siz chizayotgan joyning koordinatasi mijoz maydonida yoki undan tashqarida bo'lsa, siz xavotirlanmasligingiz kerak.. Bularning barchasi sizga g'amxo'rlik qiladi. Siz mijozlar maydonidan tashqarida rasm chizolmaysiz.

Windows terminologiyasida mijozlar maydoniga chizish rasm deyiladi va har bir oynada siz chizgan rasm funktsiyasi mavjud. Siz bo'yoq vazifasini chaqirmaysiz, deraza menejeri kerak bo'lganda buni siz uchun qiladi. Bu oyna ko'chirilganda yoki tepadagi boshqa oynaning holati yoki ko'rinishi o'zgarganda kerak bo'ladi. Agar sizga derazani qayta bo'yash kerak bo'lsa, chunki deraza tarkibiga bog'liq bo'lgan ba'zi ma'lumotlar o'zgardi (ya'ni, deraza menejerini bilishdan ko'ra, qayta bo'yash zarurligini bilasiz), siz deraza menejeriga qayta bo'yash kerakligini aytasiz va u qo'ng'iroq qiladi. sizning bo'yoq funktsiyasi. Siz buni o'zingiz chaqirmaysiz. (Bularning barchasi keyingi bo'limda ko'rsatilgan).

Birinchidan, siz bo'yoq funktsiyasini topishingiz kerak. Kod generatori uni siz uchun yaratadi va u oldingi bo'limda o'zgartirilgan xabarlarni qayta ishlash funktsiyasidan yuqori. Loyihangizga o'ting va W1.c faylini qayta oching.

Bu faylda window_W1_paint_function () funksiyasini topasiz. Bu shunday ko'rinadi:

void window_W1_paint_function (mw_handle_t window_handle, const mw_gl_draw_info_t *draw_info)

{MW_ASSERT (draw_info! = (Bekor*) 0, "Null ko'rsatgich parametri"); / * Oynaning mijozlar maydonini oq rang bilan to'ldiring */ 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). balandligi); / * Bu erga deraza rasmini kiriting */}

Bu oddiy kod bo'lib, u faqat mijoz maydonini oq rang bilan to'ldiradi. Mijozlar maydoniga sariq rangli to'la doira chizamiz. Avval biz grafik kontekst tushunchasini tushunishimiz kerak (boshqa oyna narsasi). Biz chizish parametrlarini grafik kontekstida o'rnatamiz va keyin umumiy chizish chizig'ini chaqiramiz. Bu misolda biz belgilashimiz kerak bo'lgan narsa - aylanada chegara, chegara chizig'i uslubi, chegara rangi, aylana to'ldirilganmi, to'ldirilgan rang va plomba naqshmi. Siz yuqoridagi kodni ko'rishingiz mumkin, u mijozlar maydonini chegarasiz, to'la oq to'rtburchak bilan to'ldirishga o'xshaydi. Grafik kontekstidagi qiymatlar bo'yoq funktsiyasining har bir chaqiruvi o'rtasida eslanmaydi, shuning uchun siz har safar qiymatlarni o'rnatishingiz kerak (ular bo'yoq funktsiyasi bilan esda qoladi).

Yuqoridagi kodda siz to'ldirish yoqilgan va to'ldirish naqshining o'chirilganligini ko'rishingiz mumkin, shuning uchun ularni qayta o'rnatishga hojat yo'q. Biz chegarani belgilashimiz kerak, chegara chizig'i uslubini qattiq, chegara old rangini qora va rangni sariq rangga to'ldirish:

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

Ushbu kodni ushbu funktsiyadagi izohga qo'shing, unda sizning kodingizni qo'shish kerak. Keyin biz aylana chizishimiz kerak:

mw_gl_circle (draw_info, 30, 30, 15);

Bu 30, 30 koordinatalarda radiusli aylana chizadi. Kodni qayta tiklang va uni qayta ishga tushiring va siz oynada yuqorida ko'rsatilgan aylanani ko'rasiz. Siz aylana va tugma bir -biriga mos kelishini, lekin tugma tepada ekanligini ko'rasiz. Bu dizayn bo'yicha. Boshqaruv elementlari har doim mijozlar maydoniga chizilgan narsalarning tepasida bo'ladi.

8 -qadam: oyna ma'lumotlari

Oyna ma'lumotlari
Oyna ma'lumotlari

Hozircha biz o'z kodimizni Window 1 -ning xabarlar funktsiyasida (kiruvchi xabarlarni boshqarish uchun) va uning bo'yash funktsiyasini (oynaning mijozlar maydoniga chizish) amalga oshirdik. Endi ikkalasini bog'lash vaqti keldi. Bo'yoq funktsiyasida chizilgan doirani tugma bosilganda foydalanuvchi tanlagan rang bilan to'ldirishga ruxsat bering. Esda tutingki, biz bo'yoq funktsiyasini chaqirmaymiz, oyna boshqaruvchisi shunday qiladi, shuning uchun bizning xabar funksiyamiz (tanlangan rangni biladi) bo'yoq funktsiyasini o'zi chaqira olmaydi. Buning o'rniga biz ma'lumotlarni keshlashimiz va oyna menejeriga qayta bo'yash zarurligini bildirishimiz kerak. Keyin oyna menejeri keshlangan ma'lumotlardan foydalanadigan bo'yoq funktsiyasini chaqiradi.

W1.c -ning yuqori qismida siz bo'sh ma'lumotlar tuzilishini va kod generatori tomonidan e'lon qilingan bunday turdagi ob'ektni ko'rasiz:

typedef tuzilishi

{ / * Ma'lumotlar a'zolaringizni bu erga qo'shing * / char qo'g'irchoq; /* Ba'zi kompilyatorlar bo'sh tuzilmalar haqida shikoyat qiladilar; a'zolarni qo'shganda buni olib tashlang */} window_W1_data_t; statik window_W1_data_t window_W1_data;

Bu erda biz o'z ma'lumotimizni keshlaymiz, shunda u qo'ng'iroqlar davomida saqlanadi va oyna ma'lumotlari sifatida tanilgan. Biz bu erda faqat tanlangan rangni saqlashimiz kerak:

typedef tuzilishi

{ / * Ma'lumotlar a'zolarini bu erga qo'shing * / mw_hal_lcd_colour_t selected_colour; } window_W1_data_t; statik window_W1_data_t window_W1_data = {MW_HAL_LCD_YELLOW};

Biz unga boshlang'ich sariq rangni beramiz. Endi xabar funktsiyasida biz tanlangan rangni saqlash uchun kodni biroz o'zgartiramiz:

MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE holati:

{window_W1_data.chosen_colour = xabar-> xabar_data; } tanaffus;

Keyin biz bo'yoq funktsiyasini aylanani shunday chizganda, bu qiymatdan foydalanamiz:

mw_gl_set_solid_fill_colour (window_W1_data.chosen_colour);

Endi biz oynaning mazmuni bog'liq bo'lgan ma'lumotlarni o'zgartirdik, shuning uchun deraza menejeriga oynani qayta bo'yash zarurligini bildirishimiz kerak. Biz buni OK funktsiyali dialog oynasi qabul qilinganda xabar funktsiyasida bajaramiz:

mw_paint_window_client (xabar-> qabul qiluvchining_ qo'li);

Bu oynani to'g'ridan -to'g'ri bo'yashiga olib kelmaydi. Bu oyna menejeriga oynani qayta bo'yash kerakligi to'g'risida xabar yuboradigan yordamchi funktsiya (agar siz unga kirsangiz, bu qanday sodir bo'lishini ko'rasiz). Bu holda qayta bo'yash kerak bo'lgan oynaning o'zi, va oynaning tutqichi xabarni ishlov berish funktsiyasining xabar parametrida.

Agar yuqoridagi kod parchalari qayerga ketishini bilmasangiz, butun fayl endi shunday ko'rinadi:

#qo'shing

#include "miniwin.h" #include "miniwin_user.h" #include "W1.h" typedef struct { / * Bu yerga ma'lumotlar a'zolaringizni qo'shing * / mw_hal_lcd_colour_t tanlangan_ rang; } 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, "Null ko'rsatgich parametri"); / * Oynaning mijozlar maydonini oq rang bilan to'ldiring */ 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). balandligi); / * Bu erda sizga oyna bo'yash kodini qo'shing */ 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 *xabar) {MW_ASSERT (xabar! = (bekor *) 0, "Null ko'rsatgich parametri"); / * Keyingi satr kompilyator ogohlantirishlarini to'xtatadi, chunki hozirda o'zgarmaydigan ishlatilmayapti */ (void) window_W1_data; switch (message-> message_id) {case MW_WINDOW_CREATED_MESSAGE: / * Bu erga har qanday oyna boshlash kodini qo'shing * / break; case MW_MENU_BAR_ITEM_PRESSED_MESSAGE: / * Bu erga oyna menyusiga ishlov berish kodini qo'shing * / break; MW_BUTTON_PRESSED_MESSAGE holati: if (message-> sender_handle == button_B1_handle) { / * Bu nazorat uchun ishlovchi kodini bu erga qo'shing * / mw_create_window_dialog_colour_chooser (10, 10, "Rang", MW_HAL_LCD_RED,; } tanaffus; MW_DIALOG_COLOUR_CHOOSER_OK_MESSAGE holati: {window_W1_data.chosen_colour = message-> message_data; mw_paint_window_client (xabar-> qabul qiluvchining_ko'li); } tanaffus; standart: / * MISRA -ni xursand qiling * / tanaffus; }}

Qayta quring va ishga tushiring, shunda siz aylananing to'ldirish rangini o'rnatishingiz kerak.

Bu oyna ma'lumotlari misolida manba faylining yuqori qismidagi statik ma'lumotlar tuzilmasida saqlanadigan ma'lumotlar ishlatiladi. Agar sizda bu misolda bo'lgani kabi oynaning faqat bitta nusxasi bo'lsa yaxshi bo'ladi, lekin agar sizda bir nechta misol bo'lsa, ularning barchasi bir xil ma'lumotlar tuzilishini bo'lishadi. Bir martalik ma'lumotlarga ega bo'lish mumkin, shuning uchun bir xil oyna turidagi bir nechta misollar o'z ma'lumotlariga ega. Bu docs katalogida joylashgan MiniWin hujjatlarida tushuntirilgan. Fayl misoli uni bir xil oynada bir nechta tasvirlarni ko'rsatish uchun ishlatadi (bu ko'rsatmaning eng yuqori qismidagi asosiy rasmda ko'rinib turganidek).

9 -qadam: Shriftning bir nechta kulgili

Ba'zi final shrift qiziqarli
Ba'zi final shrift qiziqarli

MiniWin TrueType shriftini ko'rsatishni qo'llab -quvvatlaydi. Agar foydalanuvchi interfeysi yaxshi ko'rinadigan bir narsa bo'lsa, bu jozibali shriftlar. Oxirgi qadam MiniWin oynasida TrueType shriftini qanday ko'rsatishni ko'rsatadi.

TrueType shriftlarini ko'rsatishning ikki yo'li mavjud. Ulardan biri, avvalroq aylanada bo'lgani kabi, ularni to'g'ridan -to'g'ri mijozlar maydoniga chizish, ikkinchisi - oynaga matn qutisi boshqaruvini qo'shish. Biz ikkinchisini qilamiz, chunki bu osonroq.

Endi biz JSON konfiguratsiya fayliga matn qutisi boshqaruvini qo'shamiz. Uni 2 -oyna ta'rifiga qo'shing, shunda u shunday bo'ladi:

shunga o'xshash:

{

"Ism": "W2", "Sarlavha": "2 -oyna", "X": 50, "Y": 65, "Kenglik": 100, "Balandlik": 80, "Chegara": to'g'ri, "TitleBar": true, "Visible": true, "Minimed": false, "TextBoxes": [{"Name": "TB1", "X": 0, "Y": 0, "Width": 115, "Balandlik": 50, "asoslash": "markaz", "fon fon rangi": "MW_HAL_LCD_YELLOW", "oldingi fon rangi": "MW_HAL_LCD_BLACK", "shrift": "mf_rlefont_BLKCHCRY16", "yoqilgan": rost, "}} ko'rinadigan":

MiniWin -da TrueType shriftlari haqida qisqa so'z. Shriftlar.ttf fayllariga kiradi. Kattaroq kompyuterlardagi oyna menejerlarida ular kerak bo'lganda displeyingizda ko'rsatiladi. Bu juda ko'p ishlov berish quvvatini va xotirani oladi va kichik qurilmalar uchun mos emas. MiniWin-da ular oldindan bitmaplarga qayta ishlanadi va kompilyatsiya vaqtida belgilangan shrift o'lchami va uslubida bog'lanadi (qalin, kursiv va boshqalar), ya'ni siz kompilyatsiya vaqtida qaysi shrift va o'lchamda qaysi shriftni ishlatishni hal qilishingiz kerak. Bu siz yuklagan MiniWin zip faylidagi ikkita misol shrift uchun qilingan. Agar siz boshqa shriftlarni boshqa o'lcham va uslubda ishlatmoqchi bo'lsangiz, docs papkasidagi MiniWin hujjatlarini ko'ring. Windows va Linux uchun MiniWin-da.ttf fayllarini manba kodli fayllarga oldindan qayta ishlash vositalari mavjud, siz ularni loyihangizga qo'yishingiz mumkin.

Va ikkinchi tezkor so'z - ko'p shriftlar mualliflik huquqi, shu jumladan Microsoft Windows -da topiladigan. Shaxsiy foydalanish uchun ularni xohlaganingizcha ishlating, lekin siz nashr qilayotgan har bir narsa, shriftlar chop etiladigan litsenziyaga ruxsat berishiga ishonch hosil qilishingiz kerak, xuddi MiniWin -ga kiritilgan 2 shriftda bo'lgani kabi, lekin Microsoft shriftlari emas!

Kodga qaytish! Fayllarni yarating, tushiring, tuzing va avvalgidek qayta ishga tushiring, shunda siz Window 2 -da sariq fonda noaniq shriftda standart matn borligini ko'rasiz. Window 2 -ning W2.c. manba faylini tahrirlash orqali matnni o'zgartirish mumkin.

Biz hozirgina yaratgan matn qutisi bilan bog'lanishimiz kerak va buni qanday qilish kerak, MiniWin -dagi har qanday aloqa kabi, unga xabar yuborish kerak. Biz matnni boshqaruv oynasida o'rnatishni xohlaymiz, lekin u ko'rsatilgunga qadar, shuning uchun biz MW_WINDOW_CREATED_MESSAGE holatidagi xabar ishlovchilariga kod qo'shamiz. Bu oyna kodi oynani ko'rsatilishidan oldin qabul qilinadi va shunga o'xshash ishga tushirish uchun mo'ljallangan. Kod generatori xabarni boshqarish funktsiyasida shunday ko'rinadigan joy ushlagichini yaratdi:

MW_WINDOW_CREATED_MESSAGE holati:

/ * Bu erga har qanday oynani boshlash kodini qo'shing */ break;

Bu erda biz mw_post_message funktsiyasidan foydalanib, qaysi matnni ko'rsatishni xohlayotganimizni ko'rsatadigan matn qutisi boshqaruviga xabar yuboramiz.

MW_WINDOW_CREATED_MESSAGE holati:

/ * Bu erga har qanday oyna boshlanish kodini qo'shing */ mw_post_message (MW_TEXT_BOX_SET_TEXT_MESSAGE, xabar-> qabul qiluvchining_kuni, text_box_TB1_handle, 0UL, "Qorong'i va bo'ronli tun edi …", MW_CONTROL_MESSAGE); tanaffus;

Bu parametrlar:

  • MW_TEXT_BOX_SET_TEXT_MESSAGE - Bu boshqaruvga yuboradigan xabar turi. Ular miniwin.h da ro'yxatga olingan va hujjatlarda hujjatlashtirilgan.
  • xabar-> oluvchi_handle - Xabar kimdan kelgan - bu oyna - dastasi xabarni boshqarish funktsiyasiga yuborilgan xabar parametrida.
  • text_box_TB1_handle - Biz xabarni kimga yuboryapmiz - matn qutisini boshqarish dastagi. Bular yaratilgan miniwin_user.h faylida keltirilgan.
  • 0UL - ma'lumotlar qiymati, bu holda hech narsa.
  • "Qorong'i va bo'ronli tun edi …" - Ko'rsatkich qiymati - yangi matn.
  • MW_CONTROL_MESSAGE - Boshqaruv vositasi bo'lgan qabul qiluvchi turi.

Bo'ldi shu. Odatdagidek qayta tiklang va qayta ishga tushiring, shunda siz matn qutisini yuqoridagi rasmda ko'rsatilgandek olasiz.

Xabarlarni joylashtirish MiniWin uchun muhim (barcha oyna menejerlari uchun bo'lgani kabi). Qo'shimcha misollar uchun zip faylidagi loyihalarga qarang va batafsil tushuntirish uchun hujjatlardagi MiniWin xabarlar bo'limini o'qing.

10 -qadam: Oldinga o'tish

Image
Image

Bu MiniWin -ga asosiy kirish uchun. MiniWin bu erda ko'rsatilgandan ko'ra ko'proq narsani qila oladi. Masalan, bu ko'rsatmada qo'llaniladigan doskadagi ekran kichkina, boshqaruv elementlari esa kichik va ularni dibber bilan ishlatish kerak. Biroq, boshqa misollar va qo'shimcha qurilmalar katta displeylarda kattaroq boshqaruv elementlaridan foydalanadi (2 o'lchami bor) va ularni barmoq bilan boshqarish mumkin.

Bu erda ko'rsatilgandan ko'ra ko'proq nazorat turlari mavjud. Boshqa nazorat qilish uchun kod ishlab chiqaruvchi papkasidagi JSON fayllarining turli misollarini ko'rib chiqing. Barcha nazorat turlari ushbu misollarda keltirilgan.

Windows -da juda ko'p variantlar mavjud. Chegara, sarlavha satrlari va piktogramma sozlanishi mumkin. Sizda aylantirish paneli va aylantirish oynasi mijozlari bo'lishi mumkin, bir xil turdagi oynalar va oynalar yalang'och bo'lishi mumkin (faqat mijozlar maydoni, chegarasi yoki sarlavhasi yo'q), demak ular kompilyatsiya vaqtida displeyda o'rnatiladi (bu bo'limdagi tasvirni katta piktogramma bilan ko'ring - bu aslida 6 ta yalang'och oyna).

MiniWin dinamik xotiradan foydalanmaydi. Bu kichik cheklangan qurilmalarga mos keladi va ba'zi o'rnatilgan loyihalar uchun talabdir. MiniWin va u ishlab chiqaradigan kod, shuningdek, MISRA 2012 "talab qilinadigan" darajaga to'liq mos keladi.

Qo'shimcha ma'lumot olish uchun hujjatlar uchun docs papkasini va zip faylidagi boshqa ilovalarni ko'ring. Bu erda MiniWin -ning barcha xususiyatlaridan qanday foydalanish va MiniWin -ni FatFS va FreeRTOS bilan qanday birlashtirishni ko'rsatadigan misollar bor.

Tavsiya: