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