5-linux学习笔记之-----curses
来源:互联网 发布:二手车价格评估软件 编辑:程序博客网 时间:2024/06/15 15:59
curses
-------------------------------------------------------------
Curses:CUI
UI: User Interface.
GUI: 字符界面
CUI: 图形界面
使用一套封装库 libcurse.so
/ust/lib 目录下
编译程序的时候需要指定 -lcurses
老版本: libcurses.so
新版本: libncurses.so
--------------------------------------------------------------------------------
printf/scanf 是标准IO
大部分标准IO可以重定向到终端。/dev/tty 或者 /dev/pts/1
curses不是标准输出,是终端输出,无法重定向。
注意: 为了防止printf重定向到终端破坏UI,建议不要在curses中使用标志IO
1. 编程模型
初始化终端 initscr
操作终端(输入/ 输出/ 定位/刷新……)
释放终端 endwin
2.显示
2.1 图形输出
border-------------在指定窗口输出一个边界
box-----------------在指定窗体输出一个边界
hline----------------水平线
vline-----------------垂直线
属性字符: 字节= 属性字节+ 字符字节。
注意:
box 需要窗体
initscr 返回被初始化的窗体:标准屏幕
实际上curses 定义了一个全局stdscr就是标准屏幕。
curses 库函数命名规则:
×××××× 标准屏幕stdscr进行操作
w×××× 指定窗体
mv××× 指定位置
mvw××× 指定窗体的指定位置
2.2 刷屏
void refresh(); 只刷标准屏幕
void wreesh(WINDOW*); 刷指定窗体的屏幕
原则: 从里到外刷
2.3 字符输出
addchar();
属性字符:一个字符加上属性(' ' | 属性 )(比如让字符加粗,加上下划线)
如: mvaddch(2,10,'A' | A_BOLD);
常见属性的宏定义如下:
Name Description
────────────────────────────────────────────────────────────
A_NORMAL Normal display (no highlight)
A_STANDOUT Best highlighting mode of the terminal.
A_UNDERLINE Underlining
A_REVERSE Reverse video
A_BLINK Blinking
A_DIM Half bright
A_BOLD Extra bright or bold
A_PROTECT Protected mode
A_INVIS Invisible or blank mode
A_ALTCHARSET Alternate character set
A_ITALIC Italics (non-X/Open extension)
A_CHARTEXT Bit-mask to extract a character
COLOR_PAIR(n) Color-pair number n
______________________________________________________________________________
2.4 字符串的输出
int addstr(const char *);
2.5 格式字符串的输出
printw(const char*,..............);
3. 字符属性与颜色
3.1 判断终端释放支持颜色
bool has_colors(); (可以不用判定,现在大多数系统都支持颜色的)
3.2 初始化颜色
int start_color();
3.3 定义颜色对
int init_pair(short pair,short fore, shot );
3.4 使用颜色对(对颜色属性的访问)
COLOR_PAIR(shot pair);
3.5 设置属性
attron(); //// 开启属性
attroff(); //// 关闭属性
注意:这组函数一定要在调用了initscr之后使用
字符的颜色属性有8种
——————————————————————————
COLOR_BLACK
COLOR_RED
COLOR_GREEN
COLOR_YELLOW
COLOR_BLUE
COLOR_MAGENTA
COLOR_CYAN
COLOR_WHITE
——————————————————————————
文档的查看:
_______________________
$ man attron
$ man addch
$ man box
$ man attron
_____________________________
这是curses的一个最简单的例子
/// cur_init.c#include <curses.h>int main(){WINDOW *w = initscr(); // 初始化终端mvhline(2,10,'-',20);mvvline(2,10,'|',20);refresh();getch(); /// 等待一个字符的输入endwin(); /// 释放终端return 0;}
——————————————————————————————
////makefile
cur_init:
gcc cur_init.c -omain -lcurses(记得加上库)
———————————————————————————————
字符属性与颜色的例子
/// cur_out.c#include <curses.h>int main(){initscr();if(has_colors() == TRUE) /// 判断是否支持颜色{start_color(); /// 初始化颜色的显示功能/// 颜色只能是库里面的8种颜色的组合init_pair(1,COLOR_RED,COLOR_WHITE);init_pair(2,COLOR_BLUE,COLOR_GREEN);init_pair(3,COLOR_BLACK,COLOR_WHITE);bkgd(COLOR_PAIR(3));/// 调用第3个颜色对}box(stdscr,0,0);// 对颜色的访问是通过COLOR_PAIR 函数的调用完成的mvaddch(2,10,ACS_PI | COLOR_PAIR(1));mvaddch(2,11,ACS_PI | COLOR_PAIR(2));// 开启字符属性attron(COLOR_PAIR(1));// 字符串输出mvaddstr(5,10,"Hello 我的女神");/// 关闭字符属性attroff(COLOR_PAIR(1));attron(COLOR_PAIR(2) | A_UNDERLINE);mvaddstr(7,10,"Hello Fellow!");attroff(COLOR_PAIR(2) | A_UNDERLINE);/// 格式字符串输出mvprintw(9,10,"行:%d,列:%d",LINES,COLS);// 打印行和列getch();endwin();return 0;}
截图如下,显示的非常简单
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
对乱码问题的解决方案:(编码解决)
1. 在vi设置编码 :
$:set encoding = 编码 ( gb2312 ios-8859-1 utf-8)
2. ( man gcc)
在编译器指定输出源文件编码 ( -finput-charset=gb2312)
执行文件编码(-fexec-charset=charset)
---------------------------------------------------------
$ gcc addstr.c -omain -lcurses -finput-charset=gb2312
------------------------------------------------------------------
3. 终端指定编码:(鼠标直接设置编码)
4. 系统默认编码
/etc/sysconfig /il8n 配置编码
总结: 我的结论是我使用UTF-8 始终都是乱码,只有把 编辑器 和 终端 都设置成GB2312, 乱码问题可以解决,
首先说明一点我使用的系统是 ubuntu 32位 14.04
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
案例:
1. 时间显示屏幕
1. 初始化
2. 循环显示时间,并且睡眠
/// demo2.c #include <curses.h>#include <time.h>#include <unistd.h>void init();void drawui();void busines();void destroy();main(){init();drawui();busines();destroy();}void init(){initscr();if(has_colors() == TRUE){start_color();init_pair(1,COLOR_RED,COLOR_WHITE);init_pair(2,COLOR_BLACK,COLOR_GREEN);bkgd(COLOR_PAIR(2));}}void drawui(){box(stdscr,0,0);}void busines(){time_t tt;struct tm *t;while(1){//取取时间tt = time(0);// 把时间转换为struct tm 结构体t = localtime(&tt);// 显示时间attron(COLOR_PAIR(1));mvprintw(LINES/2,(COLS-8)/2,"%02d:%02d:%02d",t->tm_hour,t->tm_min,t->tm_sec);attroff(COLOR_PAIR(1));// 刷新屏幕refresh();sleep(1);}}void destroy(){endwin();}
2. 做一个登陆界面
1. 初始化
2. 绘制界面
3.等待输入
4.结束
#include <curses.h>#include <unistd.h>#include <stdlib.h>#include <string.h>void init();void drawLogin();void destroy();main(){init();drawLogin();destroy();}void init(){ initscr(); if(has_colors() == TRUE) { start_color(); init_pair(1,COLOR_BLUE,COLOR_WHITE); init_pair(2,COLOR_RED,COLOR_GREEN); bkgd(COLOR_PAIR(1)); }}void drawLogin(){char *heads = "图书馆图书管理系统";char *user = "用户[ ]";char *pass = "密码[ ]";box(stdscr,0,0);attron(A_BOLD | COLOR_PAIR(2)); // 打开字符属性mvaddstr(3,(COLS-strlen(heads)) /2,heads);attroff(A_BOLD| COLOR_PAIR(2));mvaddstr(6,(COLS-strlen(user))/2,user);mvaddstr(8,(COLS-strlen(pass))/2,pass);refresh();}void destroy(){refresh();getch();endwin();}
4.键盘输入
1. 字符输入
int getch(); // 返回字符
int getstr(char *string) ; //对其返回字符串长度没有限制,很容易出现问题的
int getnstr(char *string , int number_of_character); ////对读取的字符数目加以限制
举例:
/// getch.c#include <curses.h>main(){int ch;// 初始化initscr();noecho(); /// 隐藏光标// 循环输入while(1){ch = mvgetch(5,10);// 循环显示输入mvprintw(8,10,"你输入的是:%c(%d)",ch,ch);}// 释放endwin();}
案例:
使用键盘控制字母在屏幕上移动。
补充:
(1)noecho(); //// 禁止回显(输入的信息不能显示在屏幕上)
(2)curses 清除屏幕:man 3 clear
int clear (void);
int erase(void);
(3)光标控制:
得到光标位置: getsyx
设置光标位置: setsyx();
设置光标是否可见:int curs_set(int visibility); (0 不可见 1可见)
(4)keypad 模式
curses 在启动时会关闭转义序列与逻辑键之间的转换功能,该功能需要通过调用keypad函数来启用
/// demo4.c#include <curses.h>main(){int ch;int x = 5,y = 5;initscr();noecho(); // 禁止回显keypad(stdscr,TRUE); // 功能键的开启,这个必须要mvaddch(y,x,'A'); /// 移动的是字符Awhile(1){ch = getch();mvaddch(y,x,' '); // 使用空格清屏//clrtoeol();//clear(); // 删除整个屏幕//erase();switch(ch){case KEY_UP:y--;break;case KEY_DOWN: y++;break;case KEY_LEFT:x--;break;case KEY_RIGHT:x++;break;}/// 在指定位置输出mvaddch(y,x,'A');refresh();}}
最后一个小例子
#include <curses.h>void init();void drawUi();void dealInput();void destroy();main(){init();drawUi();dealInput();destroy(); }void init(){ initscr();}void drawUi(){ mvaddstr(2,2,"[ ] + [ ] = [ ]"); refresh();}void dealInput(){ int a , b; int c ; while(1) { mvscanw(2,4,"%d",&a); mvscanw(2,12,"%d",&b); mvprintw(2,23,"%d",a+b); refresh(); }}void destroy(){ endwin();}
5. 窗体
subwin(); // 创建子窗体(坐标采用标准屏幕坐标)
derwin(); // 创建子窗体(坐标采用父窗体坐标)
总结: curses 的编程模式比较固定,用的是一套库,都是函数的调用,使用并不是很难,
- 5-linux学习笔记之-----curses
- curses.h学习笔记
- curses.h学习笔记
- linux之curses库
- 《Linux程序设计》学习笔记06——curses函数库
- linux编程学习笔记(十一) curses CUI界面
- curses.h库学习笔记
- LINUX程序设计 使用curses函数库管理基于文本的屏幕 学习笔记
- Linux下curses函数库的学习
- 关于Linux之curses.h文件
- curses学习
- curses 库笔记
- Linux curses库
- Linux curses库使用
- linux中curses
- Linux中的curses编程
- linux curses举例
- linux curses 彩色显示
- poj1459 最大流 Power Network
- Ticket 服务: 一种经济的分布式唯一主键生成方案
- 细说linux挂载——mount,及其他
- UVa 348 Optimal Array Multiplication Sequence (DP 最优矩阵链乘)
- Linux netstat命令详解
- 5-linux学习笔记之-----curses
- 7.14 虚函数
- Sum it up
- 取消单选按钮选中
- Python模块学习——logging
- 编写自己的异常类
- PHPer 发展之路
- android_01 button
- zoj 3792 最小割等于最大流 Romantic Value