1. 程式人生 > >C指標原理(33)-Ncurses-文字終端的圖形

C指標原理(33)-Ncurses-文字終端的圖形

鍵盤管理

我們打造一個簡單的單屏編輯器

首先構造一個僅帶輸入功能的編輯器,使用wgetch來捕捉輸入。

#include <locale.h>

#include <stdio.h>

#include <ncurses.h>

int main(int argc, char *argv[])

{

setlocale(LC_ALL,"");

initscr();

clear();

noecho();

cbreak();

if(has_colors() == FALSE)

endwin();

printf("你的終端不支援色彩!\n");

return (1);

}

start_color(); /啟動color 機制/

init_pair(1, COLOR_GREEN, COLOR_BLACK);

WINDOW *win1;  

int width=COLS-14;

        int height=LINES-14;

        int x,y;

        win1=newwin(height,width,7,7);//新視窗(行,列,begin_y,begin_x)

keypad(win1,TRUE);

        box(win1,ACS_VLINE,ACS_HLINE);

        wattron(win1,COLOR_PAIR(1));

wrefresh(win1);

getyx(win1,y,x);

++y;++x;

while(1){

int c=mvwgetch(win1,y,x);

++x;

if (x>=width-1){

         ++y;

x=1;

}

if (y>=height-1){

y=1;

}

                mvwprintw(win1,y,x,"%c",c);

wrefresh(win1);

}

        wattroff(win1,COLOR_PAIR(1));

endwin();

return 0;

}

執行

[email protected]:~/cursestest % gcc -lncursesw a.c -o mytest

[email protected]:~/cursestest % ./mytest

接著繼續完善,為它加上方向鍵的支援,移動方向鍵,可移動游標,並編輯游標處的內容。

#include <locale.h>

#include <stdio.h>

#include <ncurses.h>

int main(int argc, char *argv[])

{

setlocale(LC_ALL,"");

initscr();

clear();

noecho();

cbreak();

if(has_colors() == FALSE)

endwin();

printf("你的終端不支援色彩!\n");

return (1);

}

start_color(); /啟動color 機制/

mvprintw(5,COLS/2-10,"簡單編輯器-僅限於單個螢幕的編輯");

refresh();

init_pair(1, COLOR_GREEN, COLOR_BLACK);

WINDOW *win1;  

int width=COLS-14;

        int height=LINES-14;

        int x,y;

        win1=newwin(height,width,7,7);//新視窗(行,列,begin_y,begin_x)

keypad(win1,TRUE);

        box(win1,ACS_VLINE,ACS_HLINE);

        wattron(win1,COLOR_PAIR(1));

wrefresh(win1);

getyx(win1,y,x);

++y;++x;

while(1){

int c=mvwgetch(win1,y,x);

switch(c)

{

case KEY_RIGHT:

++x;

if (x>=width-1) {

++y;

x=1;

}

break;

case KEY_LEFT:

--x;

if (x<1){

--y;

x=width-2;

}

break;

case KEY_UP:

        --y;

if (y<1){

y=height-2;

}

break;

case KEY_DOWN:

        ++y;

if (y>=height-1){

y=1;

}

break;

default:

                 mvwprintw(win1,y,x,"%c",c);

++x;

if (x>=width-1){

         ++y;

x=1;

}

if (y>=height-1){

y=1;

}

wrefresh(win1);

}

}

        wattroff(win1,COLOR_PAIR(1));

endwin();

return 0;

}

[email protected]:~/cursestest % gcc -lncursesw a.c -o mytest

[email protected]:~/cursestest % ./mytest

我們定義delete鍵為刪除某個字元,回車符表示換行,同時定義F12為刪除整行,F1為退出。

[email protected]:~/cursestest % cat a.c

#include <locale.h>

#include <stdio.h>

#include <ncurses.h>

//code by [email protected]

//date:2014/1/17

int main(int argc, char *argv[])

{

setlocale(LC_ALL,"");

initscr();

clear();

noecho();

cbreak();

if(has_colors() == FALSE)

endwin();

printf("你的終端不支援色彩!\n");

return (1);

}

start_color(); /啟動color 機制/

mvprintw(5,COLS/2-10,"簡單編輯器-僅限於單個螢幕的編輯");

refresh();

init_pair(1, COLOR_GREEN, COLOR_BLACK);

WINDOW *win1;  

int width=COLS-14;

        int height=LINES-14;

        int x,y;

        win1=newwin(height,width,7,7);//新視窗(行,列,begin_y,begin_x)

keypad(win1,TRUE);

        wattron(win1,COLOR_PAIR(1));

        box(win1,ACS_VLINE,ACS_HLINE);

wrefresh(win1);

getyx(win1,y,x);

++y;++x;

while(1){

int c=mvwgetch(win1,y,x);

switch(c)

{

case KEY_RIGHT:

++x;

if (x>=width-1) {

++y;

x=1;

}

break;

case KEY_LEFT: --x;

if (x<1){

--y;

x=width-2;

}

break;

case KEY_UP:

        --y;

if (y<1){

y=height-2;

}

break;

case KEY_DOWN:

        ++y;

if (y>=height-1){

y=1;

}

break;

case 10:

        ++y;

if (y>=height-1){

y=1;

}

break;

case KEY_F(1):

        //退出

mvprintw(LINES-3,2,"退出編輯器嗎?");

mvprintw(LINES-2,2,"    ");

refresh();

int ans=getch();

if (ans=='Y' ||ans=='y')

{

mvprintw(LINES-2,2,"是\n");

refresh();

return 0;

}else

mvprintw(LINES-2,2,"否\n");

refresh();

break;

case KEY_F(12):

        //刪除某行

wdeleteln(win1);

winsertln(win1);

         box(win1,ACS_VLINE,ACS_HLINE);

case KEY_DC:

        //刪除某字元

                 mvwprintw(win1,y,x," ");

break;

default:

                 mvwprintw(win1,y,x,"%c",c);

++x;

if (x>=width-1){

         ++y;

x=1;

}

if (y>=height-1){

y=1;

}

wrefresh(win1);

}

}

        wattroff(win1,COLOR_PAIR(1));

endwin();

return 0;

}

執行

[email protected]:~/cursestest % gcc -lncursesw a.c -o mytest

[email protected]:~/cursestest % ./mytest