📄 corses笔记.txt
字号:
如何开始我的第一个 curses 程序?
在开始使用 curses 的一切命令之前, 您必须先利用 initscr()这个函数
来开启 curses 模式.
相对的, 在结束 curses 模式前 ( 通常在您结束程序前 ) 也必须以
endwin()来关闭 curses 模式.
#include <curses.h>
main()
{
initscr();
: :
: :
: :
endwin();
}
这是一般 curses 程序标准的模式.
/////////////////////////////
编译:gcc -o t t.c -lcurses
////////////////////////////
□ initscr()
initscr() 是一般 curses 程序必须先呼叫的函数, 一但这个函数
被呼叫之後, 系统将根据终端的形态并启动 curses 模式.
□ endwin()
curses 通常以呼叫 endwin() 来结束程序. endwin() 可用来关闭
curses 模式, 或是暂时的跳离 curses 模式.如果您在程序中须要
call shell ( 如呼叫 system() 函数 ) 或是需要做 system call,
就必须先以 endwin() 暂时跳离 curses 模式. 最後再以
wrefresh() doupdate() 来重返 curses 模式.
□ cbreak()
nocbreak()
当 cbreak 模式被开启後, 除了 DELETE 或 CTRL 等仍被视为特殊
控制字元外一切输入的字元将立刻被一一读取.当处於 nocbreak 模
式时, 从键盘输入的字元将被储存在 buffer 里直到输入 RETURN
或 NEWLINE.在较旧版的 curses 须呼叫 crmode(),nocrmode() 来
取代 cbreak(),nocbreak()
□ nl()
nonl()
用来决定当输入资料时, 按下 RETURN 键是否被对应为 NEWLINE 字
元 ( 如 \n ).
而输出资料时, NEWLINE 字元是否被对应为 RETURN 和 LINDFEED
系统预设是开启的.
□ echo()
noecho()
此函数用来控制从键盘输入字元时是否将字元显示在终端上.系统
预设是开启的.
□ intrflush(win,bf)
呼叫 intrflush 时须传入两个值:
win 为一 WINDOW 型态指标, 通常传入标准输出入屏幕 stdscr
bf 为 TRUE 或 FALSE
当 bf 为 true 时, 当输入中断字元 ( 如 break) 时, 中断的反应
将较为快速.但可能会造成屏幕的错乱.
□ keypad(win,bf)
呼叫 keypad 时须传入两个值:
win 为一 WINDOW 型态指标, 通常传入标准输出入屏幕 stdscr
bf 为 TRUE 或 FALSE
当开启 keypad 後, 可以使用键盘上的一些特殊字元, 如上下左右
等方向键, curses 会将这些特殊字元转换成 curses.h 内定义的一
些特殊键. 这些定义的特殊键通常以 KEY_ 开头.
□ refresh()
refresh() 为 curses 最常呼叫的一个函数.
curses 为了使屏幕输出入达最佳化, 当您呼叫屏幕输出函数企图改
变屏幕上的画面时, curses 并不会立刻对屏幕做改变, 而是等到
refresh() 呼叫後, 才将刚才所做的变动一次完成. 其馀的资料将
维持不变. 以尽可能送最少的字元至屏幕上. 减少屏幕重绘的时间.
如果是 initscr() 後第一次呼叫 refresh(), curses 将做清除萤
幕的工作.
■ 光标的控制
move(y,x) 将光标移动至 x,y 的位置
getyx(win,y,x) 得到目前光标的位置
(请注意! 是 y,x 而不是 &y,&x )
■ 有关清除屏幕的函数
clear()
erase() 将整个屏幕清除
(请注意配合refresh() 使用)
■ 如何在屏幕上显示字元
echochar(ch) 显示某个字元
addch(ch) 显示某个字元
mvaddch(y,x,ch) 在(x,y) 上显示某个字元
相当於呼叫 move(y,x);addch(ch);
addstr(str) 显示一串字串
mvaddstr(y,x,str) 在(x,y) 上显示一串字串
相当於呼叫 move(y,x);addstr(str);
printw(format,str) 类似 printf() , 以一定的格式输出至屏幕
mvprintw(y,x,format,str) 在(x,y) 位置上做 printw 的工作.
相当於呼叫 move(y,x);printw(format,str);
■ 如何从键盘上读取字元
getch() 从键盘读取一个字元 (注意! 传回的是整数值)
getstr() 从键盘读取一串字元
scanw(format,&arg1,&arg2...) 如同 scanf, 从键盘读取一串字元
====================
=====================
======================
■ 如何利用方向键
curses 将一些如方向键等特殊控制字元, 以 KEY_ 为开头定义在 curses.h
这个档案里头, 如 KEY_UP 即代表方向键的 " ↑ ". 但, 如果您想使用
curses.h 所为您定义的这些特殊键的话, 您就必须将 keypad 设定为
TRUE. 否则, 您就必须自己为所有的特殊键定义了.
curses.h 为一些特殊键的定义如下:
KEY_UP 0403 ↑
KEY_DOWN 0402 ↓
KEY_LEFT 0404 ←
KEY_RIGHT 0405 →
KEY_HOME 0406 Home key (upward+left arrow)
KEY_BACKSPACE 0407 backspace (unreliable)
KEY_F0 0410 Function keys.
KEY_F(n) (KEY_F0+(n)) Formula for f .
KEY_NPAGE 0522 Next page
KEY_PPAGE 0523 Previous page
一并为您列出其他常用的一些特殊字元
[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,'|','-');
将以 | 及 - 围成一个方框
////////////////////////////////////////////////////////
///////////////////////////////////////////////////////
■ 视窗的建立
视窗的建立, 以 newwin() 这个函式来完成. 同时, 需宣告此视窗为 WINDOW
结构变数.
WINDOW *newwin(lines,colums,start_y,start_x);
WINDOW *win;
win=newwin(10,20,0,0);
如此, 将以 (0,0) 为原点, 取一个 10 列 20 行的矩形为一新的视窗. 今後
我们只要呼叫 win 这个变数, 就可以对这新视窗做处理.
如: wmove(win,3,2);
■ 多视窗处理函式的格式
这一类函式和一般的基本函式极为类似, 几乎每一个基本函式都有一个对应的
视窗处理函式. 一般将 'w' 加在函式的里头作为区别, 'w' 乃 'window' 之
意. 另外, 因为可同时处理多个视窗, 在呼叫使用时, 需特别指定欲处理的视
窗. 当然, 如果您指定对 stdscr 做处理, 由於是对标准输出入萤幕处理, 其
作用将相当於一般基本的函式.
如:
wmove(win,y,x) 即对 win 这个视窗做 move() 动作.
wmove(stdscr,y,x) 相当於 move(y,x)
////////////////////////////////////////////////////////
■ 视窗内的座标系
视窗内的座标系, 将以此视窗的起始点为新原点, 并以其相对位置作为新的
座标. 举例来说
win=newwin(10,20,5,5);
wmove(win,2,3);
将以 (5,5) 为新原点, y 方向移动 2 单位, x 方向移动 3 单位. 因此实际
上, 游标将移动至 y=7 x=8 的位置上.
////////////////////////////////////////////////////////////
■ 视窗的卷动
视窗的卷动, 掖Q用来配合视窗的处理, 当我们持续对视窗输出直到视窗的游
标移动至最後一列时, 如果我们再输出一列或是输出一个换行字元时, 视窗可
整个往上卷动一行. 这对我们撰写一个编辑程式时, 是尤其重要的, 一个画面
无法卷动的编辑器, 势必无法处理超过一个萤幕大小的档案.
视窗的卷动是预设为关闭的, 并以 scrollok() 来控制开闭.
scrollok(win,TRUE); 开启
scrollok(win,FALSE); 关闭
=================================================
=================================================
============显示不同颜色==============
======================
1.开一个 new window (newwin)
: 2.设定 window 的彩色属性 (wattrset)
==> 在设定彩色属性之前应该先设定颜色的 "pair" ,所谓的 "pair" 是指
foreground及background的颜色。curses的颜色有下面几种 (type为
short) :
COLOR_BLACK, COLOR_RED, COLOR_GREEN, COLOR_YELLOW, COLOR_BLUE,
COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE
用init_pair(short pair, short f_color, short b_color)来设定 pair,
for example:
init_pair(100, COLOR_RED, COLOR_BLUE)
就设定了编号为 100, 蓝底红字的 color pair 了.
另外你要是嫌这几种颜色太单调了, 可以用 init_color 来设定色彩, 细节
这边就不谈了.
然後就用 wattrset(WINDOW* pwindow, short color_pair)设定你window的
颜色, for example:
wattrset(pwindow, 100) 就设定了一个蓝底红字的 window (不要忘记
这儿的 100 是刚刚用 init_pair设定的值)
: 3.印在 window 的字就自动变成那个颜色了 (mvwprintw, mvwaddstr, ...)
==> 这句... 该不会有问题吧.
: 4.想要印不同颜色的字,只要把那个字 "OR" (|) 不同的颜色即可 (记住,
: 这种有属性的字要用 int,不能用 char)
==> 其实型别不是用 int, 而是用 chtype (不过没有差别, 去查查 curses.h就
知道) , 譬如说, 你想要在刚刚设定为蓝底红字的 window印一个别的颜色的
'A' 字, 可以这麽做 :
init_pair(another_color_pair, COLOR_随便, COLOR_随便) -->先设定另一
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -