ncurses

cd ncurses-6.1
$ ./configure --prefix=/opt/ncurses
$ make
$ sudo make install

交叉编译GDB之后,执行报错:
 error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
提示需要库ncurses :
所以需要下载该库的源码并下载交叉编译,然后安装到目标板卡:
库源码下载:    http://invisible-island.net/ncurses/ncurses.html   下载:The ncurses source (gzip'd tar)
交叉编译
    修改配置文件:./configure      cross_compiling=yes
    配置如下:
./configure --prefix=/home/XX/Software/NcuresInstall --host=i686-pc-linux-gnu --with-shared CC=/opt/XXX-gcc  

编译:make
然后:make install  就会生成/home/XX/Software/NcuresInstall/lib/libncurses.so.6.1  
手动或者自动安装到目标板卡即可

中文显示乱码的问题
1、包含头文件 #include<locale.h>
2、在init()之前加上setlocale(LC_ALL,"");
3、编译时加上 -lncursesw

g++ -o ncurses ncurses.cpp -lncurses
gcc -o t2 t2.c -lncursesw

initscr()       初始化,进入ncurses模式
endwin()        退出ncurses模式
move(y,x)       将光标移动至(x,y)处。
refresh()       我们写入的内容首先会在系统缓冲区中,经过refresh()函数刷新之后才能够显示到屏幕上。
echo()          输入的字符显示
noecho()        不显示在终端上。可以用密码输入。
cbreak()        函数禁用行缓冲并设置 curses 每次只接受一个字符
addch()         显示一个字符
addstr()        显示一串字符串
printw("格式",变量);显示指定格式的内容,类似于printf();
mvaddstr()      移动到某个位置输出。
getch()         输入一个字符
getstr()        输入一串字符串
scanw("%s",s)   按指定格式输入内容,类似于scanf();
mvaddstr()      移动到某个位置输入。

attron();       打开输出修饰
attroff();      关闭输出修饰
可修饰类型:
A_NORMAL     普通字符输出 (不加亮显示)
A_STANDOUT   终端字符最亮
A_UNDERLINE  下划线
A_REVERSE    字符反白显示
A_BLINK      闪动显示
A_DIM        半亮显示
A_BOLD       加亮加粗
A_PROTECT    保护模式
A_INVIS      空白显示模式
A_ALTCHARSET 字符交替
A_CHARTEXT   字符掩盖
COLOR_PAIR(n) 前景、背景色设置
eg:
attron(A_BOLD|A_BLINK);
addstr("Hello!");
attroff(A_BOLD|A_BLINK);

ACS_VLINE
ACS_HLINE
LINES
COLS

窗口机制
1、创建窗口
WINDOW * new;
new = newwin(b,a,y,x);  创建一个新的窗口从(x,y)处规格为(a,b)大小。

2、窗口边框修饰
(1)box(new,ACS_VLINE,ACS_HLINE);
    或者box(new,‘|’,‘-’)等。镶上一个边框。
(2)wborder(win,'|','|','--','--','+','+', '+','+');

+----------------------------+-----------------------
|                                                    |
+-----+

wmove();
waddstr()
wscanw();
wrefresh();

addch(ch | A_BOLD | A_UNDERLINE);
attrset()、attron()、attroff()

mvaddch()用于将光标移动到指定位置输出字符。因而,下面的函数调用:
     move(row,col);  
     addch(ch);
可以用以下的等价函数取代:
    mvaddch(row,col,ch);
 

printw()系列函数
    这些函数的用法和我们熟悉的printf()函数相似,但增加了可以在屏幕任意位置输出的功能。
printw()函数和mvprintw()函数
    这两个函数的绝大部分用法和printf()函数相同。
    mvprintw()函数将光标移动到指定的位置,然后打印内容。
    如果你想先移动光标,再调用 printw()函数,也就是说先调用move()函数,然后调用printw()函数。
wprintw() 函数和 mvwprintw函数
    这两个函数和以上两个函数类似。
    区别在于这两个函数将在指定的窗口输出内容,而以上两个函数将内容输出到标准输出stdscr上。
vwprintw()函数
    这个函数和vprintf()相似,用于打印变量表中所对应的变量。
    
大多数 curses 程序以这四条指令开头。
initscr();
cbreak();
noecho();
clear();

注意这里使用的 LINES 和 COLS,它们是由 initscr() 来设置的。这些值告诉程序在终端的行数和列数。
屏幕坐标从 0 开始,所以屏幕左上角是 0 行 0 列。屏幕右下角是 LINES - 1 行,COLS - 1 列

http://www.faqs.org/docs/Linux-HOWTO/NCURSES-Programming-HOWTO.html
https://blog.csdn.net/tingya
https://blog.csdn.net/zhanganliu/article/category/7585941
https://blog.csdn.net/hadesgin/article/details/6787633
https://blog.csdn.net/a752602882/article/category/6013947

开始ncurses模式,需要

initscr();

返回一个WINDOWS指针,默认会使用stdscr.也可以自己接收处理,用于有多个win的情况.

