请教Cursesword隐藏光标标的函数

  总的来说,curses是一个在Linux/Unix下广泛应用的. 以前学过TC2.0的朋友肯定还记得TC里边有一个图形库(Borland Graphics Interface, 还记得那个&graphics.h&头文件吗:). 用它我们可以绘制在DOS下的用户界面和漂亮的图形. 而Linux/Unix编程给人的感觉就比较&cool&一点, 好像Linux编程都是在黑黑的终端下进行的.确实是这样,许多Linux高手都喜欢在终端方式下工作, 熟悉了一些命令以后,这样的工作方式效率还是很高的. 但是长久地看着黑黑的屏幕难免让人感到厌倦, 特别是像我这样接触Linux不久的菜鸟:) 有没有一种工具能让我们在Linux下编出好看的图形呢? 答案是肯定的, 它就是curses!
  curses的名字起源于&cursor optimization&,即光标优化. 它最早由有美国伯克利大学的Bill Joy和Ken Arnold编写的, 用来处理一个游戏rogue的屏幕显示. 后来贝尔实验室的Mark Horton在System III Unix中重新编写了curses. 现在几乎所有的Unix, Linux操作系统都带了curses函数库, curses也加入了对鼠标的支持, 一些菜单和面板的处理. 可以说, curses是Linux终端图形编程的不二选择(比如著名的文字编辑器 vi 就是基于curses编的);
  OK, 闲话少说,现在我们开始进入正题:
  首先我们应该了解, 在终端使用的屏幕模式是基于文本的. 所以在开始使用curses前, 需要用()函数初始化屏幕. 对应的, 程序结束需要调用endwin();函数来关闭curses状态.
  有了这个概念, 我们就可以来写著名的&Hello, world!&之curses版了:
  /*-----------------------------------------------------------------
  A very simple example of curses programming
  coder: jellen
  date: 3-26-2004
  ----------------------------------------------------------------*/
  #include &curses.h&
  int main()
  initscr();
  box(stdscr, ACS_VLINE, ACS_HLINE); /*draw a box*/
  move(LINES/2, COLS/2); /*move the cursor to the center*/
  waddstr(stdscr, &Hello, world!&);
  getch();
  endwin();
  return 0;
  呵呵, 刚才忘了说了. 我们调用curses库一般是用C语言的(没什么奇怪, C可以说是Linux的官方语言, 不过你也可以用C++或Python等语言调用curses的, 这无关紧要). 假设我们把这个程序保存为 hello.c
  不过不要急着用gcc -o hello hello.c去编译运行(我知道你会用gcc:) 那样是不能通过编译的. 因为curses库不在标准路径上, 所以我们要加上 -lcurses连接选项, 像这样:
  gcc -o hello hello.c -lcurses
  现在你用 ./hello 运行一下程序看看,是不是出现了你所期望的窗口.
  现在我们来一行行分析一下代码.
  #include &curses.h& /*这是每个 curses 程序都必须包含的头文件,表明使用了curses库*/
  然后主函数中第一句initscr();初始化了屏幕, 使之开始进入curses图形化工作方式.
  其实我们现在没有自己建立窗口, 用的是标准屏幕 stdscr(就象C里面标准输入, 标准输出stdout一个概念), 它就是我们面前的电脑屏幕(不过现在还是黑黑的:)
  下面一句: box(stdscr, ACS_VLINE, ACS_HLINE); 画了一个框. 有了这个框我们才有&窗体&的感觉. stdscr就是标准屏幕, ACS_VLINE和ACS_HLINE代表构成方框两边的基本元素, 你也可以用 '|'和'-'代替, 不过可能没有ACS_VLINE, ACS_HLINE好看了.
  move(LINES/2, COLS/2);
  waddstr(stdscr, &Hello, world!&);
  这两句是把光标移到屏幕中间, 然后输出我们的&Hello, world!&
  LINES 和 COLS是curses定义的宏, 代表当前屏幕的最大行数和列数. waddstr()函数的作用是在stdscr上打印字符串&hello, world!&
  屏幕分物理屏幕(我们所看到的)和逻辑屏幕(在内存中的), 我们调用函数时修改的是逻辑屏幕,它不会在当前物理屏幕上显示出来.所以现在屏幕上还是什么也没有, 需要调用refresh()把我们对逻辑屏幕的改动在物理屏幕(显示器)上显示出来. 然后用getch()让屏幕暂停一下.
  最后调用endwin()结束curses, 恢复原来的屏幕.
  好了, 我们完成了第一个例子的分析. 是不是挺简单的?
  不过不尽如人意的是屏幕还是那个样子, 没有什么色彩. 要加色彩? 那也是挺容易的: 首先用start_color()函数开色模式, 然后设置我们要的颜色就行了.
  curses里的颜色是配对的, 要一个背景色对一个前景色. 使用之前用init_pair()初始化.
  比如init_pair(1, COLOR_BLUE, COLOR_GREEN);就定义了一组颜色, COLOR_BLUE为前景色, COLOR_GREEN为背景色. 1是它们的标记号码(供其他函数调用时使用) 我们来看一个简单的例子:
  /*--------------------------------------------------------------
  A simple curses color demo program
  Coder: jellen
  Date: 3-26-2004
  -------------------------------------------------------------*/
  #include &curses.h&
  int main()
  initscr(); /*初始化屏幕*/
  if(start_color() == OK) /*开启颜色*/
  init_pair(1, COLOR_RED, COLOR_GREEN); /*建立一个颜色对*/
  attron(COLOR_PAIR(1)); /*开启颜色*/
  move(LINES/2, COLS/2);
  waddstr(stdscr, &Yet another Hello, world!&);
  attroff(COLOR_PAIR(1)); /*关闭颜色显示*/
  refresh();
  waddstr(stdscr, &Can not init color&);
  refresh();
  endwin(); /*关闭curses状态*/
  return 0;
  这个程序假如保存为color.c
  那么你可以这样编译了: gcc -o color color.c -lcurses
  用./color一运行, 是不是有几个彩色的字? 呵呵, 虽然不好看, 但是说不定你自己以后可以用curses写出精美的程序.
  ubuntu 用户 如果 没有 curses.h库,可以用一下命令下载: apt-get install libncurses5-dev
  如果想做更多了解,可以去下边网址看看:
  /developerworks/cn/aix/library/au-shellcurses/index.html
