klavishlar paneli (stdscr, TRUE) - agar siz klaviatura () ni shu tarzda chaqirsangiz, F qatori va kursor tugmachalarining tugmachalarini "tutib olishingiz" mumkin bo‘ladi. stdscr "standart" oynaga ncurses tomonidan belgilangan standart ko‘rsatgichdir. Agar siz TRUE parametri bilan klaviaturani chaqirmasangiz, getch () kabi funksiyalar bosilgan tugma kodi oʻrniga qochish ketma-ketligini qaytaradi.
noecho ()- agar chaqirilsa, keyingi tugmalar avtomatik ravishda ekranda ko‘rsatilmaydi. Agar siz tugmachalarni bosishni o‘zingiz hal qilmoqchi bo‘lsangiz, bu oddiy rejim (masalan, o‘z menyuingizni amalga oshirish va shunga o‘xshashlar).
Ncurses kutubxonasi bilan ishlashni tugatish uchun endwin () funksiyasini chaqiring, bu kutubxona tomonidan ajratilgan barcha resurslarni chiqaradi va terminalni kutubxona dasturingiz tomonidan ishga tushirilgunga qadar holatiga qaytaradi.
Getch() funksiyasi umumiy maqsadlar uchun tugmalar bosishlarini o‘qish uchun va wgetch () ma'lum bir oynadan o‘qish uchun ishlatiladi. Loop shunday ko‘rinadi:
int ch = 0; while (ch! = 'q') { // ekranni yangilash // va tugmachasini bosish uchun kuting // uning kodini ch.da oling ch = getch (); switch (ch) { case 48 ... 57:; // tugma 0 dan 9 gacha bosiladi sindirish; Case KEY_UP:; // kursor "yuqoriga" bosildi sindirish; } } Ushbu misol bosilgan tugmani aniqlashning barcha uch turini qamrab oladi: to‘g‘ridan-to‘g‘ri belgi bo‘yicha, kod bo‘yicha va nomli konstanta bo‘yicha. Agar noecho () funksiyasi o‘chirilgan bo‘lsa, u holda bosilgan tugmalar ekranda ko‘rsatiladi, aks holda ular bo‘lmaydi.
Matnni konsolga chop etish uchun ko‘pincha printw () funksiyasidan foydalaniladi, u printf () bilan bir xil argumentlarni oladi, ya'ni matnni xohlaganingizcha formatlashingiz mumkin. C ++ satrlari uchun (std: string) ular c_str () funksiyasi orqali string parametrlari sifatida uzatilishi kerak, ya'ni:
std :: string testi; [...] printw ("% s \ n", test.c_str ()); Agar chiziq orqadagi "\ n" belgisisiz chop etilganda, kursor joriy satrda, oxirgi chop etilgan belgida qoladi, shuning uchun printw() ga keyingi qo‘ng‘iroq bu holda joriy qatorni tugatadi. Addch() funksiyasi parametrda berilgan bitta belgini ko‘rsatish uchun ishlatiladi. Siz darhol unga uslub atributlarini o‘rnatishingiz mumkin (belgi mantiqiy OR yordamida atributlar bilan birlashtirilgan):
addch ('a' | A_BOLD | A_UNDERLINE); Belgilangan koordinatalarda belgini quyidagicha ko‘rsatishingiz mumkin:
move (row, col); addch (ch); Yoki shunday:
mvaddch (row, col, ch); Matn atributlari rang va uslubdir. Ular printw() ga ham tegishli. Atributlarni qanday o‘zgartirish mumkin?
Avval siz funksiyani chaqirib (odatda initscr() dan keyin) ncurses "rangli dvigatel" ni yoqishingiz kerak:
start_color (); Buning uchun siz ikkita "rang juftliklari" deb ataladigan narsalarni yaratishingiz kerak. Birinchisiga harflarning qizil rangi fon uchun qora, ikkinchisiga esa harflarning oq rangi va fon uchun qora rang beriladi:
init_pair (1, COLOR_RED, COLOR_BLACK); init_pair (2, COLOR_WHITE, COLOR_BLACK); Keling, qatorli ro‘yxat elementlariga ega vektor borligini aytaylik. Keyin siz ushbu elementlarni tsiklda ko‘rsatishingiz kerak, ular uchun kerakli atributlarni o‘rnatasiz. Men kichik ishchi dastur (test.cpp) yordamida misolni tahlil qilaman:
#include #include #include #include using namespace std;
vector list; int current_element; void update_screen() { erase(); //чистим экран
for (size_t i = 0; i < list.size(); i++) { if (i == current_element) { attron(A_BOLD); attron (COLOR_PAIR(1)); printw ("%s\n", list[i].c_str()); attroff (COLOR_PAIR(1)); attroff(A_BOLD); } else { attron (COLOR_PAIR(2)); printw ("%s\n", list[i].c_str()); attroff (COLOR_PAIR(2)); } } }
int main (int argc, char *argv[]) { initscr(); start_color(); keypad (stdscr, TRUE); noecho();
init_pair (1, COLOR_RED, COLOR_BLACK); init_pair (2, COLOR_WHITE, COLOR_BLACK); list.push_back ("one"); list.push_back ("two"); list.push_back ("three"); current_element = 0;
int ch = 0; while (ch != 'q') { update_screen(); ch = getch(); switch (ch) { case KEY_UP: if (current_element > 0) current_element--; break; case KEY_DOWN: if (current_element < list.size()-1) current_element++; break; case '\n': break;
} }
endwin(); return 0; } Bular ncurses kutubxonasidan foydalanishda dasturlash asoslari. Umumiy ncurses-ga asoslangan interfeys elementlarini yaratish uchun bir qator yordamchi kutubxonalar ham mavjud: menyular (menyular uchun), panellar (panellar yoki bir-birining ustiga chiqadigan oynalar uchun), shakllar (kirish maydonlari uchun). Ular mos ravishda manba kodiga ulangan:
#include # include
#include Va ular quyidagicha bog‘langan:
$ gcc test.cpp -lmenu -lpanel -lform -lncurses Agar dasturingiz ekranga faqat tugmalar bosish va pozitsion chiqishni o‘qishdan ko‘ra ko‘proq kerak bo‘lsa, ulardan foydalaning.