endwin();

结束ncurses对终端的控制,终端还是那个终端,只是运行initscr后,ncurses获得了对终端的控制,可以理解为ncureses释放了终端.

注解

ncurses控制的是当前终端,使用ncurses的程序退出后,ncurses对终端的影响还会起作用,因为不管那个程序,使用的是同一个终端,执行endwin,就避免了对下一个程序的影响,通常需要 atexit(func) 挂载一个退出钩子,执行这个函数.

基本的终端设置

在initscr以后,ncurses获得了对终端的控制,如果不设置,就是默认的哪些设置,跟一般的终端没有什麽区别嘛,一般都会进行一些设置的,设置函数如下:

cbreak()

设置无buff模式,就是键入的字符立刻被读取的意思,默认就是这样的.执不执行一样.

nocbreak()

设置为buff模式,在这个模式下,只有return或者newline(就是enter键啦)才会让getch返回,让ncurese得到输入.

noecho()

设置无会显模式,就是按下可显示字符时,不在默认输出了,让我们可以自由的控制,比如输入密码的时候.

echo()

设置可以会显.

nl()

设置受到回车的时候换一行,并让getch得到这个输入.

nonl()

回车不让getch得到.只是换一行.

keypad(stdscr,TRUE)

设置把受到的特殊键比如箭头,转化为ncurses定义的以KEY开头的数字宏,

keypad(stdscr,FALSE)

设置接收到特殊键的时候以转化后的转义字符表示,这种表示是无法进行判断的.

    其中stdscr是一个窗口.

scrollok(stdscr, TRUE)

设置是否可以滚东屏幕,stdscr是默认窗口,也可以设置自定义的一块窗口区域可以滚动.或者不能滚动.

基本的输入

int c = getch()

等待用户输入一个字符,输入特殊键时,设置keypad后,c是转行后的数字,没有设置,

    就会返回几个转移字符.注意返回的是int型.

int c = wgetch(stdscr)

等待用户输入.在一个 窗口 等待,这个窗口是ncurses的虚拟概念.用第一个好了.

基本的输出

printw(fmt, …)

参数和printf是一样的,只是把f换成了w,格式化输出.这个默认是不会立刻显示的.只是写到

    了buff里,想想双缓冲的概念,显示一个,这里写的是另一个.

refresh()

刷新界面,交换两个缓冲区,立刻显示,让用户自己定义何时进行显示,给用户更大的自由度.

mvprintw(int y, int x, fmt, …)

这个也是输出,是一定光标的输入点后,在接收输入字符.y 是第几行,x 是第几列.使用的 x 和 y 和窗口坐标系是一致的,只是行数的参数第一个是 y 第二个是 x .

坐标的移动和确定

move(y ,x)

移动坐标到 y 行, x 列. 类似的还有 wmove(win, y, x) 移动一个win的光标.

int getcurx(stdscr)

得到一个窗口的内的当前光标所在的列数.多个窗口的话修改stdscr就好了.

int getcury(stdscr)

得到一个窗口的当前光标所在的行.

类似的还有 int getmaxx(stdscr) int getmaxy(stdscr) 得到窗口的最大列数和行数.

颜色的简单控制

概述

ncurses的颜色同样使用命令开关的模式,使用ncurses的进程不管如何设置,使用的都是同一个终端,即使进程结束了,终端给其他进程使用了,这个终端也还是一个终端.

ncurses开启颜色后,需要将两个颜色,前景色和背景绑定,生成一个颜色对,并给这个颜色对一个id,通个id来使用颜色对,可以绑定多个颜色对,使用开启关闭来控制.

bool has_colors()

判断是否当前终端支持颜色显示.

start_clolr()

开启颜色显示模式, 必须执行 执行以后才可以使用颜色显示,不执行,默认并不开启颜色显示模式的.并没有stop_color(),在执行end_win的时候,统一将终端恢复到初始时的状态.

init_pair(int id, front_color, back_color)

绑定一个颜色对,并标记为id,这个绑定的颜色对,被记录在ncurses的内部,id只是一个键值.ncurses预定义了八种属性:COLOR_BLACK COLOR_RED COLOR_GREEN COLOR_YELLOWCOLOR_BLUE COLOR_MAGENTA COLOR_CYAN COLOR_WHITE如果这些颜色不满意,可以通个 init_color(COLOR_RED, 700, 0, 0) 自定义颜色(后面的参数是以1000为基数的RGB), 通过color_content() 和 pair_content() 查看当前的颜色设置情况

attron(COLOR_PAIR(id))

开启id这个颜色对,attron表示让终端开启一个属性,COLOR_PAIR表示开启一个颜色属性,id是颜色属性的参数,开启颜色属性后,在使用输出函数(printw, mvprintw等)时,就会打印对应的颜色. 一直有效,直到执行attroff

attroff(COLOR_PAIR(id))

关闭一个颜色属性,之后,终端回复到默认状态,使用输出语句输出就正常了.

猜你喜欢

转载自www.cnblogs.com/wljcom/p/9823644.html