`
helloyesyes
  • 浏览: 1268916 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

使用curses管理基于文本的屏幕--(二)

阅读更多
初始化与结束

正如我们所看到的,所有的curses必须与initscr开始,并且以endwin结束。下面是他们头文件的定义:

#include <curses.h>
WINDOW *initscr(void);
int endwin(void);

在每个程序中initscr应只被调用一次。如果函数调用成功,initscr函数会返回一个指向stdscr结构的指针。如果函数失败,他只简单的打印出一个诊断错误信息,并且使得程序退出。

endwin函数成功时会返回OK,而失败则会返回ERR。我们可以调用endwin来离开curses,并且在以后通过调用clearok(stdscr,1)与refresh来恢复curses。这会有效的使得curses忘记物理屏幕的实际样子,并且会强制执行一次完全的重新显示。

输出到屏幕

为更新屏幕提供了一些基本的函数。他们是

#include <curses.h>
int addch(const chtype char_to_add);
int addchstr(chtype *const string_to_add);
int printw(char *format, ...);
int refresh(void);
int box(WINDOW *win_ptr, chtype vertical_char, chtype horizontal_char);
int insch(chtype char_to_insert);
int insertln(void);
int delch(void);
int deleteln(void);
int beep(void);
int flash(void);

curses有其自己的字符类型,chtype,其位数要比标准的char多。在ncurses的标准Linux版本中,chtype实际上为unsigned long的一个typedef。

add...函数会在当前位置添加指定的字符或是字符串。printw函数的工作方式与printf相类似,他会格式化一个字符串,并且将其添加到当前位置中。refresh函数会使得物理屏幕进行更新,如果成功则会返回OK,失败则会返回ERR。box函数会允许我们在窗口周围画一个盒子。

insch函数会插入一个字符,将已存在的字符向右移动,我们并没有指定此时在一行的末尾会发生什么,而且这依赖于我们所使用的终端。insertln会插入一个空行,将已存在的行向下移动一行。两个delete函数正好与两个insert函数相反。

要发出声音,我们可以调用beep。只有一少部分终端不可以发出声音,所以一些curses的设置会在调用beep时闪动屏幕。如果我们在一个忙碌的办公室中工作,在这里会在有声音由不同的机器发出,所以也许我们会更喜欢闪动屏幕的方式。正如我们所期望的,flash会使得我们的屏幕冷却,如果这个不可用,他就会尝试着在终端上发出声音。

由屏幕读取

我们可以由屏幕读取字符,尽管这个功能并不会经常用到,因为通常很容易跟踪所输出的内容。如果我们需要这样做,可以用下面的函数来完成。

#include <curses.h>
chtype inch(void);
int instr(char *string);
int innstr(char *string, int number_of_characters);

inch函数应总是会可用的,但是instr与innstr函数并不总是被支持的。inch函数会由光标的当前屏幕位置返回一个字符及其属性。注意,inch并不会返回一个字符,而是一个chtype,而instr与innstr会写入char数组。

清除屏幕

有四个函数可以用于清除屏幕区域。他们是

#include <curses.h>
int erase(void);
int clear(void);
int clrtobot(void);
int clrtoeol(void);

erase函数会将每一个屏幕位置清空。clear函数与erase函数相似,清除屏幕,但是同时会强制屏幕调用clearok来重新显示。clearok会在下一次调用refresh时强制一个清屏序列,并且会重新显示。

clear函数通常用作一个终端命令来清除整个屏幕,而不是简单的尝试清除任何当前非空的屏幕位置。这就使得clear函数成为一个更可靠的方式来完全清除屏幕。clear命令以及其后的refresh命令的组合会提供一个有用的重绘命令。

clrtobot函数会清除光标位置到屏幕结束处的屏幕,而clrtoeol函数会清除光标位置到光标所在行的结束处。

移动光标

另外提供了一个单一的函数用于移动光标,并且有另一个命令用来控制在屏幕更新之后curses离开光标的位置:

#include <curses.h>
int move(int new_y, int new_x);
int leaveok(WINDOW *window_ptr, bool leave_flag);

move函数只是简单的将逻辑光标位置移动到指定的位置。记住屏幕坐标是由左上角的(0,0)来指定的。在curses的大多数版本中,两个extern整数LINES与COLUMNS包含物理屏幕尺寸并且可以用来确定new_y与new_x所允许的最大值。调用move并不会使得物理光标移动。他只会改变当下一次输出出现时其所在的逻辑屏幕的位置。如果我们希望屏幕光标在调用move之后立即移动,我们可以在其后调用refresh函数。

leaveok函数会设置一个控制在屏幕更新之后光标curses离开物理光标位置的标记。在默认情况下,这个标记为false,而且在refresh之后,硬件光标会停留在与逻辑光标相同的屏幕位置上。如果这个标记设置为true,硬件光标的停留位置是随机的,可以是屏幕上的任何位置。一般而言,我们会更喜欢默认选项来保证光标停留在一个可感知的位置上。

字符属性


每一个curses字符都有一个特定的属性来控制他如何在屏幕上显示,假定显示硬件可以支持所请求的属性。定义的属性为A_BLINK,A_BOLD,A_DIM,A_REVERSE,A_STANDOUT,A_UNDERLINE。我们可以下面的函数来单独或是组合设置属性。

int attron(chtype attribute);
int attroff(chtype attribute);
int attrset(chtype attribute);
int standout(void);
int standend(void);

attrset函数可以设置curses属性,attron与attroff函数可以打开或是关闭指定的属性,而不会影响其他属性,而standout与standend提供了一个更为通用的方式,或是"独立"(stand out)模式。在大多数终端上,这通常映射到声音。

试验--移动,插入以及属性

现在我们已经了解了很多管理屏幕的内容,我们可以试验一个更为复杂的例子,moveadd.c。在这个例子中,我们将会包含一些refresh与sleep调用,从而使得我们可以看到每一阶段屏幕显示的样子。通常,curses程序会尽可能少的刷新屏幕,因为这并不是非常有效的操作。下面的代码会显示这些特点。

1 我们包含某些头文件,定义了一些字符数组以及一个指向这些数组的指针,然后会初始化curses结构。

#include <unistd.h>
#include <stdlib.h>
#include <curses.h>
int main()
{
const char witch_one[] = “ First Witch “;
const char witch_two[] = “ Second Witch “;
const char *scan_ptr;
initscr();

2 现在对于要在屏幕上显示的三个文本初始集合,要注意文本属性的on与off标记。

move(5, 15);
attron(A_BOLD);
printw(“%s”, “Macbeth”);
attroff(A_BOLD);
refresh();
sleep(1);
move(8, 15);
attron(A_STANDOUT);
printw(“%s”, “Thunder and Lightning”);
attroff(A_STANDOUT);
refresh();
sleep(1);
move(10, 10);
printw(“%s”, “When shall we three meet again”);
move(11, 23);
printw(“%s”, “In thunder, lightning, or in rain ?”);
move(13, 10);
printw(“%s”, “When the hurlyburly’s done,”);
move(14,23);
printw(“%s”, “When the battle’s lost and won.”);
refresh();
sleep(1);

3 每次插入一个字符

attron(A_DIM);
scan_ptr = witch_one + strlen(witch_one) - 1;
while(scan_ptr != witch_one) {
move(10,10);
insch(*(scan_ptr--));
}
scan_ptr = witch_two + strlen(witch_two) - 1;
while (scan_ptr != witch_two) {
move(13, 10);
insch(*(scan_ptr--));
}
attroff(A_DIM);
refresh();
sleep(1);

4 最后,我们将光标移动到屏幕的右下角,进行整理并退出。

move(LINES - 1, COLS - 1);
refresh();
sleep(1);
endwin();
exit(EXIT_SUCCESS);
}

分享到:
评论

相关推荐

    使用curses管理基于文本的屏幕

    Linux或者Windows+Cygwin开发环境下,使用ncerses进行文本方式的图形界面编程的指导手册!

    Linux程序设计 第6章 使用curses函数库管理基于文本的屏幕

    即使是编写基于字符的全屏幕程序,使用curses函数库的方案也更简明,而程序本身也更独立于具体的终端。在编写这类程序时,使用curses函数库更比直接使用escape转义序列容易得多。curses函数库还可以对键盘进行管理,...

    cd管理系统程序 linux

    界面部分:本程序基于Linux下运行,所以暂时用curses函数库来编写其文本屏幕。分为两个文本窗口和pad窗口实现其选项。 逻辑部分:通过unixC系统函数实现对其的输入输出管理,数据更新,用户操作管理,软件运行失败时...

    ncurses-devel-5.5-24.20060715.x86_64.rpm

    Ncurses是一个能提供功能键定义(快捷键),屏幕绘制以及基于文本终端的图形互动功能的动态库。 Ncurses是一个能提供基于文本终端窗口功能的动态库. Ncurses可以: 只要您喜欢,您可以使用整个屏幕 创建和管理一个...

    i9n:快速的cljs + nodejs终端(curses)声明式UI

    对于复杂curses应用程序(例如文件管理器,音乐播放器,基于ascii的游戏,甚至是文本编辑器)的中坚力量,除了对core.async的使用以外,对其余代码几乎没有足够的见解,因此它们始终是一个库,而不是一个框架core....

    ncurses安装包

    ncurses(new curses)是一个提供应用程序编程接口(API)的编程库,允许程序员以独立于终端的方式编写基于文本的用户界面。它是用于开发在终端仿真器下运行的“类似GUI的” 应用程序软件的工具包。它还优化了屏幕...

    Linux程序设计中文第4版.part3

    第6章 使用curses函数库管理基于文本的屏幕 第7章 数据管理 第8章 MySQL 第9章 开发工具 第10章 调试 第11章 进程和信号 第12章 POSIX线程 第13章 进程间通信:管道 第14章 信号量、共享内存和消息...

    Linux程序设计中文第4版.part2

    第6章 使用curses函数库管理基于文本的屏幕 第7章 数据管理 第8章 MySQL 第9章 开发工具 第10章 调试 第11章 进程和信号 第12章 POSIX线程 第13章 进程间通信:管道 第14章 信号量、共享内存和消息...

    Linux程序设计中文第4版.part1

    第6章 使用curses函数库管理基于文本的屏幕 第7章 数据管理 第8章 MySQL 第9章 开发工具 第10章 调试 第11章 进程和信号 第12章 POSIX线程 第13章 进程间通信:管道 第14章 信号量、共享内存和消息队列 第...

    C指针原理教程之Ncurses介绍

    Ncurses是一个能提供功能键定义(快捷键),屏幕绘制以及基于文本终端的图形互动功能的动态库。 Ncurses是一个能提供基于文本终端窗口功能的动态库. Ncurses可以: · 只要您喜欢,您可以使用整个屏幕 · 创建和管理一个...

    UNIX操作系统教程 张红光

    第1章绪论.1 1.1操作系统概述1 1.1.1建立操作系统的目标1 1.1.2操作系统是用户与计算机的接口1 1.1.3操作系统是资源管理器2 1.2UNIX系统的主要特性3 1.3UNIX系统的发展史4 1.4开源软件与UNIX的推广发展6 1.4.1开源...

    Linux程序设计 第4版.haozip01

    第6章 使用curses函数库管理基于文本的屏幕 175 6.1 用curses函数库进行编译 175 6.2 curses术语和概念 176 6.3 屏幕 178 6.3.1 输出到屏幕 179 6.3.2 从屏幕读取 180 6.3.3 清除屏幕 180 6.3.4 移动光标 180...

    Linux程序设计 第4版.haozip02

    第6章 使用curses函数库管理基于文本的屏幕 175 6.1 用curses函数库进行编译 175 6.2 curses术语和概念 176 6.3 屏幕 178 6.3.1 输出到屏幕 179 6.3.2 从屏幕读取 180 6.3.3 清除屏幕 180 6.3.4 移动光标 180...

Global site tag (gtag.js) - Google Analytics