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>
//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-文本终端的图形的主要内容,如果未能解决你的问题,请参考以下文章