用curses输出HelloWorld(curses笔记一)

用curses输出HelloWorld

  Linux/Unix编程往往都是在终端下进行的,但即使是基础文本的编程依然能够尽可能地实现很多图形控制,像vi可以实现在终端中全屏的编辑器就是基于curses的一个具体实现。

  curses的名字起源于"cursor optimization",即光标优化。它最早由有美国伯克利大学的Bill Joy和Ken Arnold编写的,用来处理一个游戏rogue的屏幕显示。后来贝尔实验室的Mark Horton在System III Unix中重新编写了curses。现在几乎所有的Unix/Linux操作系统都带了curses函数库,curses也加入了对鼠标的支持,一些菜单和面板的处理。

  以Ubuntu为例,安装curses库的命令行如下:

sudo apt-get install libncurses5-dev

事实上Linux中使用的很可能是ncurses(new curses)。

  基于curses的HelloWorld:

#include 
#include 
#include 

int main(int argc, char **argv)
{
	initscr();
	
	move(5, 15);
	printw("%s", "Hello World");
	refresh();
	sleep(10);
	
	endwin();
	exit(EXIT_SUCCESS);
}

  需要注意的是 : 在编译时要加上 -lcurses(其实这个不用说也知道,并没什么要注意的…)

cc curses1.c -o curses1 -lcurses

  运行结果:
用curses输出HelloWorld(curses笔记一)_第1张图片

  上述代码中,有几句话是编写基于curses程序必须有的:

	initscr(); //初始化屏幕,initialize screen
...
	endwin(); //curses的重置操作,即恢复终端之前的样子
	exit(EXIT_SUCCESS); //这个不能算curses库的东西了吧......

  而在初始化与重置操作之间的部分中,几个函数的说明如下:

  • move函数用于移动光标。需要注意的是坐标原点在左上角,y轴正方向向下,x轴正方向向右。最重要的是坐标的表示法并不是(x, y)而是(y, x),其实可以理解为先写第几行再写第几列。具体如下图:
    用curses输出HelloWorld(curses笔记一)_第2张图片
  • printw是基于curses的格式化打印函数,和printf的用法没什么不同。
  • 对于refresh函数需要知道逻辑屏幕和物理屏幕的区别。在curses中所谓的打印、显示到屏幕都是对于逻辑屏幕而言的,真正的屏幕(物理屏幕)并没有发生变化。仅当使用了refresh函数后,当前时刻逻辑屏幕上的内容就会替换掉当前时刻物理屏幕的内容。
  • 最后的sleep肯定不是curses的内容了…这仅仅为了让程序慢一点退出方便我截个图…

你可能感兴趣的:(LINUX_C笔记)