`
javasee
  • 浏览: 948930 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

使用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管理基于文本的屏幕

    ### 使用curses管理基于文本的屏幕 #### 一、curses简介 curses是一个用于创建基于文本的用户界面的库,它在Linux和类UNIX环境中非常流行。curses的重要性在于它提供了一个介于简单的基于行的程序和复杂的图形界面...

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

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

    python的curses库, win平台的各种whl包

    - 它提供了高级的文本输出和输入功能,比如分割屏幕、创建窗口、接受用户输入等,适合创建基于命令行的图形化界面。 - 在Windows系统上,curses库通常通过pdcurses或win32curses这样的移植版本来实现。 2. **whl...

    python_curses-2.2.2-cp312-cp312-win32.whl.zip

    **Python Curses**库是Python对原始C语言的`curses`库的封装,它提供了一套API,使得在基于文本的终端上创建图形用户界面成为可能。`curses`库可以处理键盘输入、屏幕输出和窗口管理,常用于控制台应用,如命令行...

    C语言学生成绩管理系统:使用curses函数库--源码

    curses库是用于处理文本模式用户界面的工具,特别是在没有图形窗口系统的情况下,它能够方便地在终端上进行屏幕管理和输入处理。通过使用curses,开发者可以更容易地控制屏幕输出和键盘输入,使得在命令行环境下也能...

    curses-2.2.1+utf8-cp37,py学习2048所需模块

    在Python编程领域,curses库是一个至关重要的工具,尤其在开发基于终端的用户界面时。curses库源于C语言,但在Python中被广泛使用,因为它允许开发者创建全屏交互式的应用程序,使得在命令行界面下的用户体验得以...

    Python-使用pythoncurses库创建的基于文本的多人游戏

    通过对这些文件的分析和学习,我们可以更深入地理解如何使用`curses`库来开发一个基于文本的多人游戏。这个项目可能包括了游戏规则、角色移动、碰撞检测、用户输入处理以及网络通信等方面的具体实现,这些都是游戏...

    python_curses-2.2.2-cp311-cp311-win_amd64.whl.zip

    在实际应用中,Python的curses库提供了许多函数和类,如`initscr()`用于初始化屏幕,`getch()`用于接收用户输入,`printw()`用于在屏幕上打印文本,以及`color_pair()`和`attron()`等用于设置颜色和文本属性。...

    python_curses-2.2.2-cp39-cp39-win32.whl.zip

    Python的curses库是用于创建基于终端的交互式应用程序的模块,它允许程序员在文本模式下处理用户输入和显示复杂的屏幕布局。`python_curses-2.2.2-cp39-cp39-win32.whl` 是一个专门为Python 3.9版本编译的curses库的...

    python_curses-2.2.2-cp311-cp311-win_arm64.whl.zip

    它能够管理屏幕上的窗口,处理键盘输入,以及更新屏幕内容,使得开发基于终端的应用程序变得更加简单。`curses`库的使用主要分为以下几个核心概念: 1. **窗口管理**:curses将屏幕划分为多个窗口,每个窗口可以...

    python_curses-2.2.2-cp39-cp39-win_amd64.whl.zip

    Python的curses库是一个在控制台上提供彩色和光标移动功能的模块,它使得开发者能够创建基于文本的用户界面。`python_curses-2.2.2-cp39-cp39-win_amd64.whl` 文件是这个库的一个预编译版本,专为Python 3.9构建,...

    PyCurses-使用python编写curses.pdf

    调试PyCurses程序通常涉及输出日志、使用调试器或专门的curses调试工具,以便跟踪屏幕更新和键盘事件。 总之,PyCurses为Python开发者提供了一个强大且灵活的工具,用于创建功能丰富的控制台应用程序,无论是在历史...

    817-0693-pdfOracle Solaris 9 - man pages section 3: Curses Libra

    curses.h 头文件定义了 Curses 库的 API,提供了各种函数和宏,用于创建和管理基于文本的用户界面。curses 库是 Curses 库的核心部分,提供了各种函数,用于创建和管理基于文本的用户界面。form 库是 Curses 库的一...

    Unix Curses 库导论-翻译版

    Curses 提供了一系列 API 来处理文本屏幕的操作: - `initscr`: 初始化 curses 模式 - `printw`: 在屏幕指定位置打印字符串 - `getch`: 获取用户按键 - `endwin`: 结束 curses 模式 ##### 6.3 属性 除了 API 外,...

    基于curses的简单弹球游戏

    1. **curses**:curses库是此项目的核心,它提供了一系列函数,用于管理屏幕上的文本布局、颜色、键盘输入处理等功能。在curses模式下,程序可以动态地更新屏幕,创建窗口、面板,并响应用户的按键事件,使得在字符...

    Curses-1.28.tgz

    Curses 是一个在文本模式下运行的库,用于创建基于终端的应用程序。它提供了一组高级函数,使得程序员可以方便地处理终端的显示、输入和颜色等特性,而无需关心底层的终端控制代码。Curses-1.28.tgz 是这个库的一个...

    Linux命令行终端图形界面编程库curses介绍

    - **文本编辑器**:如vim、nano等命令行编辑器,这些编辑器的界面都是基于curses构建的。 - **游戏开发**:如经典的《roguelike》游戏,这类游戏通常需要在有限的空间内展示大量信息。 - **脚本自动化**:编写用于...

    linux下使用curses库实现滚屏、彩色打印等个性化屏幕输出

    【curses库】是UNIX环境下用于处理终端交互的高级库,尤其适合开发基于文本界面的程序。它使得程序员能够方便地控制光标移动、屏幕显示和键盘输入,从而实现滚屏、彩色打印等功能,适用于各种不同类型的终端。curses...

    linux curses编程小游戏 源码

    Linux下的curses编程是一种在基于文本的终端上创建交互式用户界面的技术,它允许程序员创建动态更新的屏幕,类似于简单的图形界面。在这个“魔岛寻宝”游戏中,curses库被用来控制屏幕上的字符输出、读取用户输入,...

    Tutorial on Python Curses Programming

    尽管现在图形用户界面已经成为主流,但基于文本的用户界面仍然有着广泛的应用场景。在服务器管理、控制台应用开发等领域,curses 提供了一个强大的工具集来创建复杂的文本界面。此外,学习 curses 也有助于深入理解...

Global site tag (gtag.js) - Google Analytics