ncurse库的使用

合集下载

ncurses解读 -回复

ncurses解读 -回复

ncurses解读-回复什么是ncurses?ncurses是一个用于在终端上创建图形用户界面(GUI)的库。

它提供了一套函数和工具,可以让开发者创建基于文本的用户界面,以及处理键盘和鼠标输入。

ncurses最初是Unix系统下的一个文本模式终端驱动程序,但后来发展成为一个功能强大的库,适用于各种操作系统。

为什么选择使用ncurses?1. 跨平台:ncurses可在不同操作系统和终端类型上工作,包括Unix、Linux、macOS等系统,以及VT100、xterm、Microsoft Windows终端等不同类型的终端。

2. 简化开发:ncurses提供了一套抽象的界面,使开发者无需了解底层终端控制序列就能创建功能丰富的用户界面。

这包括在屏幕上显示文本、颜色和图形,处理键盘和鼠标输入等。

3. 功能丰富:ncurses提供了丰富的功能,例如文本框、按钮、菜单、滚动窗口、对话框等,使开发者能够创建功能强大的终端应用程序。

4. 自定义性强:ncurses允许开发者自定义界面的外观和行为。

可以设置颜色、字体、光标形状等,以及定义快捷键和动作,从而为用户提供个性化的操作体验。

如何使用ncurses创建用户界面?使用ncurses创建用户界面可以分为以下步骤:1. 初始化:在创建用户界面之前,我们需要初始化ncurses库。

这可以通过调用`initscr()`函数来完成。

它会初始化屏幕并返回一个指向`WINDOW`结构的指针,代表整个屏幕。

2. 设置界面选项:接下来,我们可以通过调用`start_color()`函数启用颜色选项。

这将使我们能够使用不同的颜色来装饰界面元素。

还可以通过调用`curs_set()`函数来设置光标的可见性,以及调用`keypad()`函数来启用终端上的特殊键盘输入。

3. 创建窗口:使用`WINDOW`结构提供的函数,可以在屏幕上创建不同大小和位置的窗口。

可以使用`newwin()`函数创建一个新窗口,并使用`wprintw()`函数在窗口中打印文本。

7.LinuxGUI编程-NCurses(二)

7.LinuxGUI编程-NCurses(二)

keypad示例2-2
While (key != ERR && key != „q‟){ move(7,5); clrtoeol(); if( (key >= „A‟ && key <=„Z‟) || (key>=„a‟ && key<=„z‟)){ printw(“key was %c”,(char)key); } else { switch(key){ case KEY_END: printw(“%s”,”END_KEY”);break; case KEY_LEFT:printw(“%s”,”LEFT KEY”);break; case KEY_F(1): printw(“%s”,”F1 Key”);break; } } refresh(); key = getch(); } endwin(); }
函数名 getpartyx(WINDOW*,int,int) 描述 用于取得子窗口相对主窗口的起始坐标
getbegyx(WINDOW*,int,int)
获得指定窗口的起始坐标
getmaxyx(WINDOW*,int,int) 获得指定窗口的结束坐标
屏幕转储
开发游戏的时候,通常存储和恢复屏幕是十分必要的。 scr_dump()函数可以把当前屏幕的内容存入指定文件,即以 文件名作为函数的参数(函数原型:scr_dump(const char *file))。
颜色组合的索引
前景色
背景色
用下面的语句可以把绿色背景红色前景定义 为第一号颜色组合 init_pair(1,COLOR_RED,COLOR_GREEN)
curses定义的基本颜色
名称
COLOR_BLACK COLOR_RED COLOR_GREEN COLOR_YELLOW 黑色 红色 绿色 黄色

ncurses函数的中文说明

ncurses函数的中文说明

ncurses函数的中文说明关于curses函数库中几个常用函数的中文说明Curses的由来为了因应网络上各式各样的终端类型,在UNIX上特别发展出一套函数库,专门用来处理UNIX上光标移动及屏幕的显示。

Curses最早是由柏克莱大学开发出来的,当时发展此函数库主要原因是为了提高程序对不同终端的兼容性。

利用Curses开发出来的程序是与终端无关的,这对于网络上的程序是一件相当重要的事。

Curses将所有终端的资料存放在一个资料库中,有了这些记录,Curses程序就能知道遇到的是哪一种终端。

Curses函数介绍下面介绍一些常用的Curses函数。

WINDOW *initscr(void)initscr()函数通常是Curses程序第一个调用函数,用于判断终端类型和初始化Curses数据结构,同时也对终端进行一次刷新以清除屏幕,为以后的操作做准备。

若执行时发生错误则在标准错误输出中输出错误信息并退出,正确执行就返回stdscr这一属于WINDOW类型的变量。

int endwin(void)每一个Curses程序在退出或要临时脱离Curses模式时都应调用endwin()函数。

调用这个函数将恢复tty终端原来的状态,把光标移到屏幕的左下角,重置终端为正确的非虚拟模式.bool has_colors(void)has_colors()例程无需参数。

若终端能产生彩色,则返回TRUE;否则返回FALSE。

程序员通过调用它去判断终端是否可以使用彩色。

int use_default_colors(void)use_default_colors例程是Curses库的一个扩展,它告诉Curses 库把终端设置为缺省的前景/背景,缺省时前景为白色,背景为黑色.成功设置返回OK,否则返回ERR,两者都是整型数值。

int init_pair(short pair, short f, short b)init_pair()例程用于更改一个彩色对的定义。

c 标准库 gui

c 标准库 gui

c 标准库 guiC标准库GUI。

GUI,全称为图形用户界面(Graphical User Interface),是一种通过图形方式显示计算机操作界面的技术。

在C标准库中,也提供了一些相关的GUI库,可以帮助开发者实现图形化的用户界面。

本文将介绍C标准库中常用的GUI库,以及它们的基本用法和特点。

一、ncurses。

ncurses是C语言中用于控制终端显示的库,它可以帮助开发者在终端中实现简单的文本界面。

ncurses提供了一系列的函数,可以控制光标位置、颜色、文本格式等,从而实现基本的用户界面交互。

开发者可以使用ncurses创建菜单、窗口、按钮等控件,实现基本的文本界面交互。

使用ncurses编写GUI程序的基本步骤如下:1. 初始化ncurses环境,使用initscr函数初始化终端。

2. 创建需要的窗口和控件,使用函数如newwin、wprintw等。

3. 处理用户输入,使用函数如getch获取用户输入。

4. 刷新界面,使用函数如wrefresh刷新窗口显示。

ncurses库的优点是简单易用,适合在终端环境中实现基本的文本界面交互。

但是它的功能有限,无法实现复杂的图形界面,也无法支持鼠标交互。

二、GTK+。

GTK+是一种跨平台的图形用户界面工具包,它提供了丰富的控件和功能,可以帮助开发者实现复杂的图形界面。

GTK+使用C语言编写,提供了一系列的函数和对象,可以创建窗口、按钮、菜单等各种控件,实现丰富多彩的用户界面交互。

使用GTK+编写GUI程序的基本步骤如下:1. 初始化GTK+环境,使用函数gtk_init初始化GTK+库。

2. 创建主窗口和其他控件,使用函数gtk_window_new、gtk_button_new等。

3. 设置控件属性和信号处理函数,使用函数gtk_widget_set_property、g_signal_connect等。

4. 运行主循环,使用函数gtk_main运行GTK+的主循环。

ncurses 手册

ncurses 手册

NCurses 是一个用于编写文本用户界面(TUI)的库。

它提供了一组函数和宏,用于在终端上创建窗口、按钮、菜单和其他常见的GUI 元素。

NCurses 手册是一个详细的文档,包含了NCurses 库的所有函数、数据类型、宏和选项的说明。

它提供了每个函数的使用方法、参数说明、返回值以及相关的示例代码。

要查看NCurses 手册,您可以在终端中使用以下命令:这将打开NCurses 手册的在线版本。

您可以使用箭头键和Page Up/Page Down 键来浏览手册,使用Q 键退出手册。

如果您无法访问在线手册,您还可以下载NCurses 手册的PDF 或其他格式的文档。

您可以在NCurses 的官方网站或其他文档下载网站上找到这些文档。

ncurse库常用函数使用

ncurse库常用函数使用

ncurse库常用函数使用□ initscr()initscr() 是一般 curses 程式必须先呼叫的函数, 一但这个函数被呼叫之後, 系统将根据终端机的形态并启动 curses 模式.□ endwin()curses 通常以呼叫endwin() 来结束程式. endwin() 可用来关闭curses 模式, 或是暂时的跳离curses 模式.如果您在程式中须要call shell ( 如呼叫system() 函式 ) 或是需要做 system call, 就必须先以endwin()暂时跳离curses模式. 最後再以 wrefresh() doupdate() 来重返 curses 模式.□ cbreak()nocbreak()当 cbreak模式被开启後, 除了 DELETE 或 CTRL 等仍被视为特殊控制字元外一切输入的字元将立刻被一一读取.当处於nocbreak 模式时, 从键盘输入的字元将被储存在buffer 里直到输入RETURN 或NEWLINE. 在较旧版的 curses 须呼叫crmode(),nocrmode() 来取代 cbreak(),nocbreak()□ nl()nonl()用来决定当输入资料时, 按下 RETURN 键是否被对应为 NEWLINE 字元 ( 如 \ ). 而输出资料时, NEWLINE 字元是否被对应为 RETURN 和LINDFEED 系统预设是开启的.□ echo()noecho()此函式用来控制从键盘输入字元时是否将字元显示在终端机上. 系统预设是开启的.□ intrflush(win,bf)呼叫 intrflush 时须传入两个值:win 为一 WINDOW 型态指标, 通常传入标准输出入萤幕 stdscr 为 TRUE 或 FALSEbf当 bf 为 true 时, 当输入中断字元 ( 如 break) 时, 中断的反应将较为快速. 但可能会造成萤幕的错乱.□ keypad(win,bf)呼叫 keypad 时须传入两个值:win 为一 WINDOW 型态指标, 通常传入标准输出入萤幕 stdscr bf 为 TRUE 或 FALSE当开启keypad 後, 可以使用键盘上的一些特殊字元, 如上下左右等方向键, curses 会将这些特殊字元转换成 curses.h 内定义的一些特殊键. 这些定义的特殊键通常以 KEY_ 开头.□ refresh()refresh() 为 curses 最常呼叫的一个函式.curses 为了使萤幕输出入达最佳化, 当您呼叫萤幕输出函式企图改变萤幕上的画面时, curses 并不会立刻对萤幕做改变, 而是等到变萤幕上的画面时, curses 并不会立刻对萤幕做改变, 而是等到refresh() 呼叫後, 才将刚才所做的变动一次完成. 其余的资料将维持不变. 以尽可能送最少的字元至萤幕上. 减少萤幕重绘的时间.如果是 initscr() 後第一次呼叫 refresh(), curses 将做清除萤幕的工作.■ 游标的控制move(y,x) 将游标移动至 x,y 的位置getyx(win,y,x) 得到目前游标的位置(请注意! 是 y,x 而不是 &y,&x )■ 有关清除萤幕的函式clear()erase() 将整个萤幕清除(请注意配合 refresh() 使用)■ 如何在萤幕上显示字元显示某个字元echochar(ch)显示某个字元addch(ch)mvaddch(y,x,ch) 在(x,y) 上显示某个字元相当於呼叫move(y,x);addch(ch)显示一串字串addstr(str)mvaddstr(y,x,str) 在(x,y) 上显示一串字串相当於呼叫move(y,x);addstr(str) printw(format,str) 类似 printf() , 以一定的格式输出至萤幕mvprintw(y,x,format,str) 在(x,y) 位置上做 printw 的工作.相当於呼叫 move(y,x); printw(format,str)■ 如何从键盘上读取字元从键盘读取一个字元 (注意! 传回的是整数值)getch()从键盘读取一串字元getstr()scanw(format,&arg1,&arg2...) 如同 scanf, 从键盘读取一串字元范例:int ch;char st ring1[80]; /* 请注意! 不可宣告为 char *string1; */char string2[80];开启 echo 模式, 使输入立刻显示在萤幕上 */echo(); /*ch=getch();string1=getstr();scanw("%s",string2);mvprintw(10,10,"String1=%s",string1);mvprintw(11,10,"String2=%s",string2);■ 如何利用方向键curses 将一些如方向键等特殊控制字元, 以KEY_ 为开头定义在curses.h 这个档案里头, 如 KEY_UP 即代表方向键的" ↑ ". 但, 如果您想使用 curses.h 所为您定义的这些特殊键的话, 您就必须将 keypad 设定为TRUE. 否则, 您就必须自己为所有的特殊键定义了.curses.h 为一些特殊键的定义如下:↑KEY_UP 0403KEY_DOWN 0402 ↓KEY_LEFT 0404 ←KEY_RIGHT 0405 →KEY_HOME 0406 Home key (upward+left arrow)KEY_BACKSPACE 0407 backspace (unreliable)KEY_F0 0410 Function keys.KEY_F0+(n)) Formula for f .KEY_F(n) (KEY_NPAGE 0522 Next pageKEY_PPAGE 0523 Previous page以上仅列出笔者较常使用的一些控制键, 至於其他控制键的定义, 请自行参阅 man curses (* 注三)一并为您列出其他常用的一些特殊字元[TAB] /t[ENTER] /r[ESC] 27[BACKSPACE] 127■ 如何改变萤幕显示字元的属性为了使输出的萤幕画面更为生动美丽, 我们常须要在萤幕上做一些如反白, 闪烁等变化. curses 定义了一些特殊的属性, 透过这些定义, 我们也可以在 curses 程式里控制萤幕的输出变化.attron(mod) 开启属性attroff(mod) 关闭属性curses.h 里头定义了一些属性, 如:A_UNDERLINE 加底线反白A_REVERSEA_BLINK 闪烁高亮度A_BOLD标准模式 (只能配合 attrset() 使用)A_NORMAL当使用 attron() 开启某一种特殊属性模式後, 接下来在萤幕的输出都会以该种属性出现. 直到您呼叫 attroff() 将此模式关闭.请注意, 当您欲 attron() 开启另一种属性时, 请记得利用 attroff()先关闭原来的属性, 或直接以 attrset(A_NORMAL) 将所有特殊属性关闭.否则,curses 会将两种属性做重叠处理.范例:先将属性设定为正常模式 */ attrset(A_NORMAL); /*加底线 */ attron(A_UNDERLINE); /*mvaddstr(9,10,"加底线"); /* 加底线输出一串字元 */关闭加底线模式, 恢复正常模式 */ attroff(A_UNDERLINE); /*开启反白模式 */attron(A_REVERSE); /*mvaddstr(10,10,"反白"); /* 输出一串反白字元 */关闭反白模式, 恢复正常模式 */attroff(A_REVERSE); /*开启闪烁模式 */ attron(A_BLINK); /*mvaddstr(11,10,"闪烁"); /* 输出一串闪烁字元 */关闭闪烁模式, 恢复正常模式 */attroff(A_BLINK); /*开启高亮度模式 */ attron(A_BOLD); /*mvaddstr(12,10,"高亮度"); /* 输出一串高亮度字元 */关闭高亮度模式, 恢复正常模式 */attroff(A_BOLD); /*■ 其他常用的一些函式发出一声哔声beep()box(win,ch1,ch2) 自动画方框 ch1: 画方框时垂直方向所用字元ch2: 画方框时水平方向所用字元-'); 将以 | 及 - 围成一个方框example: box(stdscr,'|','。

NCURSES库及其简单使用方法

NCURSES库及其简单使用方法

NCURSES库及其简单使用方法1、介绍在那个广泛使用电传打字机的年代,电传打字机作为中央电脑的输出终端,通过电缆和中央电脑连接。

用户要向终端程序发送一系列特定的控制命令,才可以控制终端屏幕的输出。

比如要在改变光标在屏幕上的位置,清除屏幕某一区域的内容,卷动屏幕,切换显示模式,给文字添加下划线,改变字符的外观、颜色、亮度等等。

这些控制都是通过一种叫做转义序列(escape sequence)的字符串实现的。

被叫做转义序列是因为这些连续字节都是以一个"0x1B"字符,即转义字符(按下ESC键所输入的字符)作为字符串的开头。

即使在现在,我们也可以通过向终端仿真程序输入转义序列得到与当年电传打字终端同样的输出效果。

如果你想在终端(或者终端仿真程序)屏幕输出一段背景是彩色的文字,可以将以下这段转义序列输入到你的命令行提示符:echo "^[[0;31;40mIn Color"在这里 "^[" 就是所谓的转义字符。

(注意:在这里 "^[" 是一个字符。

不是依次键入"^"和"["字符。

要打印出这个字符,你必须先按下Ctrl+V,然后按下ESC 键。

)执行以上的命令后。

你应该可以看见"In Color"的背景变为红色了。

从此以后显示的文本信息都是以这样的方式输出的。

如果想终止这种方式并回到原来的显示方式可以使用以下的命令:echo "^[[0;37;40m"现在知道这些字符(转移序列)的作用了吗?(译者注:更改分号之间的参数,看看会有什么结果。

)也许会和自己想像的不一样?可能是因为终端环境不同,终端环境取决于终端或操作系统的不同。

(译者注:你不可能让一个黑白终端显示出彩色字符吧?)为了避免这种不兼容情况,能够在不同的终端上输出统一的结果。

UNIX的设计者发明了一种叫做 termcap的机制。

c语言 ncurses编程

c语言 ncurses编程
30
字符的属性2-2
普通字符输出 终端字符最亮 下划线 字符反白显示 闪动显示 加亮加粗 保护模式 空白显示模式 半亮显示 字符掩盖 字符交替
描述
函数名 attron(chtype attribute) attroff(chtype attribute) attrset(chtype attribute) standend() standout()
在指定窗口的当前坐标处,格式化输出内容
mvwprintw(WINDOW*, int y, 在指定窗口的指定坐标处,格式化输出内容 int x,char *format,…)
21
printw()例子
#include <ncurses.h> /* ncurses.h 已经包含了stdio.h */ #include <string.h> int main() {
9
curses模式初始化
initscr()函数将终端屏幕初始化为curses 模式 它用来清除屏幕上所有的字符,并等待下一步处理。 在调用其它的curses 函数前,要先调initscr()函数初始化
屏幕。 initscr()初始化了curses 系统并且为当前屏幕(也就是
“stdscr”)和相关的数据结构分配内存
refresh();
/* 将虚拟屏幕上的内容写到显示器 上,并刷新*/
getch();
/* 等待用户输入*/
endwin();
/* 退出NCURSES 模式*/
return 0;
}
4
编译包含NCURSES 库函数的程序
如果要调用ncurses 库中的函数,你必须在代码 中加载ncurses.h 文件,就是要在C 或C++程序开 头添加“#include <ncurses.h>”,然后在链接时 标记lncurses参数。(注:ncurses 库已经包含 “stdio.h”)

dialog+ncurse实现命令行带提醒功能计时器

dialog+ncurse实现命令行带提醒功能计时器

dialog+ncurse实现命令行带提醒功能计时器你还在担心错过重要的事情嘛,你还在郁闷因为错过了几十秒而没抢到某米手机嘛,那就来diy一个带提醒的高大上的定时器吧。

我们将那个结合shell编程与C语言编程使用dialog工具与ncurses库实现一个仿tmux时间风格的带提醒功能的计时器一、说明这次项目课要实现的东西功能很简单,但是却用到了好几个东西,包括dialog,ncurses库,zenity, moc,用了这么多东西最后也就是个定时器-_-||。

不过我想先告诉你的是为什么是它。

这原因呢有两个,一个是之前看到有用户反应希望项目课有一些综合性稍强的内容,这个项目课就是了,结合了shell编程和C语言编程,C语言编程除了包含本身的内容还涉及到了如何使用外部库来实现我们想要的功能;这第二个原因是,我自己需要一个这样的定时器啊,我要每周二中午12点的时候准时抢小米手机(抢了几次没抢到啊,就是因为时间没掐准,不够快),所以就想要一个定时器了,我想的是除了要实现基本功能外还要求“看起来,高大上”。

二、功能介绍既然我是要实现一个命令行的定时器,要想“高大上”,那就必须要用到命令行的图形库了,一开始想到的是ncurses,这就得完全用C语言来开发了,后来又想到可以用shell下的dialog(基于ncurses实现的命令行图形对话框,包含一些常用的构件)来完成一部分功能,比如设定时间的界面可以用dialog的timebox构件来实现,如下图本想是不是可以用dislog实现全部我想要的效果,比如在设定时间之后,进入倒计时界面,类似下面的效果这实际是tmux内建时钟效果。

然后翻翻dialog的文档,发现连字体大小都没法设置,也无法设置构件内文本的显示位置,那就没办法了,不过 dislog底层就是基于ncurses来实现的,我也就用ncurses来实现倒计时显示的这个功能吧。

最后实现的效果如下,是不是山寨得跟原版(tmux, ctrl+b t)一样。

ncurses原理

ncurses原理

ncurses原理ncurses是一种用于编写文本用户界面(TUI)的库,它提供了一系列函数和数据结构,用于在终端窗口中创建、显示和控制文本界面。

它可以在各种UNIX和类UNIX系统上使用,包括Linux和macOS。

ncurses的原理是通过处理终端特性和控制字符来实现界面的绘制和交互。

每个终端都有自己特定的特性和控制字符,ncurses库通过定义和使用抽象的终端独立特性和控制字符来屏蔽这些差异,使开发者能够编写与终端无关的界面应用程序。

在ncurses中,界面被划分为一个个的窗口,每个窗口可以独立操作和管理。

通过指定窗口的位置、大小和属性,开发者可以在终端中创建多个窗口,并在窗口内部绘制文本、图形和其他可视元素。

ncurses提供了一系列函数来操作窗口,包括窗口的创建、删除、移动、刷新等。

为了能够在终端中显示文本和图形,ncurses库提供了一套字符绘制函数。

开发者可以使用这些函数在窗口中绘制字符、字符串和特殊符号。

ncurses还支持设置字符颜色、背景色和特殊属性,以实现更丰富的界面效果。

除了绘制界面,ncurses还提供了一套输入处理函数。

开发者可以使用这些函数来捕获和处理用户的键盘输入。

ncurses通过将终端设置为非标准模式,并使用非阻塞式的输入读取方式,实现了对用户输入的实时响应。

ncurses还提供了一些高级功能,如窗口缓冲、滚动、分页、菜单等。

通过这些功能,开发者可以实现更复杂的界面交互和操作。

使用ncurses库编写TUI应用程序的一般步骤如下:1. 初始化ncurses库,包括对终端特性的初始化和创建主窗口。

2. 创建和设置其他子窗口,定义其位置、大小和属性。

3. 在窗口中使用绘制函数绘制文本、图形和其他可视元素。

4. 使用输入处理函数捕获和处理用户的键盘输入。

5. 刷新窗口,将绘制的内容显示在终端上。

6. 清理并退出ncurses库。

ncurses库的原理和功能使得开发者能够方便地创建和控制文本界面应用程序。

Linux下Ncurses显示中文乱码怎么办?

Linux下Ncurses显示中文乱码怎么办?

Linux下Ncurses显示中文乱码怎么办?导读:Ncurses是程序库,使用最多的组件是窗体,在Linux系统操作中,不少朋友使用Ncurses的时候遇到中文乱码问题,遇到该问题要如何处理呢?下面小编就给大家介绍下Linux使用Ncurses时出现中文乱码的解决方法。

有几个关键点:1.gcc编译时用,gcc -lncursesw --verbose查看是否支持-lncursesw连接;2.代码文件里面,设置locale#include#includeint main(int argc,char const *argv[]){setlocale(LC_ALL,“”);initscr();noecho();refresh();printw(“我来测试中文的/n”);getchar();return 0;}3.命令行执行apt-cache search libncursesw5,查看是否安装ncurses库发现我的linux不支持;在/usr/include/下发现有ncurses.h但是,没有别人说的ncursesw目录;后来发现,我装了libncurses5,也装了libncursesw5,导致-lncursesw选项不能用,我就把libncurses5卸载了,然后再重新装libncursesw5;具体命令是1. apt-cache search libncurses52. apt-get purge libncurses53. sudo apt-get purge libncurses5-dbg4. sudo apt-get purge libncurses5-dev5. sudo apt-get autoremove6. sudo apt-get clean7. dpkg -l |grep ^rc|awk ‘{print $2}’ |xargs dpkg -P接着再安装libncursesw5,命令如下1. sudo apt-get install libncursesw52. sudo apt-get install libncursesw5-dbg3. sudo apt-get install libncursesw5-dev然后gcc -c test.o test.cgcc -o test test.o -lncursesw接着运行。

libcares用法

libcares用法

libcares是一个用于处理DNS查找的库。

以下是libcares的基本用法:
1.初始化库:在开始使用libcares之前,需要先初始化库。

可以通过调用
ares_library_init()函数来完成。

该函数会初始化库并设置一些默认值。

2.设置选项:可以根据需要设置库的选项。

可以使用ares_set_option()函数来设置选
项。

该函数接受两个参数:一个表示选项的名称,另一个表示选项的值。

3.创建会话:使用ares_create_ctx()函数创建一个新的DNS查找会话。

该函数接受一
个参数,用于指定会话的选项。

4.执行查找:使用ares_search()函数执行DNS查找操作。

该函数接受两个参数:一个
表示要查找的域名,另一个表示要使用的DNS服务器。

5.处理结果:当查找操作完成后,可以通过ares_get_result()函数获取查找结果。

该函
数返回一个ares_result结构体,其中包含查找结果的相关信息,如IP地址、主机名等。

6.清理资源:在完成查找操作后,需要清理资源以避免内存泄漏。

可以使用
ares_destroy_ctx()函数来销毁会话。

以上是libcares的基本用法。

具体的使用方式可能会因库的版本和操作系统而有所不同,建议参考官方文档或相关资料以获得更详细的信息。

CURSES函数简要参考

CURSES函数简要参考

NCURSES 函数简要参考BenBear目录说明简介初始化与结束基本输入、输出函数预览函数命名、参数习惯getch()窗口WINDOW颜色Panel、Menus 和Forms其它参考资料说明在这里写下对NCURSES 库使用的经验,希望对你有用。

由于条件的不足,我只是在WMware Workstation 4.0.5 里安装的Debian Linux 3.0 r2 下使用过NCURSES,所以这里所说的片面性在所难免,还请细查。

如有问题,你可以给我发邮件:cxj1024@。

简介NCURSES 是Linux 下进行终端界面开发的库,其功能相当强大。

它以WINDOW(窗口)为基本要素,在此基础上支持Panel、Memus 及Forms 等更加强大的元素。

更多的信息请参考资料。

初始化与结束当然了,为了使用NCURSES 库,你应该#include <curses.h>,在编译时,应该加上-lncurses。

在使用NCURSES 库前,必须先行初始化;用完后必须结束,否则终端可能会不正常。

初始化是一系列的动作,内容有关功能键、输入回显、换行符、颜色等。

一般地,第一个函数调用必须是initscr()。

这个函数初始化终端,然后清屏。

它的参数为空,返回值一般也不用管。

它会初始化一个叫stdscr 的变量,stdscr 有点像stdin 或stdout 的地位,它是NCURSES 默认的窗口。

紧接着initscr() 的应该是其它初始化,下面一一介绍。

即时按键。

raw() 和cbreak() 两个函数都是用来关闭行缓冲以使按键可以马上被程序处理的。

只是cbreak() 可以在按Ctrl-C 的时候退出程序,我一般用这个。

两个函数都无参数。

使用功能键。

keypad() 可以用来打开一个窗口的功能键,从来使程序可以识别F1、F2、Up、Down 等这样的按键。

一般用keypad (stdscr, TRUE) 来打开stdscr 的这项功能。

ncurses 函数

ncurses 函数

ncurses 函数ncurses函数是一种用于控制终端屏幕显示的库函数,在Linux系统中被广泛应用于开发命令行界面程序。

本文将介绍ncurses函数的基本使用方法和一些常见的应用场景。

一、ncurses函数的基本概念和使用方法1. 初始化屏幕在使用ncurses函数前,需要先调用initscr()函数来初始化屏幕。

这个函数会清空屏幕并分配一些内存用于存储屏幕缓冲区。

在程序结束时,需要调用endwin()函数来释放这些内存。

2. 控制光标位置使用move(row, col)函数可以将光标移动到指定的行和列,其中行和列的编号从0开始。

可以使用getmaxyx(stdscr, maxrow, maxcol)函数获取屏幕的行数和列数。

3. 输出文本使用printw(format, ...)函数可以在当前光标位置输出文本。

其中format参数用于指定输出的格式,可以包含占位符和格式化字符串。

可以使用mvprintw(row, col, format, ...)函数在指定位置输出文本。

4. 获取用户输入使用getch()函数可以从终端读取用户输入的一个字符。

可以使用keypad(stdscr, TRUE)函数打开功能键模式,使得可以读取特殊按键(如方向键、回车键等)的输入。

5. 清空屏幕使用clear()函数可以清空屏幕上的所有内容。

使用refresh()函数可以将屏幕缓冲区中的内容刷新到实际屏幕上。

二、ncurses函数的常见应用场景1. 文本编辑器通过使用ncurses函数,可以在终端中实现一个简单的文本编辑器。

可以使用move()函数控制光标位置,使用printw()函数输出文本,使用getch()函数读取用户输入,以及使用clear()和refresh()函数来清空和刷新屏幕。

2. 游戏开发ncurses函数可以用于开发终端中的文字游戏。

可以使用move()函数和printw()函数来输出游戏地图和角色信息,使用getch()函数来读取用户的操作输入,以及使用clear()和refresh()函数来更新屏幕内容。

c语言 ncurses编程

c语言 ncurses编程
int getnstr (char *string, int number_of_string);
获取到的字符串
界面允许用户输入的 字符数
getnstr允许对读取的字符个数加以限制
28
字符的属性2-1 字符的属性
每个curses字符都可以有特定的属性, 每个curses字符都可以有特定的属性,属性控制 curses字符都可以有特定的属性 着这个字符在屏幕上的显示方式, 着这个字符在屏幕上的显示方式,当然前提是显 示设备硬件能够支持要求的属性
新位置的y 新位置的y坐标
新位置的x 新位置的x坐标
如果我们想让光标位置在调用move函数后立刻发生变化,就必 须在它的后面立刻跟上一个refresh()调用。 。
ห้องสมุดไป่ตู้16
输出函数
在curses 函数中有三类输出函数,它们分别是:
addch()系列:将单一的字符打印到屏幕上,可以附加 加字符修饰参数的一类函数。 printw()系列:和printf()一样的具有格式化输出的一类 函数。 addstr()系列:打印字符串的一类函数。
第九章
Linux ncurses编程 编程2-1 编程
1
本章目标
Curses函数库的工作原理、使用方法 函数库的工作原理、 函数库的工作原理 Curses函数库输入输出 函数库输入输出 字符属性 Curses创建窗口 创建窗口
curses 简介
curses 的命名是来自一个叫做“cursor optimization " (光标最优化)的双关语。curses 构成了一个工作在底层终端代码之上的封装,并 向用户提供了一个灵活高效的API ( Application Programming Interface 应用程序接口)。 curses提供了移动光标,建立窗口,产生颜色, 处理鼠标操作等功能。

ncurses解读 -回复

ncurses解读 -回复

ncurses解读-回复【ncurses解读】以中括号内的内容为主题,写一篇1500-2000字文章,一步一步回答。

第一步:理解ncurses是什么ncurses是一个开源的、跨平台的终端窗口管理库,用于在命令行界面上创建交互式的图形化程序。

它提供了用于构建文本用户界面(TUI)的API,并支持多种操作系统,如Linux、Unix和Windows。

第二步:ncurses的历史和发展ncurses最早是在20世纪80年代初由Eric S. Raymond开发的兼容性终端控制库的一部分。

随着时间的推移,并由于开源社区的积极贡献,ncurses逐渐发展成了一个功能丰富且稳定的库,并迅速成为Unix-like 操作系统上开发终端应用程序的首选方案。

第三步:ncurses的特点和优势1. 跨平台性:ncurses支持多种操作系统,包括Linux、Unix和Windows 等。

2. 可移植性:ncurses采用了抽象层面的API,使得开发者可以编写与特定终端无关的代码,从而实现对各种终端的兼容性。

3. 支持多线程:ncurses库可以在多线程环境下安全使用,这使得同时处理多个终端窗口成为可能。

4. 功能丰富:ncurses提供了大量的API函数,可以进行文本、图形和输入输出的处理,包括文本样式设置、光标控制、窗口划分、用户输入响应等。

5. 支持全面:ncurses可以对终端进行高度定制,包括窗口布局、颜色配置和键盘映射等。

6. 开源社区支持:ncurses拥有一个活跃的开源社区,提供了持续的更新和维护,以解决各种问题和改进。

第四步:ncurses常用函数介绍1. initscr():初始化标准窗口并进入curses模式。

2. endwin():退出curses模式并还原终端设置。

3. printw():在当前光标位置打印字符串。

4. mvprintw():在指定坐标位置打印字符串。

5. refresh():刷新窗口以显示最新更改。

Ncurses简介

Ncurses简介

