⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 corses笔记.txt

📁 curses界面编程
💻 TXT
📖 第 1 页 / 共 4 页
字号:
如何开始我的第一个 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 + -