&|&相关影像
互动百科的词条(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。未经许可,禁止商业网站等复制、抓取本站内容;合理使用者,请注明来源于。
登录后使用互动百科的服务,将会得到个性化的提示和帮助,还有机会和专业认证智愿者沟通。
此词条还可添加&
编辑次数:4次
参与编辑人数:4位
最近更新时间: 18:06:51
贡献光荣榜您所在的位置: &
使用curses库
使用curses库
人民邮电出版社
《Linux编程技术详解》第6章的主要内容是设备文件,本小节讲的是使用curses库。
6.5& 密码输入关闭回显的两种方法
在软件开发中,往往会遇到要求用户输入密码的情况。出于对密码的保密,输入的字符是不会显示到屏幕上的。例如,在登录Linux系统时,输入用户名后,输入的密码是不显示的。这里介绍两种方法来解决这一问题。
6.5.1& 使用curses库
curses库是由柏克莱大学的Bill Joy及Ken Arnold所开发的。当时开发curses库的目的是为了解决程序对于不同终端的兼容性。curses库用于处理Linux/UNIX上的光标移动及屏幕显示问题。考虑到curses库的复杂性,这里只是简单地介绍一下curses库的使用。需要这方面详细信息可以查阅相关资料。
使用curses库中的函数前,需要进行必要的初始化工作。程序需要使用initscr函数来开启curses模式,在结束前调用endwin函数来关闭curses模式。代码如下:
#include &curses.h& int main(int argc,char* argv[]){initscr();…endwin();}
在实际使用中,出于方便的目的,往往把一些初始化的动作放置在初始化函数中,以方便调用。具体代码如下:
void initial() { initscr(); cbreak(); nl(); noecho();intrflush(stdscr,FALSE); keypad(stdscr,TRUE); refresh(); }
代码中使用到了一些curses库的函数,含义如下。&cbreak():调用cbreak函数后,除了“Del”和“Ctrl”键外,接受其他所有字符输入。
nl()/nonl():输出时,换行是否作为回车字符。nl函数将换行作为回车符,而nonl函数相反。
noecho()/echo():关闭/打开输入回显功能。
intrflush(WINDOW *win, bool bf):win为标准输出。当bf为true时输入Break,可以加快中断的响应。但是,有可能会造成屏幕输出信息的混乱。&keypad(WINDOW *win, bool bf):win为标准输出。调用keypad函数后,将可以使用键盘上的一些特殊字符,如方向键,转化成curses.h中的特殊键。&refresh():重绘屏幕显示内容。在调用initscr函数后,第一次调用refresh函数会清除屏幕显示。
程序p6.3.c给出了使用curses库实现密码输入、屏蔽输出结果的实例。具体代码如下:
//p6.3.c 使用curses实现密码输入#include &stdio.h&#include &stdlib.h&#include &curses.h&#include &unistd.h&void init(){initscr();cbreak();nl();noecho();intrflush(stdscr,FALSE);keypad(stdscr,TRUE);refresh();}int getpasswd(char* passwd, int size){int n = 0;printw("Please Input password:");do{c = getch();if (c != '\n'){echochar('*');//printw("*");passwd[n++] =}}while(c != '\n' && n & (size - 1));passwd[n] = '\0';}int main(){char passwd[20];init();n=getpasswd(passwd, sizeof(passwd));printw("\nYour passwd is:%s\n", passwd);printw("Press any key continue ...\n");refresh();getchar();endwin();return 0;}
使用gcc编译该程序,获得名为p6.5的可执行程序。注意程序中使用了curses库,因此编译时要指明该库的名称。具体编译和执行情况如下:
[program@localhost charter6]$ gcc -o p6.3 p6.3.c -lcurses[program@localhost charter6]$ ./p6.3Please Input password:*******Your passwd is:afdafdsPress any key continue ...【责任编辑: TEL:(010)】&&&&&&
关于&&&&&&的更多文章
对于一名Linux系统管理人员来说,系统故障问题或多或少会出现,
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
讲师: 13人学习过讲师: 66人学习过讲师: 29人学习过
Ansible是近年用户量急速蹿升的开源配置管理工具。在A
本书深入浅出地介绍了Redis的5种数据类型,并通过多个
本书以银行数据中心建设为主线, 涵盖了银行数据中心
精选目前国内外最流行的程序设计语言――Java作为本书的选题,并以丰富的内容来解决读者学习该语言时可能遇到的各种问题。以专业
51CTO旗下网站君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
curses函数库
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口}

我要回帖

更多关于 edittext隐藏光标 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信