Ncurses是一个能提供功能键定义(快捷键),屏幕绘制以及基于文本终端的图形互动功能的动态库什么是Ncurses您希望您的程序有一个彩色的界面吗Ncurses是一个能提供基于文本终端窗口功能的动态库. Ncurses可以:•只要您喜欢,您可以使用整个屏幕•创建和管理一个窗口•使用8种不同的彩色•为您的程序提供鼠标支持•使用键盘上的功能键Ncurses可以在任何遵循ANSI/POSIX标准的UNIX系统上运行,除此之外,它还可以从系统数据库中检测终端的属性, 并且自动进行调整,提供一个不受终端约束的接口.因此,Ncurses可以在不同的系统平台和不同的终端上工作的非常好.mc工具集就是一个用ncurses写的很好的例子,而且在终端上系统核心配置的界面同样是用ncurses编写的. 下面就是它们的截图:哪里可以下载Ncurses是基于GNU/Linux发展的,请访问以获得最新的更新版本或者其他详细信息以及相关链接 . 基础知识为了能够使用ncurses库,您必须在您的源程序中将包括(include)进来,而且在编译的需要与它连接起来. 在gcc中您可以使用参数-lcurses进行编译.在使用ncurses的时候,您有必要了解它的基础数据结构.它有一个WINDOW结构,从名字就很容易知道,它是用来描述您创建的窗体的,所有ncurse库中的函数都带有一个WINDOW指针参数.在ncurses中使用最多的组件是窗体.即使您没有创建自己的窗体,当前屏幕会认为是您自己的窗体. 如同标准输入输出系统提供给屏幕的文件描述符stdout一样(假设没有管道转向),ncurses提供一个WINDOW指针stdscr做相同工作.除了stdscr外,ncurses还定义了一个WINDOW指针curscr. 和stdscr描述当前屏幕一样,curscr描述当前在库中定义的屏幕,您可以带着"他们有什么区别"这个问题继续阅读.为了在您的程序中使用ncurses的函数和变量,您必须首先调用initscr函数(初始化工作),它会给一些变量比如stdscr,curscr等分配内存,并且让ncurses库处于准备使用状态,换句话说,所有ncurses函数必须跟在initscr后面. 同样的约定,您在结束使用ncurses后,应该使用endwin来释放所有ncurses使用的内存.在使用endwin后,您将不能在使用任何ncurses的函数,除非您再一次调用initscr函数.在initscr和endwin之间,请不要使用标准输入输出库的函数输出结果到屏幕上,否则,您会看到屏幕会被您的输出弄的乱七八糟,这可不是您期望的结果.当ncurses处在激活状态时,请使用它自己的函数来把结果输出到屏幕.在调用initscr之前或者endwin之后,您就可以随便使用了.刷新屏幕:refreshWINDOW结构不会经常保持同一高度宽度以及在窗体中的位置,但是会保持在窗体中的内容.当您向窗体写入数据时, 会改变窗体中的内容,但并不意味着在屏幕中会立即显示出来,要更新屏幕内容,必须调用refresh或者wrefres函数.这里介绍了stdscr和curscr两者之间的区别.curscr保存着当前屏幕的内容,在调用ncurse的输出函数后,stdscr和curscr可能会有不同的内容, 如果您想在最近一次屏幕内容改变后让stdscr和curscr保持一致,您必须使用refresh函数.换句话说, refresh是唯一一个处理curscr的函数.千万不要弄混淆了curscr和stdscr,应该在refresh函数中更新curscr中的内容refresh有一个能尽可能快的更新屏幕的机制,当调用refresh时,它只更新窗体中内容改变的行,这节省了CPU的处理时间,防止程序往屏幕上写相同的信息(译者注:在屏幕的同一位置不用重新显示同样的内容.)这种机制就是为什么同时使用ncurses的函数和标准的输入输出函数会造成屏幕内容错位的原因.当调用ncurses的输出函数时,它会设置一个标志,能让refresh 知道是哪一行改变了.但是您调用标准输入输出函数时,就不会产生这种结果.refresh和wrefresh其实做了同样的事情.wrefresh需要一个WINDOW的指针参数,它仅仅刷新该窗体的内容. refresh()等同于wrefresh(stdscr).我在后面会提到,和wrefresh一样,ncursers的许多函数都有许多这种为stdscr定义的宏函数.定义一个新的窗体下面我们来谈谈能定义新窗体的subwin和newwin函数.他们都需要一个来定义新窗体的高度,宽度以及左上角位置的参数,并且返回一个WINDOW指针来指向该窗体.您可以使用它来作为wrefresh的参数或者一些其他我将要谈到的函数.您可能会问:"如果他们做同样的事情,为什么要有两个函数",您是对的,他们之间有一些细微的差别.subwin创建一个窗体的子窗体,它将继承了父窗体的所有属性.但如果在子窗体中改变了这些属性的值,它将不会影响父窗体.除此之外,父窗体和子窗体之间还有一些联系.父窗体和子窗体中的内容将彼此共享,彼此影响.换句话说, 在父窗口和子窗体重叠的区域的字符会被任意一个窗体改变.如果父窗体写入了数据到这块区域,子窗体中这块区域同样改变了,反之也是如此.和subwin不同的是,newwin创建一个独有的窗体.这样的窗体,在没有他们的子窗体之前,是不会和其他窗体共享任何文本数据的.使用subwin的好处是可以使用较少的内存就可以方便的共享字符数据了.但是如果您担心窗体数据会互相影响那么就应该使用newwin.您可以创建任意多层的子窗体,每一个子窗体又可以有它自己的子窗体,但是一定要记住,窗体的字符内容是被两个以上的窗体共享的.当您调用完您定义的窗体后,您可以使用delwin函数来删除该窗体.我建议您使用man pages来得到这些函数的详细参数.向窗体写数据和从窗体读数据我们谈到了stdscr,curscr,以及刷新屏幕和定义一个新窗体,但是我们怎样向一个窗体写入数据我们怎样从一个窗体中读入数据实现以上目的函数如同标准输入输出库中的一些函数一样,我们使用printw来替换printf输出内容,scanw替换scanf接受输入, addch替换putc或者putchar,getch替换getc或者getchar.他们用法一样,仅仅名字不同,类似的,addstr可以用来向窗体写入一个字符串,getstr用来从窗体中读入一个字符串.所有这些函数都是以一个"w"字母开头,后面再跟上函数的字, 如果需要操作另外一个窗体内容,第一个参数必须是该窗体的WINDOWS结构指针,举个例子,printw(...)和wprintw(stdscr,...) 是相同的,就如同refresh()和wrefresh(stdscr)一样.如果要写这些函数的详细说明,这篇文章将会变的很长.要得到他们的述,原型以及返回值或者其他信息,man pages是一个不错的选择. 我建议您对照man pages检查您使用的一个函数.他们提供了详细和非常有用的信息.在这篇文章的最后一节,我提供了一个示例程序,可以当作是一个ncurses函数的使用指南.物理指针和逻辑指针在讲完写入数据和从窗体读出数据后,我们需要解释一下物理指针和逻辑指针物理指针是一个常用指针,它只有一个,从另一个方面讲,逻辑指针属于ncurses窗体, 每一个窗体都只有一个物理指针,但是他们可以有多个逻辑指针.当窗体准备写入和读出的时候,逻辑指针会指向窗体中将要进行操作的区域.因此, 通过移动逻辑指针,您可以任何时候向窗体中的任意位置写入数据.这个是区别与标准输入输出库的优势之处.移动逻辑指针的函数是move或者另外一个您非常容易猜出来的函数是wmove的一个宏函数,专门用来处理stdscr的.另外一个需要确认的是物理指针和逻辑指针的协作关系,物理指针的位置将会在一段写入程序后无效,但是我们通过可以通过WINDOW结构的_leave标志定位它.如果设置了_leave标志,在写操作结束后,逻辑指针将会移动到物理指针指向窗体中最后写入的区域. 如果没有设置_leave位,在写操作结束后,物理指针将返回到逻辑指针指向窗体的第一个字符写入位置._leave标志是由leaveok函数控制的.移动物理指针的函数是mvcur,不象其他的函数,mvcur在不用等待refresh动作就会立即生效.如果您想隐藏物理指针, 您可以使用curs_set函数,使用man pages来获得详细信息.同样存在一些宏函数简化了上述的移动和写入等函数.您可以在addch,addstr,printw,getch,getstr,scanw等函数的man pages页得到更多的解释.清除窗体当我们向窗体写完内容后,我们怎么样清除窗体,行和字符在ncurses中,清除意味着用空白字符填充整块区域,整行或者整个窗体的内容. 下面我介绍的函数将会使用空白字符填充必要的区域,达到我们清屏的目的.首先我们谈到能清楚字符和行的函数,delch和wdelch能删除掉窗体逻辑指针指向的字符,下一个字符和一直到行末的字符都会左移一个位置.deleteln和wdeleteln能删除掉逻辑指针指向的行,并且上移下一行.clrteol和wclrtoeol能清除掉从逻辑指针指向位置右边字符开始到行末的所有字符.clrtbot和wclrtobot 首先清除掉从逻辑指针所在位置右边字符开始到行末的所有字符,接着删除下面所有行.除了这些,还有一些函数能清除整个屏幕和窗体.有两种方法可以清除掉整个屏幕.第一个是先用空白字符填充屏幕所有区域,然后再调用refresh函数.另外一种方法是用固定的终端控制字符清除.第一种方法比较慢,因为它需要重写当前屏幕.第二种能迅速清除整个屏幕内容.erase和werase用空白字符替换窗体的文本字符,在下一次调用refresh后屏幕内容将会被清除掉.但是如果窗体需要清掉整个屏幕, 这将一个比较苯的办法.您可以使用上面讲的第一种方法来完成.当窗体需要被清除的是一个屏幕那么宽, 您可以使用下面讲的函数来非常好的完成您的任务.在涉及到其他函数之前,我们先来讨论一下_clear标志位.如果设置了该标志,那么它会存在WINDOW结构中. 当调用它时,它会用refresh来发送控制代码到终端,refresh检查窗体的宽度是否是屏幕的宽度(使用_FULLWIN标志位). 如果是的话,它将用内置的终端方法刷新屏幕,它将写入除了空白字符外的文本字符到屏幕,这是一种非常快速清屏的方法. 为什么仅仅当窗体的宽度和屏幕宽度相等时才用内置的终端方法清屏呢那是因为控制终端代码不仅仅只清除窗体自身,它还可以清除当前屏幕._clear标志位由clearok函数控制.函数clear和wclear被用来清除和屏幕宽度一样的窗体内容.实际上,这些函数等同与使用werase和clearok. 首先,它用空白字符填充窗体的文本字符.接着,设置_clear标志位,如果窗体宽度和屏幕宽度一样,就使用内置的终端方法清屏,如果不一样就用空白字符填充窗体所有区域再用refresh刷新.总而言之,如果您知道窗体的宽度和屏幕宽度一样,就使用clear或者wclear,这个速度将非常快.如果窗体宽度不是和屏幕宽度一样,那么使用wclear和werase将没有任何分别.使用颜色您在屏幕上看到的颜色其实都是颜色对,因为每一个区域都有一个背景色和一个前景色.使用ncurses显示彩色意味着您定义自己的颜色对并且将这些颜色对写入到窗体.如同使用ncurses函数必须先调用initscr一样,start_color需要首先调用以初始化色素. 您用来定义自己的颜色对的函数是init_pair,当您使用它定义了一个颜色对后,它将会和您在函数中的设置的第一个参数联系起来. 在程序中,无论您什么时候需要用该颜色对,您只需用COLOR_PAIR调用该参数就可以了.除了定义颜色对,您还必须使用函数来保证写入的使用是用不同的颜色对,attron和wattron可以满足您的要求. 使用这些函数将会用您选择的颜色对写入数据到相应的屏幕上,直到调用了attroff或者wattroff函数.bkgd和wbkgd函数可以改变相应的整个窗体的颜色对,调用时,它将会改变窗体所有区域的前景色和背景色.也就是说,在下一个刷新动作前,窗体上所有的区域将会使用新的颜色对重写.使用刚才提到的那些函数man pages来得到详细的关于颜色资料和信息.窗体的边框您可以给您的程序里面的窗体一个很好看的边框,在库中有一个box宏函数可以替您做到这一点,和其他函数所不同的是,没有wbox函数.box需要一个WINDOW指针来作为参数.您可以在box的man pages页轻松获得详细的帮助,这里有一些需要注意的是,给一个窗体设置边框其实只是在窗体的相应边框区域写入了一些字符.如果您在边框区域一下写如了某些数据,边框将会被中断. 解决的办法就是在您在原始窗体里面再建一个子窗体,将原始窗体放入到边框里面然后使用里面的子窗体作为需要的输入数据窗体.功能键为了能够使用功能键,必须在我们需要接受输入的窗体中设置_use_keypad标志位,keypad是一个能设置_use_keypad值的函数,当您设置了_use_keypad后,您就可以使用键盘的功能键(快捷键),如同普通输入一样.在这里,如果您想使用getch来作个简单接受数据输入的例子,您需要注意的是要将数据赋给整形变量(int)而不是字符型(char).这是因为整形变量能容纳的功能键比字符型更多.您不需要知道这些功能键的值,您只需要使用库中定义的宏名就可以了,在getch的man page中有这些数值的列表.范例我们将来分析一个非常简单实用的程序.在这个程序中,将使用ncurses定义菜单,菜单中的一个选择项都会被证明选种. 这个程序比较有意思的一面就是使用了ncurses的窗体来达到菜单效果.您可以看下面的屏幕截图.程序开始和普通一样,包括进去了一个头文件.接着我们定义了回车键和escape键的ASCII码值.#include <>#include <>#define ENTER 10#define ESCAPE 27当程序的时候,下面的函数会被调用.它首先调用initscr初始化指针接着调用start_color来显示彩色. 整个程序中所使用的颜色对会在后面定义.调用curs_set(0)会屏蔽掉物理指针.noecho()将终止键盘上的输入会在屏幕上显示出来. 您可以使用noecho函数控制键盘输入进来的字符,只允许需要的字符显示.echo()将会屏蔽掉这种效果. 接着的函数keypad设置了可以在stdscr中接受键盘的功能键(快捷键),我们需要在后面的程序中定义F1,F2以及移动的光标键.void init_curses(){initscr();start_color();init_pair(1,COLOR_WHITE,COLOR_BLUE);init_pair(2,COLOR_BLUE,COLOR_WHITE);init_pair(3,COLOR_RED,COLOR_WHITE);curs_set(0);noecho();keypad(stdscr,TRUE);}下面定义的这个函数定义了一个显示在屏幕最顶部的菜单栏, 您可以看下面的main段程序,它看上去好象只是屏幕最顶部的一行,其实实际上是stdscr窗体的一个子窗体,该子窗体只有一行.下面的程序将指向该子窗体的指针作为它的参数,首先改变它的背景色,接着定义菜单的字,我们使用waddstr定义菜单的字.需要注意的是wattron调用了另外一个不同的颜色对(序号3)以取代缺省的颜色对(序号2).记住2号颜色对在最开始就由wbkgd设置成缺省的颜色对了.wattroff函数可以让我们切换到缺省的颜色对状态.void draw_menubar(WINDOW *menubar){wbkgd(menubar,COLOR_PAIR(2));waddstr(menubar,"Menu1");wattron(menubar,COLOR_PAIR(3));waddstr(menubar,"(F1)");wattroff(menubar,COLOR_PAIR(3));wmove(menubar,0,20);waddstr(menubar,"Menu2");wattron(menubar,COLOR_PAIR(3));waddstr(menubar,"(F2)");wattroff(menubar,COLOR_PAIR(3));}下一个函数显示了当按下F1或者F2键显示的菜单,定义了一个在蓝色背景上菜单栏颜色一样的白色背景窗体,我们不希望这个新窗口会被显示在背景色上的字覆盖掉.它们应该停留在那里直到关闭了菜单.这就是为什么菜单窗体不能定义为stdscr的子窗体,下面会提到,窗体items[0]是用newwin函数定义的, 其他8个窗体则都是定义成items[0]窗体的子窗体.这里的items[0]被用来绘制一个围绕在菜单旁边的边框,其他的窗体则用来显示菜单中选中的单元.同样的,他们不会覆盖掉菜单上的边框.为了区别选中和没选中的状态,有必要让选中的单元背景色和其他的不一样.这就是这个函数中倒数第三句的作用了,菜单中的第一个单元背景色和其他的不一样, 这是因为菜单弹出来后,第一个单元是选中状态.WINDOW **draw_menu(int start_col){int i;WINDOW **items;items=(WINDOW **)malloc(9*sizeof(WINDOW *));items[0]=newwin(10,19,1,start_col);wbkgd(items[0],COLOR_PAIR(2));box(items[0],ACS_VLINE,ACS_HLINE);items[1]=subwin(items[0],1,17,2,start_col+1);items[2]=subwin(items[0],1,17,3,start_col+1);items[3]=subwin(items[0],1,17,4,start_col+1);items[4]=subwin(items[0],1,17,5,start_col+1);items[5]=subwin(items[0],1,17,6,start_col+1);items[6]=subwin(items[0],1,17,7,start_col+1);items[7]=subwin(items[0],1,17,8,start_col+1);items[8]=subwin(items[0],1,17,9,start_col+1);for (i=1;i<9;i++)wprintw(items[i],"Item%d",i);wbkgd(items[1],COLOR_PAIR(1));wrefresh(items[0]);return items;}下面这个函数简单的删除了上面函数定义的菜单窗体.它首先用delwin函数删除窗体, 接着释放items指针的内存单元.void delete_menu(WINDOW **items,int count){int i;for (i=0;i<count;i++)delwin(items[i]);free(items);}scroll_menu函数允许我们在菜单选择项上上下移动,它通过getch读取键盘上的键值,如果按下了键盘上的上移或者下移方向键, 菜单选择项的上一个项或者下一个项被选中.回忆一下刚才所讲的,选中项的背景色将会和没选中的不一样.如果是向左或者向右的方向键,当前菜单将会关闭,另一个菜单打开.如果按下了回车键,则返回选中的单元值.如果按下了ESC键,菜单将会被关闭,并且没有任何选择项,下面的函数忽略了其他的输入键.getch能从键盘上读取键值,这是因为我们在程序开始使用了keypad(stdscr,TRUE) 并且将返回值赋给一个int型变量而不是char型变量,这是因为int型变量能表示比char型更大的值.int scroll_menu(WINDOW **items,int count,int menu_start_col){int key;int selected=0;while (1) {key=getch();if (key==KEY_DOWN || key==KEY_UP) {wbkgd(items[selected+1],COLOR_PAIR(2));wnoutrefresh(items[selected+1]);if (key==KEY_DOWN) {selected=(selected+1) % count;} else {selected=(selected+count-1) % count;}wbkgd(items[selected+1],COLOR_PAIR(1));wnoutrefresh(items[selected+1]);doupdate();} else if (key==KEY_LEFT || key==KEY_RIGHT) {delete_menu(items,count+1);touchwin(stdscr);refresh();items=draw_menu(20-menu_start_col);return scroll_menu(items,8,20-menu_start_col);} else if (key==ESCAPE) {return -1;} else if (key==ENTER) {return selected;}}}最后就是我们的main部分了.它使用了上面所有我们所讲述和编写的函数来使程序合适的工作. 它同样通过getch读取键值来判断F1或者F2是否按下了,并且用draw_menu来在相应的菜单窗体上绘制菜单. 接着调用scroll_menu函数让用户选择某一个菜单,当scroll_menu返回后,它删除菜单窗体并且显示所选择的单元内容在信息栏里.我必须提到的是函数touchwin.如果在菜单关闭后没有调用touchwin而立即刷新,那么最后打开的菜单将一直停留在屏幕上.这是因为在调用refresh时,menu函数根本就没有完全改变stdscr的内容.它没有重新写入数据到stdscr上, 因为它以为窗体内容没有改变.touchwin函数设置了所有WINDOW结构中的标志位,它通知refresh刷新窗体中所有的行, 值都改变了,这样在下一次刷新整个窗体时,即使窗体内容没有改变也要重新写入一次.在菜单关闭后,选择的菜单信息会一直停留在stdscr上面.菜单没有在stdscr上写数据,因为它是开了一个新的子窗口.int main(){WINDOW *menubar,*messagebar;init_curses();bkgd(COLOR_PAIR(1));menubar=subwin(stdscr,1,80,0,0);messagebar=subwin(stdscr,1,79,23,1);draw_menubar(menubar);move(2,1);printw("Press F1 or F2 to open the menus. ");printw("ESC quits.");refresh();do {int selected_item;WINDOW **menu_items;key=getch();werase(messagebar);wrefresh(messagebar);if (key==KEY_F(1)) {menu_items=draw_menu(0);selected_item=scroll_menu(menu_items,8,0);delete_menu(menu_items,9);if (selected_item<0)wprintw(messagebar,"You haven't selected any item."); elsewprintw(messagebar,"You have selected menu item %d.",selected_item+1); touchwin(stdscr);refresh();} else if (key==KEY_F(2)) {menu_items=draw_menu(20);selected_item=scroll_menu(menu_items,8,20);delete_menu(menu_items,9);if (selected_item<0)wprintw(messagebar,"You haven't selected any item."); elsewprintw(messagebar,"You have selected menu item %d.",selected_item+1); touchwin(stdscr);refresh();}} while (key!=ESCAPE);delwin(menubar);delwin(messagebar);endwin();}如果您拷贝了代码到一个文件,假设名字是,并且移走了我所有的注释,您可以用下面这个方法编译:gcc -Wall -o example -lcurses为了测试程序,您可以在参考一章里下载该程序.总结我谈到了很多关于ncurses的基础知识,应该足够用来给您的程序创建一个很好看的界面.还有许多方便的功能在这里都没有提及,您可以在我经常问到的几个函数的man pages里面找到很多有用的信息.读完了后,您将回明白我这里提到的东西和内容仅仅是一个介绍而已.参考程序:#include <>#include <>#define ENTER 10#define ESCAPE 27void init_curses(){initscr();start_color();init_pair(1,COLOR_WHITE,COLOR_BLUE);init_pair(2,COLOR_BLUE,COLOR_WHITE);init_pair(3,COLOR_RED,COLOR_WHITE);curs_set(0);noecho();keypad(stdscr,TRUE);}void draw_menubar(WINDOW *menubar){wbkgd(menubar,COLOR_PAIR(2));waddstr(menubar,"Menu1");wattron(menubar,COLOR_PAIR(3));waddstr(menubar,"(F1)");wattroff(menubar,COLOR_PAIR(3));wmove(menubar,0,20);waddstr(menubar,"Menu2");wattron(menubar,COLOR_PAIR(3));waddstr(menubar,"(F2)");wattroff(menubar,COLOR_PAIR(3));}WINDOW **draw_menu(int start_col){int i;WINDOW **items;items=(WINDOW **)malloc(9*sizeof(WINDOW *));items[0]=newwin(10,19,1,start_col);wbkgd(items[0],COLOR_PAIR(2));box(items[0],ACS_VLINE,ACS_HLINE);items[1]=subwin(items[0],1,17,2,start_col+1);items[2]=subwin(items[0],1,17,3,start_col+1);items[3]=subwin(items[0],1,17,4,start_col+1);items[4]=subwin(items[0],1,17,5,start_col+1);items[5]=subwin(items[0],1,17,6,start_col+1);items[6]=subwin(items[0],1,17,7,start_col+1);items[7]=subwin(items[0],1,17,8,start_col+1);items[8]=subwin(items[0],1,17,9,start_col+1);for (i=1;i<9;i++)wprintw(items[i],"Item%d",i);wbkgd(items[1],COLOR_PAIR(1));wrefresh(items[0]);return items;}void delete_menu(WINDOW **items,int count){int i;for (i=0;i<count;i++)delwin(items[i]);free(items);}int scroll_menu(WINDOW **items,int count,int menu_start_col){int key;int selected=0;while (1) {key=getch();if (key==KEY_DOWN || key==KEY_UP) {wbkgd(items[selected+1],COLOR_PAIR(2));wnoutrefresh(items[selected+1]);if (key==KEY_DOWN) {selected=(selected+1) % count;} else {selected=(selected+count-1) % count; }wbkgd(items[selected+1],COLOR_PAIR(1));wnoutrefresh(items[selected+1]);doupdate();} else if (key==KEY_LEFT || key==KEY_RIGHT) {delete_menu(items,count+1);touchwin(stdscr);refresh();items=draw_menu(20-menu_start_col);return scroll_menu(items,8,20-menu_start_col); } else if (key==ESCAPE) {return -1;} else if (key==ENTER) {return selected;}}}int main(){int key;WINDOW *menubar,*messagebar;init_curses();bkgd(COLOR_PAIR(1));menubar=subwin(stdscr,1,80,0,0);messagebar=subwin(stdscr,1,79,23,1);draw_menubar(menubar);move(2,1);printw("Press F1 or F2 to open the menus. ");printw("ESC quits.");refresh();do {int selected_item;WINDOW **menu_items;key=getch();werase(messagebar);wrefresh(messagebar);if (key==KEY_F(1)) {menu_items=draw_menu(0);selected_item=scroll_menu(menu_items,8,0);delete_menu(menu_items,9);if (selected_item<0)wprintw(messagebar,"You haven't selected any item."); elsewprintw(messagebar,"You have selected menu item %d.",selected_item+1);touchwin(stdscr);refresh();} else if (key==KEY_F(2)) {menu_items=draw_menu(20);selected_item=scroll_menu(menu_items,8,20);delete_menu(menu_items,9);if (selected_item<0)wprintw(messagebar,"You haven't selected any item."); elsewprintw(messagebar,"You have selected menu item %d.",selected_item+1); touchwin(stdscr);refresh();}} while (key!=ESCAPE);delwin(menubar);delwin(messagebar);endwin();return 0;}。

ncurses库的介绍与安装

ncurses库的介绍与安装

ncurses库的介绍与安装介绍(new curses)是⼀套编程库,它提供了⼀系列的函数以便使⽤者调⽤它们去⽣成基于⽂本的⽤户界⾯。

ncurses名字中的n意味着“new”,因为它是curses的⾃由软件版本。

由于AT&T“臭名昭著”的版权政策,⼈们不得不在后来⽤ncurses去代替它。

ncurses是的⼀部分,但它却是少数⼏个不使⽤GNU GPL或LGPL授权的GNU软件之⼀。

其实我们对ncurses本⾝并不陌⽣,以下⼏款⼤名⿍⿍的软件都⽤到过ncurses:vimemacslynxscreen为了制作⾃⼰构想了⼀段时间的Roguelike的游戏,同时作为对的实践,我开始接触ncurses并在此作笔记。

安装Linux以Debian为例(⼈⽣中第⼀个发⾏版)$ sudo apt-get install libncurses5-dev安装完毕后,我们写下如下代码://test.c#include <string.h>#include <ncurses.h>int main(int argc,char* argv[]){initscr();raw();noecho();curs_set(0);char* c = "Hello, World!";mvprintw(LINES/2,(COLS-strlen(c))/2,c);refresh();getch();endwin();return0;}然后使⽤gcc编译后执⾏看看效果,不要忘了加-lncurses哦。

$ gcc test.c -o test -lncurses$ ./test不出意外的话结果如下:。

NCURSES库及其简单使用方法

NCURSES库及其简单使用方法

NCURSES库及其简单使用方法1、介绍在那个广泛使用电传打字机的年代,电传打字机作为中央电脑的输出终端,通过电缆和中央电脑连接。

用户要向终端程序发送一系列特定的控制命令,才可以控制终端屏幕的输出。

比如要在改变光标在屏幕上的位置,清除屏幕某一区域的内容,卷动屏幕,切换显示模式,给文字添加下划线,改变字符的外观、颜色、亮度等等。

这些控制都是通过一种叫做转义序列(escape sequence)的字符串实现的。

被叫做转义序列是因为这些连续字节都是以一个"0x1B"字符,即转义字符(按下ESC键所输入的字符)作为字符串的开头。

即使在现在,我们也可以通过向终端仿真程序输入转义序列得到与当年电传打字终端同样的输出效果。

如果你想在终端(或者终端仿真程序)屏幕输出一段背景是彩色的文字,可以将以下这段转义序列输入到你的命令行提示符:echo "^[[0;31;40mIn Color"在这里 "^[" 就是所谓的转义字符。

(注意:在这里 "^[" 是一个字符。

不是依次键入"^"和"["字符。

要打印出这个字符,你必须先按下Ctrl+V,然后按下ESC 键。

)执行以上的命令后。

你应该可以看见"In Color"的背景变为红色了。

从此以后显示的文本信息都是以这样的方式输出的。

如果想终止这种方式并回到原来的显示方式可以使用以下的命令:echo "^[[0;37;40m"现在知道这些字符(转移序列)的作用了吗?(译者注:更改分号之间的参数,看看会有什么结果。

)也许会和自己想像的不一样?可能是因为终端环境不同,终端环境取决于终端或操作系统的不同。

(译者注:你不可能让一个黑白终端显示出彩色字符吧?)为了避免这种不兼容情况,能够在不同的终端上输出统一的结果。

UNIX的设计者发明了一种叫做 termcap的机制。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用curses库有个特点,就是要初始化一个窗口用函数initscr();后面要用函数endwin来说明窗口结束!我们现在知道了:在程序中调用initscr()函数,会让屏幕初始化并进入CURSES模式。

还有一些其它的函数可以根据我们自己的方案初始化CURSES。

