📄 unix下c语言的图形编程--curses.h 函式库.txt
字号:
KEY_NPAGE 0522 Next page
KEY_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_REVERSE 反白
A_BLINK 闪烁
A_BOLD 高亮度
A_NORMAL 标准模式 (只能配合 attrset() 使用)
当使用 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,'|','-');
将以 | 及 - 围成一个方框
■ 应用完整□例
下面所举的例子, 即完全利用刚刚所介绍的含式来完成.这个程式可将从键
盘上读取的字元显示在萤幕上, 并且可以上下左右方向键来控制游标的位置
, 当按下 [ESC] 後, 程式即结束.
您有没有发现, 这不就是一个简单全萤幕编辑器的雏形吗?
#include <curses.h> /* 引进 curses.h , 并自动引进
stdio.h */
#define StartX 1 /* 决定游标初始位置 */
#define StartY 1
void initial();
main()
{
int x=StartX; /* 宣告 x,y 并设定其初值
*/
int y=StartY;
int ch; /* 宣告 ch 为整数,配合 getch()
使用 */
initial(); /* 呼叫 initial(), 启动 curses
模式, */
/* 并完成其它设定
*/
box(stdscr,'|','-'); /* 画方框
*/
attron(A_REVERSE); /* 开启反白模式
*/
mvaddstr(0,20,"Curses Program"); /* 在 (20,0) 处输出反白字元
*/
attroff(A_REVERSE); /* 关闭反白模式
*/
move(x,y); /* 将游标移至初始位置
*/
do { /* 以无限回圈不断等待输入
*/
ch=getch(); /* 等待自键盘输入字元
switch(ch) { /* 判断输入字元为何
*/
case KEY_UP: --y; /* 判断是否"↑"键被按下
*/
break;
case KEY_DOWN: ++y; /* 判断是否"↓"键被按下
*/
break;
case KEY_RIGHT: ++x; /* 判断是否"→"键被按下
*/
break;
case KEY_LEFT: --x; /* 判断是否"←"键被按下
*/
break;
case '\r': /* 判断是否 ENTER 键被按下
*/
++y;
x=0;
break;
case '\t': /* 判断是否 TAB 键被按下
*/
x+=7;
break;
case 127: /* 判断是否 BACKSPACE 键被按下
*/
mvaddch(y,--x,' ');/* delete 一个字元
*/
break;
case 27: endwin(); /* 判断是否[ESC]键被按下
*/
exit(1); /* 结束 curses 模式
*/
/* 结束此程式
*/
default:
addch(ch); /* 如果不是特殊字元, 将此字元印
出 */
x++;
break;
}
move(y,x); /* 移动游标至现在位置
*/
} while (1);
}
void initial() /* 自定开启 curses 函式
*/
{
initscr();
cbreak();
nonl();
noecho();
intrflush(stdscr,FALSE);
keypad(stdscr,TRUE);
refresh();
}
■ 後记
学完了上述的一些命令, 相不相信您已经可以写出一个漂亮的全萤幕编辑
器了? 事实上, curses 提供的函式不下 200 个, 可是笔者认为, 一切再
复杂的函式都可以用本文提到的一些组合变化而成, 学了太多的函式, 只
是徒增自己困扰罢了. 当然, 如果您对其它函式有兴趣, 可以自行参阅
curses 说明档. ( 方法: % man curses ) 本文不过行抛砖引玉之效, 也
希望未来能陆续出现更多同学自行创作的程式.
* 任何疑问及建议, 欢迎 e-mail 至 ljh@CCCA.NCTU.edu.tw. 谢谢 ! *
注一:
请参考 /usr/share/lib/termcup
/usr/share/lib/terminfo/s/sun
注二:
1.如果是 BSD 的版本, 需使用
cc [file.c] -lcurses -ltermcap 来完成 compile.
2.计中工作站不知何故将原来的 /usr/5bin/cc 更改为 /usr/5bin/cc.org
因此, 您若想在计中工作站 compile curses 程式.需以 /usr/5bin/cc.
org
取代 /usr/5bin/cc , 否则 compile 可能发生错误.
3.较旧版的 curses 需同时引进 curses 和 termlib 这两个 library,
因此, 您必须使用 /usr/5bin/cc [file.c] -lcurses -ltermlib 来
compile.
注三:
根据笔者的经验, 上下左右方向键应可正常使用而不会发生问题, 但其它
如 PgUp,PgDn,功能键,Home,End 等特殊键, 很容易因机器, 键盘不同而无
法使用, 因此, 若您的程式须要在不同的机器上使用, 建议您只用方向键来
控制, 其它的特殊键少用为妙.
至於 PgUp,PgDn 一些特殊键的控制方法, 由於较为复杂, 有兴趣的同学可
参
考 tin 原始程式 curses.c 内所使用的一些方法.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -