c语言 ncurses编程.ppt_第1页
c语言 ncurses编程.ppt_第2页
c语言 ncurses编程.ppt_第3页
c语言 ncurses编程.ppt_第4页
c语言 ncurses编程.ppt_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,Linux ncurses编程2-1,第九章,本章目标,Curses函数库的工作原理、使用方法 Curses函数库输入输出 字符属性 Curses创建窗口,3,curses 简介,curses 的命名是来自一个叫做“cursor optimization (光标最优化)的双关语。curses 构成了一个工作在底层终端代码之上的封装,并向用户提供了一个灵活高效的API ( Application Programming Interface 应用程序接口)。 curses提供了移动光标,建立窗口,产生颜色,处理鼠标操作等功能。,4,第一个curses程序,#include int main()

2、 initscr() /* 初始化,进入NCURSES 模式*/ printw(“Hello World !”) /* 在虚拟屏幕上打Hello World!*/ refresh() /* 将虚拟屏幕上的内容写到显示器 上,并刷新*/ getch() /* 等待用户输入*/ endwin() /* 退出NCURSES 模式*/ return 0 ,5,编译包含NCURSES 库函数的程序,如果要调用ncurses 库中的函数,你必须在代码中加载ncurses.h 文件,就是要在C 或C+程序开头添加“#include ”,然后在链接时标记lncurses参数。(注:ncurses 库已经包含“

3、stdio.h”) 编译和连接命令: gcc -lncurses,6,curses工作原理3-1,窗口是由curses系统定义的一个假想的屏幕,即逻辑屏幕。并不像Windows 平台上的窗口那样具有边框。当curses 初始化的时候,它会默认创建一个叫做stdscr 的窗口。这个窗口的屏幕一般是80列,24 行(根据显示环境的不同,可能会出现不同的大小)。,7,curses工作原理3-2,逻辑屏幕的布局是一个字符数组,数组下标为行号和列号组成。位置(0,0)是屏幕的左上角 curses函数使用的坐标是y值(行号)在前,x值(列号)在后。,8,curses工作原理3-3,stdscr数据结构指的

4、是“标准屏幕”,它的工作原理和stdio函数库中的标准输出stdout非常相似,在curses程序里,它是缺省的输出窗口。 curscr数据结构指的是“当前屏幕”。 在程序调用refresh之前,输出数据是不会出现在标准屏幕上的。 refresh被调用时,curses会比较stdscr与curscr的内容,只刷新发生改变的部分。,9,字符输出过程,在一个curses程序里,输出一个字符的过程是: 使用curses函数刷新一个逻辑屏幕 请求curses用refresh刷新物理屏幕,10,curses模式初始化,initscr()函数将终端屏幕初始化为curses 模式 它用来清除屏幕上所有的字符

5、,并等待下一步处理。 在调用其它的curses 函数前,要先调initscr()函数初始化屏幕。 initscr()初始化了curses 系统并且为当前屏幕(也就是“stdscr”)和相关的数据结构分配内存,11,退出curses模式,通过endwin()函数退出curses 模式 endwin()函数释放了curses 子系统和相关数据结构占用的内存 必须是在完成所有的curses 操作以后才可以调用,12,refresh() 函数,在使用printw 函数打印“Hello World!”时,实际上这个消息打印到了一个叫作“stdscr”的虚拟窗口上,没有被直接输出到屏幕上。 printw(

6、)函数的作用是不断将一些显示标记和相关的数据结构写在虚拟显示器上,并将这些数据写入stdscr 的缓冲区内。 为了显示这些缓冲区中的数据我们必须使用refresh()函数告诉curses系统将缓冲区的内容输出到屏幕上。,13,getch(),功能说明:从键盘读入一个字符 原型: 注意:这个getch()是ncurses提供的函数,没有getche()这个函数,int getch (void);,14,getyx(),功能说明:用来取得当前光标的位置 原型:,void getyx(WINDOW *win, int y, int x);,要获取的窗口,获取到的位置存放在这两个变量中,15,其他ge

7、tyx()系列函数,16,移动光标,功能说明:把逻辑光标的位置移动到指定的 地点 原型:,int move (int new_y, int new_x);,新位置的x坐标,如果我们想让光标位置在调用move函数后立刻发生变化,就必须在它的后面立刻跟上一个refresh()调用。,新位置的y坐标,17,输出函数,在curses 函数中有三类输出函数,它们分别是: addch()系列:将单一的字符打印到屏幕上,可以附加加字符修饰参数的一类函数。 printw()系列:和printf()一样的具有格式化输出的一类函数。 addstr()系列:打印字符串的一类函数。,18,addch(),功能说明:在

8、光标的当前位置添加给定的字符 原型:,int addch (const chtype char_to_add);,要添加的字符,chtype是curses自己的字符类型,在ncurses中所使用的chtype实际上是一个unsigned long整数 char_to_add = ch | A_BOLD | A_UNDERLINE,19,addstr(),功能说明:在光标的当前位置添加给定的字符串 原型:,int addstr (chtype * const string_to_add);,要添加的字符串,20,其他add.()函数,21,printw() 函数系列,22,printw()例子,

9、#include /* ncurses.h 已经包含了stdio.h */ #include int main() char mesg=Just a string /* 将要被打印的字符串*/ int row,col /* 存储行号和列号的变量,用于指定光标位置*/ initscr() /* 进入curses 模式*/ getmaxyx(stdscr,row,col) /* 取得stdscr(标准输出设备)的行数和列数*/ mvprintw(row/2,(col - strlen(mesg)/2,%s,mesg) /*在屏幕的正中打印字符串mesg*/ mvprintw(row/2+1,0,T

10、his screen has %d rows and %d columnsn“,row,col) printw(Try resizing your window(if possible)and then run this program again) refresh() getch() endwin() return 0 ,23,清除屏幕函数,erase(void)在每个屏幕空白位置写上空白符 clear(void)清除整个屏幕,要配合refresh()使用,24,输入函数,输入函数也被分为三种: getch ()系列:读取一个字符的一类函数。 scanw()系列:按照格式化读取输入的一类函数

11、。 getstr()系列:读取字符串的一类函数。,25,scanw()系列函数,26,scanw例子,#include #include int main() char mesg=Enter a string: /* 将要被打印的字符串信息*/ char str80 int row,col /* 存储行号和列号的变量,用于指定光标位置*/ initscr() /* 进入curses 模式*/ getmaxyx(stdscr,row,col) /* 取得stdscr 的行数和列数*/ mvprintw(row/2,(col-strlen(mesg)/2,%s,mesg) /* 在屏幕的正中打印字

12、符串mesg */ scanw(“%s”,str); /* 将指针str 指向读取的字符串*/ mvprintw(2,0, You Entered: %s, str) getch() endwin() return 0 ,27,getstr(),功能说明:获取用户输入的字符串 原型:,int getstr (char *string);,getstr对它返回的字符串长度没有限制,所以在使用这个函数时必须多加小心,获取到的字符串,28,getnstr(),功能说明:获取用户输入的字符串 原型:,int getnstr (char *string, int number_of_string);,g

13、etnstr允许对读取的字符个数加以限制,获取到的字符串,界面允许用户输入的字符数,29,字符的属性2-1,每个curses字符都可以有特定的属性,属性控制着这个字符在屏幕上的显示方式,当然前提是显示设备硬件能够支持要求的属性,30,字符的属性2-2,31,字符属性操作函数,32,窗口机制,窗口(Window)机制是整个curses 系统的核心 可能需要将屏幕分成几个部分并分别处理,然而,将屏幕拆分成各个窗口,然后独立处理每个窗口是比较高效的方法,33,WINDOW结构,WINDOW结构通常定义在ncurses.h头文件里,对它的存取操作必须按照规定的指令进行,程序永远不允许直接访问它 标准屏

14、幕stdscr是WINDOW结构的一个特例,34,创建新窗口,功能说明:创建一个新窗口,窗口从屏幕位置(start_y,start_x)开始,尺寸由分别代表行数和列数的lines和cols参数指定 原型:,WINDOW *newwin(int lines,int cols, int strat_y,int start_x);,新窗口的行数,创建成功,返回一个指向新窗口的指针 创建失败,返回NULL,新窗口的列数,新窗口的屏幕位置,35,删除窗口,功能说明:删除一个通过newwin函数创建的 窗口 原型:,int delwin (WINDOW *window_to_delete);,要删除的窗口

15、,调用newwin的时候可能已经分配过内存,所以只要某个窗口不再需要使用,最好立刻删掉它,但千万不要去尝试删除curse自己的窗口stdscr和curscr!,36,给窗口加边框,功能说明:在已定义的窗口外围画上边框 原型:,int box(WINDOW *win,chtype verch,chtype horch);,要画边框的窗口,垂直方向所用字元,水平方向所用字元,37,创建新窗口示例,#include int main() initscr() /* 初始化,进入NCURSES 模式*/ WINDOW *local_win; local_win = newwin(5, 10, 2, 2)

16、; box(local_win, 0 , 0); wrefresh(local_win); /*刷新窗口缓冲,显示box */ wgetch(local_win) /* 等待用户输入*/ wclear(local_win);/*清空窗口内容*/ delwin(local_win);/*删除窗口*/ endwin() /* 退出NCURSES 模式*/ return 0 ,38,刷新窗口,wrefresh(WINDOW *)刷新指定窗口,同refresh() touchwin(WINDOW *)告诉curses,指定win发生变化,下次刷新时要刷新该窗口,39,彩色显示功能,ncurse和大多数

17、近期的curses实现都开始支持彩色显示功能 屏幕的每一个字符位置都可以从多种颜色里挑一种写上去,它的背景也可以从多种颜色里挑选 通过has_colors()函数来判断终端是否支持彩色显示功能,如果可以返回true,否则返回false,40,启动彩色机制,功能说明:对curses的彩色例程进行初始化 原型:,int start_color (void);,要启动彩色机制,必须先调用start_color()函数,之后就可以在终端屏幕上调用其它处理颜色的函数,41,初始化颜色组合,功能说明:对准备使用的颜色进行初始化 原型:,int init_pair (short pair_number,sh

18、ort foreground,short background);,颜色组合的索引,前景色,背景色,用下面的语句可以把绿色背景红色前景定义为第一号颜色组合 init_pair(1,COLOR_RED,COLOR_GREEN),42,curses定义的基本颜色,43,使用颜色对,功能说明:调用你已定义的颜色对 原型:,int COLOR_PAIR (int pair_number);,颜色对编号,如:attron(COLOR_PAIR(1);,44,颜色使用示例,#include /* ncurses.h 已经包含了stdio.h */ #include int main() initscr()

19、; /*启动curses 模式*/ if(has_colors() = FALSE) endwin(); exit(1); start_color(); /*启动color 机制*/ init_pair(1, COLOR_RED, COLOR_BLACK); attron(COLOR_PAIR(1); mvprintw(LINES / 2, 2, Viola ! In color .); attroff(COLOR_PAIR(1); getch(); endwin(); ,45,改变窗口前后背景色wbkgd,功能说明:用来改变窗口前后背景色 原型:,int wbkgd(WINDOW *win, chtype ch);,要获取的窗口,要改变颜色编号由COLOR_PARI(n)决定,46,键盘的工作方式,对工作模式进行设置的函数如下所示:,47,raw()和cbreak()的区别,通常情况下,终端驱动程序会缓冲用户输入的字符,直到遇到换行符或回车符后,这些字符才可以被使用。 raw()和cbreak()两个函数都可以禁止行缓冲(line buffering)。 在raw()函数模式下,处理挂起(CTRL+Z)、中断或退出(C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论