C指针原理(33)-Ncurses-文本终端的图形

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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("你的终端不支持色彩! ");

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("你的终端不支持色彩! ");

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>

//[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("你的终端不支持色彩! ");

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,"是 ");

refresh();

return?0;

}else

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

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

以上是关于C指针原理(33)-Ncurses-文本终端的图形的主要内容,如果未能解决你的问题,请参考以下文章

C指针原理(35)-Ncurses-文本终端的图形

C指针原理(34)-Ncurses-文本终端的图形

C指针原理(34)-Ncurses-文本终端的图形

我如何保证终端具有 NCURSES 的 Unicode/宽字符支持?

Ncurses入门-安装与使用

基于文本图形(ncurses)的文本搜索工具 ncgrep