不同的初始化函数可以让屏幕进入不同的显示模式。

比如:终端模式(terminal mode)、彩色模式(color mode)、鼠标模式(mouse mode)等等……通常情况下,用户输入的字符将被终端程序送入终端的缓冲区。

但当用户输入换行符时,终端程序将会中断,同时输出当前的缓冲区内容并启用新行的输出缓冲。

但是大多数程序需要当用户输入单个字符时,却希望这些字符能够立即显示在屏幕上。

这两个函数就是用来禁用行缓冲(line buffering)。

这两个函数所初始化的的模式同样可以用来给程序传送控制字符,比如:挂起(CTRL-Z)、中断或退出(CTRL-C)。

区别在于,在raw()函数模式下,这些字符将传送给程序去处理而不作为终端程序处理的信号。

在cbreak()模式下,这些控制字符将被认为是终端驱动程序中的控制字符,因而将这些字符传送给终端程序。

我比较喜欢使用raw(),那样可以进行更多的控制操作。

这两个函数控制用户输入的键盘回显。

就是在运行程序的时候是否将输入的字符出现在屏幕上。

比如你的程序在运行时你需要使用控制字符,但是你不想让控制字符出现在屏幕上,就可以使用这两个函数。

也就是说当用户调用getch()函数向程序输入数据时,你不想让他输入的字符出现在屏幕上。

noecho()函数就可以不让控制字符(比如CTRL-C)出现在屏幕上。

大多数的交互式程序要进入控制模式的时候,一般都使用echo()、noecho()函数初始化、关闭键盘回显。

这样给了程序员更大的灵活性。

这个函数允许使用功能键:F1、F2、方向键等等……几乎所有的交互式程序都使用这个函数。

令用户使用方向键控制整个用户界面。

使用keypad(stdscr,TURE)就可以在“标准显示设备”(stdscr)上使用这些功能。

在以后的章节中将详细讨论如何使用功能键。

这个函数虽然不经常使用。

但有时却非常有用。

halfdelay()函数会启用半延时模式(half-delay mode)。

和cbreak()函数一样,当程序需要当用户输入这些字符时,它们能够立即显示在屏幕上。

但是它要停滞一段限定时间(以0.1秒为单位)等待输入,如果没有有效的输入,返回ERR。

给halfdelay()传递一个整型参数(以0.1秒为单位)。

它就会按照参数中的时间等待用户输入。

一般来说,这个函数在需要等待的输入的程序中可以被用到,如果用户没有及时做出响应,程序就可以去处理其它的事情了。

最常见到的应用例子是在输入密码的出超时响应。

上面的提到的这些函数可以定制CURSES在初始化后的行为。

这些函数不能被广泛使用在程序的各个部分。

所以,这些函数的调用要处在整个CURSES会话的开始部分。

一个例子让我们写一个程序用来说明这些函数的用法。

例2. 初始化函数用法的示例:#include <ncurses.h>;int main(){i nt ch;i nitscr(); /* 开始curses模式 */r aw(); /* 禁止行缓冲 */k eypad(stdscr, TRUE); /* 开启功能键响应模式 */n oecho(); /* 当执行getch()函数的时候关闭键盘回显 */p rintw("Type any character to see it in bold\n");c h = getch(); /* 如果没有调用raw()函数,必须先按下enter键才可以执行下面的程序 */i f(ch == KEY_F(1)) /* 如果没有调用keypad()初始化,将不会执行这条语句 */p rintw("F1 Key pressed"); /* 如果没有使用 noecho() 函数,一些难看的控制字符将会被打印到屏幕上 */e lse {p rintw("The pressed key is ");a ttron(A_BOLD);p rintw("%c", ch);a ttroff(A_BOLD);}r efresh(); /* 将缓冲区的内容打印到的显示器上 */g etch(); /* 等待用户输入 */e ndwin(); /* 结束curses模式 */r eturn 0;}这个程序很简单,不需要太多的说明。

但还是有一些前面没有提到的函数。

getch()函数用来取得用户输入的信息。

它和通常的getchar()函数相似。

但是getch()可以让我们在禁用行缓冲时避免在输入完成后还要按enter键麻烦。

在后面的章节中我们也将讨论到这些输入函数。

attron()和attroff()函数作为切换开关用来开启和关闭给字符增加一些修饰效果。

在这个例子中,它们使显示的字符字体加粗。

在后面的部分中我们也将讨论到这些函数。

代码好像有点问题议gcc编译提示TURE那一行有错误,没定义什么的,后来我把TURE改成了1编译成功the code is#include <ncurses.h>;int main(void){i nt c;i nitscr();k eypad(stdscr,1);n oecho();r aw();p rintw("jasdjsalfkjlsdjkflsdkjfljkasdkjlf\n");g etch();i f(getch()==KEY_F(1))p rintw("f1 jaslkdjlasd");e lse{p rintw("The pressed key is ");a ttron(A_BOLD);p rintw("%c", getch());a ttroff(A_BOLD);}r efresh();g etch();e ndwin();r eturn 0;}(A Word about Windows)在我们进入数以万计的CURSES函数以前,让我们先了解一下窗口(windows)的知识。

关于窗口机制的详细信息我们会在以后的章节中详细介绍。

这一章只是一些基础的知识,为了给讲解输入输出函数作铺垫。

当然,在现在就树立一个窗口的概念是很有好处的。

窗口实质上是由CURSES系统定义的一个假想的屏幕。

这种窗口并不像Windows平台上的窗口,这些窗口没有边框。

当CURSES初始化的时候,它会默认创建一个叫做stdscr的窗口。

这个窗口的大小一般是80列,25行的屏幕(根据显示器或者显卡的不同,可能会出现不同的大小)如果你运行简单的任务,比如打印几个字符串、输入一些数据等等……这样的单窗口完全可以满足你的需要。

当然,你也可以通过窗口系统的函数创建你自己的窗口。

举个例子,如果你调用以下函数:p rintw(“Hi! There!”);refresh();它会在stdscr上的当前光标位置输出“Hi! There!”。

同样,调用refresh()函数,它只更新stdscr上的缓冲区。

例如,你已经建立了一个叫做win的窗口。

你要在这个窗口上输出以上的内容。

只需要在普通的函数前添加w前缀就可以了。

同时,函数中的参数也要相应的变化(要指明你所要显示信息的窗口):w printw(win, "Hi There !!!");wrefresh(win);你将在这份文档的其余部分看到,这些函数有相同的命名规则。

p rintw(string); /* 在stdscr的当前光标位置打印字符串string */m vprintw(y, x, string); /* 将字符串string打印在坐标(y,x)处 */w printw(win, string); /* 在窗口win的当前光标位置打印字符串string */ mvwprintw(win, y, x, string); /* 移动到窗口win的(y,x)然后打印字符串string */后来编译遇到如下错误,查看这里的学习资料,仔细看就明白了![ljjk@localhost ljjk]$ gcc -l curses -o 12321 12321.c12321.c: In function `main':12321.c:6: `win' undeclared (first use in this function)12321.c:6: (Each undeclared identifier is reported only once12321.c:6: for each function it appears in.)后来问题得到了解决#include <stdio.h>;#include <ncurses.h>;int main(void){i nitscr();w printw(win,"hello");w refresh(win);e ndwin();}this is the code我们已经通过一些例子看到了修饰(Attributes)输出文字的效果。

给某些文字加上修饰会使文字更加醒目和美观。

在某些程度上也会增加输出信息的可读性。

下面这个程序将会把一个C 语言的源程序文件的注释部分用使用粗体(BOLD)输出。

例:一个简单的文字修饰的例子:#include <ncurses.h>;i nt main(int argc, char *argv[]){i nt ch, prev;F ILE *fp;i nt goto_prev = FALSE, y, x;i f(argc != 2){p rintf("Usage: %s \n", argv[0]);e xit(1);}f p = fopen(argv[1], "r"); /* 在这里检测文件是否成功打开 */i f(fp == NULL){p error("Cannot open input file");e xit(1);}i nitscr(); /* 初始化并进入CURSES模式 */p rev = EOF;w hile((ch = fgetc(fp)) != EOF){i f(prev == '/' && ch == '*') /* 当读到字符“/”和“*”的时候调用开启修饰函数 */{a ttron(A_BOLD); /* 将“/”和“*”及以后输出的文字字体加粗 */g oto_prev = TRUE;}i f(goto_prev == TRUE) /* 回到“/”和“*”之前开始输出 */{g etyx(stdscr, y, x);m ove(y, x - 1);p rintw("%c%c", '/', ch); /* 实际打印内容的部分 */c h = 'a'; /* 避免下次读取变量错误,这里赋一个任意值*/g oto_prev = FALSE; /* 让这段程序只运行一次 */}e lsep rintw("%c", ch);r efresh(); /* 将缓冲区的内容刷新到屏幕上 */i f(prev == '*' && ch == '/')a ttroff(A_BOLD); /* 当读到字符“*”和“/”的时候调用修饰关闭函数*/p rev = ch;}getch();endwin(); /* 结束并退出Curses模式 */return 0;}不用去理睬那些初始化部分和其它没用的部分。

相关文档
最新文档