现在的位置: 首页 > 综合 > 正文

Linux下c语言的图形编程(转) curses.h 函式库

2012年09月07日 ⁄ 综合 ⁄ 共 21997字 ⁄ 字号 评论关闭
这是转贴哈,最近想吧TC的图形编程搞到LINUX下面来,所以就对其有所研究了哦。
http://tech.techweb.com.cn/viewthread.php?tid=181892
注明了转载,以后自己牛了再自己写,呵呵。先看看哈。

 
以下是UNIX下c语言的图形编程
^:N
C/f#u[%kp5nX%MTechWeb技术社区

#k;~Of.XX2H程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码UNIX下c语言的图形编程--curses.h 函式库
;k{�n^~        O}FF3I作者:不详  来源:supcode.com收集整理  发布时间:2005-7-22 19:39:36
J0X/?4L0BTTechWeb技术社区减小字体 增大字体
"CSJX"`Q
a,C9j G7EdL$`9N相信您在网路上一定用过如  tin,elm 等工具, 这些软体有项共同的特色,
efC8fV(Hk0g   即他们能利用上下左右等方向键来控制游标的位置.  除此之外, 这些程式
hq;Qw$xn'^4eP7F-?   的画面也较为美观. 对 Programming 有兴趣的朋友一定对此感到好奇, 也 8j
b sJ5D5g

   许他能在 PC 上用 Turbo C 轻易地写出类似的程式, 然而, 但当他将相同 tech.techweb.com.cnECU L(H#/U*Kh(g
   的程式一字不变地移到工作站上来编译时, 却出现一堆抓也抓不完的错误. 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码
Iq&D0Y]*zi;g

   其实, 原因很简单, 他使用的函式库可能在 UNIX 上是没有定义的.  有些
5E:s{ci   在 Turbo-C 上被广泛使用的一些函式, 可能在 UNIX 上是不被定义的.
z9A5s(_stech.techweb.com.cnTechWeb技术社区(h9lRF||j
go2z"bJ

   为了因应网路上各式各样的终端机形态  (terminal), UNIX 上特别发展出
8^9PONub8qptech.techweb.com.cn   一套函式库, 专门用来处理 UNIX 上游标移动及萤幕的显示.  这就是本篇
BeM�T&Cd&Uf u)FTechWeb技术社区   文章要为您介绍的 - curses.h 函式库.  利用这个函式库, 您也可以写出 -f1f7^z0[?9x
   像 elm 般利用方向键来移动光棒位置的程式. (CCCA 近来所提供的线上选
JX1G(uekj+hqh#wtech.techweb.com.cn   课程式, 及程式服务界面, 即是笔者利用 curses 发展而成的 )
(^CPeT}6{
n/z}        n        G'YK
k|.g`H�y/jK?程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码■ curses 的历史与版本 ~lUhl-iXW
t/~,X8m8FGXlG
   cureses 最早是由柏克莱大学的 Bill Joy 及 Ken Arnold 所发展出来的. 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码
mh&CC)L
o/d

   当时发展此一函式库主要原因是为了提高程式对不同终端机的相容性而设
S$r(Et]3E
a3Yw程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码
   计的.  因此, 利用 curses  发展出来的程式将和您所使用的终端机无关.
O,@mf0]-L
b
   也就是说, 您不必担心您的程式因为换了一部终端机而无法使用.  这对程 'T(v%B8l/|
Xya

   式设计师而言,    尤其是网路上程式的撰写,    是件相当重要的一件事. ~}E*^(E
   curses之所以能对上百种以上的终端机工作,  是因为它将所有终端机的资
*kX;Q'q X$/   料, 存放在一个叫 termcap 的资料库, ( 而在第二版的 System V 系统中 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码O+cU2H$O
   , 新版的 curses 以 terminfo 取代原来的 termcap). 有了这些记录, 程 tech.techweb.com.cn
E4b9o(t�@`

   式就能够知道遇到哪一种终端机时,   须送什麽字元才能移动游标的位置,
1`9}?
]2M!orjZ
~
   送什麽字元才能清除整个萤幕清除. (* 注一)
]        pR"F,G
Nf/I
8g$ifHw)f j~'lT
   另外, 本文的介绍 以 System V 的 curses 版本为主. tech.techweb.com.cng"E        m%F1|

6n$kZW1ky
?^[,z3f
hIXtech.techweb.com.cn
■ 如何在您的程式使用 curses ? 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码5K'r8FT([{P
"nY0j
^GY0nd

   在您的 C 程式的档头将  <curses.h> include 进来.当您引进  curses.h
0^^Yt?mtech.techweb.com.cn   这个函式库後, 系统会自动将 <stdio.h> 和 <unctl.h>一并  include 进
7["]d/8t        }   来.另外,  在  System  V  版本中, <terminfo.h>  这个函式库也将一并 TechWeb技术社区0Te9f(hU
   include进来.
8ZJqW        o/A~*wyTechWeb技术社区/jx.P/z@J&aqe|)i
    #include <curses.h>
)W4G~6W)ji
~`%CUBTpS        c

    main()
-WT)qbQ"u,h(_,UB6{U    { -j6f5@ z+zHj_r
     :  : 8^j['yV9f6w*g
     :  : 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码7b^Nk@6?I!r
    }
4?y+?+DpuTechWeb技术社区
;bW�Il3uT-Htech.techweb.com.cn   当然, 您的系统内必须放有 curses.h 这个函式库. tech.techweb.com.cn�Nqh3wX*F_
_vo&`&gNZ+e5rP

&l@1e%v-/k
Q
■ 如何编译(compile)
&|TCw%J
/j/XNX L0I7xU7}   当您编辑好您的程式, 在 UNIX 提示符号下键入: tech.techweb.com.cn-/jD1VM/

/y:OkK
`+Z
     % /usr/5bin/cc

-lcurses
7v(|7nfjPd                              ^^^^^^^
Ml.x
X)R/i0E&~6Ul程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码
                              引进 curses.h 这个 library
'v0Mr�A'?)LAL9XK3`
:@'txtfETechWeb技术社区   或 % /usr/5bin/cc -lcurses -ltermlib TechWeb技术社区�V        e[(tQi
TechWeb技术社区'EO$/_](Fq
     (*注二)
pQ,a9|PD&C

ZQD8ELT~HO

m&E// vd(zzTechWeb技术社区■ 如何开始我的第一个 curses 程式?
XH!T#PzTechWeb技术社区
%pOwg"O@bZE(|�R程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码   在开始使用 curses 的一切命令之前, 您必须先利用  initscr()这个函式 gk,Kwr,Y[] e9lC
   来开启 curses 模式.
$xO)M L:XqRR9oJ8?q
"hf7F8F|   相对的, 在结束  curses  模式前  ( 通常在您结束程式前  )  也必须以 ]Q
hT8[ e+|^

   endwin()来关闭 curses 模式. J/EU{`5J

!oX}xiw/N    #include <curses.h> TechWeb技术社区/p
I}2j

s-HA+k0|Y|h�[TechWeb技术社区    main() e,?d(Sb+V0oo%{        l
    { E`$@'KEJ
      initscr();
(O:SQ@a?a,Qtech.techweb.com.cn      :  :

pU*ms(m!Nc!rtech.techweb.com.cn
      :  : TechWeb技术社区!hq!F{4?!x7_'n"w
      :  : &}Q.L!V|^4DY$@m
      endwin(); tech.techweb.com.cn"M;G*P,`dN+~-K
    }
y;ELOcLCDtech.techweb.com.cn
1_X@
|u0q%j程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码
   这是一般 curses 程式标准的模式.
n`r2e(g|*v
^&`-psGfHTechWeb技术社区   此外, 您可以就您程式所须, 而做不同的设定. 当然, 您可以不做设定,而
2CP)PY#yo#JC&vs   只是呼叫 initscr().
m$k#r#X8u程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码0VD#Y;X2c
   您可以自己写一个函式来存放所有您所须要的设定.  平常使用时, 只要呼
s�yn8Nwht   叫这个函式即可启动 curses 并完成一切设定.
n%sH%|wIG
n:ytech.techweb.com.cn
程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码7t        ])Nj1N
Y4Q

   下面的例子, 即是笔者将平常较常用的一些设定放在一个叫 initial()的函 rn,I/TZ/RgV*E

ZoAw"i
H
[
   式内.
9D!j/L]�kn[tech.techweb.com.cnTechWeb技术社区Z z}X        gh2R(a
     void initial()
+l'q%A6EGpt|    {
*dC-r&/E5]C,XTechWeb技术社区      initscr();
A"PhZlN6~程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码      cbreak();
kJ q(U4Fm|7gv/      nonl();
_9Q3IB;W%k_0w4d xtech.techweb.com.cn      noecho(); 7d
a.q)Y!J`Z8A0[

      intrflush(stdscr,FALSE);
D-XU'g5@)Vtech.techweb.com.cn      keypad(stdscr,TRUE); .Sr/vl]_6@Y9z
      refresh(); tech.techweb.com.cn]4~a
Eq~

     }
Z5|%?o dj-LTechWeb技术社区
Oa;OZ z,I+@W
gG1D.hT&TWd1l2fsf  各函式分别介绍如下:
;S+y4Hd$tt7Z!Rz        u程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码F�Sl|+m"[-AQ3|.F
    □ initscr()
]        Z/Ba%Gtech.techweb.com.cn
EHgKaX$F9Wtech.techweb.com.cn         initscr()  是一般 curses 程式必须先呼叫的函数, 一但这个函数
H;iS        O4V?         被呼叫之後, 系统将根据终端机的形态并启动 curses 模式.
Ds4a([Zx1N4B:YoTechWeb技术社区Y
i]z-{5^;r}&r8Gx7@

,t7j {$F0qC;L[iT
    □ endwin() 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码
G:v;W/h%d)L

z%rJ-/_
         curses 通常以呼叫 endwin() 来结束程式.  endwin() 可用来关闭
Gz0ajI6T         curses 模式, 或是暂时的跳离  curses 模式.如果您在程式中须要 f!/,{T;pMr!n
         call shell ( 如呼叫 system() 函式 ) 或是需要做 system call,
e$^vB/Zv,nc%?        P         就必须先以   endwin()   暂时跳离   curses  模式.   最後再以 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码M)[ C9S._m.z
         wrefresh() doupdate() 来重返 curses 模式. TechWeb技术社区)j(K(fL0_M7u
`S{!?

&{X$Uc QuN程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码tech.techweb.com.cnzx�m8A}uD(j
    □ cbreak()

p%Y6Q�M0j(Ha-`
       nocbreak()
        rR(q5i
I3c$T,G&aT

Z'~W
rdV*j/
         当 cbreak  模式被开启後, 除了 DELETE 或 CTRL 等仍被视为特殊
_|C5/;r3MU        `         控制字元外一切输入的字元将立刻被一一读取.当处於 nocbreak 模 TechWeb技术社区%O?M O:qe2t?m
         式时, 从键盘输入的字元将被储存在  buffer 里直到输入  RETURN tech.techweb.com.cn^w1A(zc@(Ap        |�S
         或 NEWLINE.在较旧版的 curses 须呼叫 crmode(),nocrmode() 来 tech.techweb.com.cn5M'[�e#RU:w)Y        E.Qh
         取代 cbreak(),nocbreak()
-UKe.quo%H'Y8aTechWeb技术社区js(^e
c/lv

"oB
m@#w1BijN-/
    □ nl() #G/aHGl+xW1x3O8~
       nonl() i2||Wc(y�dL:e
u'W0R/(d!T+L6t
         用来决定当输入资料时, 按下 RETURN 键是否被对应为 NEWLINE 字
Bpb        o _tech.techweb.com.cn         元 ( 如 /n ).
W        TO7fytech.techweb.com.cn         而输出资料时, NEWLINE  字元是否被对应为  RETURN 和 LINDFEED
"t8}0@uG$w         系统预设是开启的.
'O'r1v^,S/B-?
0q.FQW:?4E-O9/-rI,l"CD8E

*X+WQ2m4`/_7xGJ([h    □ echo() tech.techweb.com.cnV2y/J${N
       noecho()
9]"K1T%a$fn!F'Q"QcTechWeb技术社区
x5X+y/r~tech.techweb.com.cn         此函式用来控制从键盘输入字元时是否将字元显示在终端机上.系统         B1R0{m*Z5e
         预设是开启的. tech.techweb.com.cnz4Z#H
}oG+{'B4/

@6s,B6o*B5f[{,aX

xe:Z$B(z+f    □ intrflush(win,bf)

W^^QA X(DNlH|J{TechWeb技术社区

.RS(cc;b#j$dTechWeb技术社区         呼叫 intrflush 时须传入两个值: P
g"oeA

         win 为一 WINDOW 型态指标, 通常传入标准输出入萤幕 stdscr @H%ic-Y!y-j,C
         bf 为 TRUE 或 FALSE
s!G2M[~
P�eJV#gp/c
程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码:a4X9w$V7uT9X w
         当 bf 为 true 时, 当输入中断字元 ( 如 break) 时, 中断的反应 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码0iEKB/M2V*W!lW
         将较为快速.但可能会造成萤幕的错乱. tech.techweb.com.cnru5@"/)zq3amE
J3{;|9Kh7w:A

-D/mDV"Uc.}jc
k;x7^`�QBlxtech.techweb.com.cn     □ keypad(win,bf)
%|/Zizr9d4o
(Yx5IE_程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码         呼叫 keypad 时须传入两个值:
_AL
uYJ
         win 为一 WINDOW 型态指标, 通常传入标准输出入萤幕 stdscr tech.techweb.com.cn0A^GU4j(w_g
         bf 为 TRUE 或 FALSE 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码~4a'K?,Y(B3@9[
tech.techweb.com.cn!ws qG&j
         当开启  keypad 後, 可以使用键盘上的一些特殊字元, 如上下左右 ;Bje6eb$Y
         等方向键, curses 会将这些特殊字元转换成 curses.h 内定义的一 a4WfD.rJw
         些特殊键. 这些定义的特殊键通常以 KEY_ 开头.
Q ?sM0{[ kTechWeb技术社区
$lQoc$r(J-qTechWeb技术社区
7dy,w%p|vtech.techweb.com.cntech.techweb.com.cn:b^4k2H"ai
     □ refresh() 0[:[        yb        d4N@
tech.techweb.com.cn/s
rR�YEf        y

         refresh() 为 curses 最常呼叫的一个函式. tech.techweb.com.cn+Y+DSobwW8@q

O5k3S-cEtech.techweb.com.cn         curses 为了使萤幕输出入达最佳化, 当您呼叫萤幕输出函式企图改 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码HI.{9D#Mz
         变萤幕上的画面时, curses  并不会立刻对萤幕做改变,  而是等到 tsmUCoY
         refresh() 呼叫後, 才将刚才所做的变动一次完成.  其馀的资料将 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码!oK#{M6Rb[
         维持不变. 以尽可能送最少的字元至萤幕上. 减少萤幕重绘的时间.
6N$]+iS1i         如果是 initscr() 後第一次呼叫  refresh(), curses 将做清除萤
^
hOqL9Gg)u
         幕的工作. ;{-M#O
[9UU#j

/`R&K!X2BZ6l|W]        ztech.techweb.com.cn
.i6Gv.@        rlS
g3TL%MPy3t4nQ1V&HE
]%h.C rGg

■ 游标的控制 6R5gG8@7J"Q!eV

'v'rhF#_,S2Xdtech.techweb.com.cn      move(y,x)       将游标移动至 x,y 的位置
4S4@XIwr0? xCU      getyx(win,y,x)  得到目前游标的位置 tech.techweb.com.cn8vgB@
B        QF&Ry

                      (请注意! 是 y,x 而不是 &y,&x ) I*YY
ILwgY]

u"[eFG!c{程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码
wfp4CI
m
B
■ 有关清除萤幕的函式
l$W,b'DOf&[;wv
Q7{W}%Z]v          clear() %g~&d5_ h k?S
          erase()   将整个萤幕清除 :sfN9rL-P?
                    (请注意配合refresh() 使用)
c%V+jk"^7XTechWeb技术社区J"Z3HW6Ju*c3S(a

upy3m;EIC■ 如何在萤幕上显示字元 i3O3sDvs;E
tech.techweb.com.cntR_-FK%b+k
    echochar(ch)              显示某个字元
&G
y/q/Zzk.e{TechWeb技术社区
MkX
whak4M;a!y        g

    addch(ch)                 显示某个字元
T3f8GE&A    mvaddch(y,x,ch)           在(x,y) 上显示某个字元 bC        v
O�h

                              相当於呼叫 move(y,x);addch(ch);
|NaMuUU3GTechWeb技术社区u,VIc"MN@r!W0Q
    addstr(str)               显示一串字串
c7oAidBTechWeb技术社区    mvaddstr(y,x,str)         在(x,y) 上显示一串字串 TechWeb技术社区$^L9v(Gz:yh
                              相当於呼叫 move(y,x);addstr(str);
5P%mu/M$lYqo1OTechWeb技术社区
i$A5G'i9Z    printw(format,str)        类似 printf() , 以一定的格式输出至萤幕
/&O-xk8K#g(KVTechWeb技术社区    mvprintw(y,x,format,str)  在(x,y) 位置上做 printw 的工作.
4wUE6ye;Bu4?
Nz
                              相当於呼叫 move(y,x);printw(format,str);
/~&]P3~*fb!G-sF@g!K
R.sl

z!T/jka LKm

l,Tu|,h~uzoTechWeb技术社区■ 如何从键盘上读取字元
U3h]/YAWcF程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码0I#VUa9f
     getch()                        从键盘读取一个字元 (注意! 传回的是
u iNr5Ytech.techweb.com.cn整数值)
K4e]BRF9Q]     getstr()                       从键盘读取一串字元 TechWeb技术社区&Q,EUig
     scanw(format,&arg1,&arg2...)   如同 scanf, 从键盘读取一串字元
IN}?Mk|TechWeb技术社区�oZ:`ii$r? v#H
     □例: $[hDM@q-D.P
tech.techweb.com.cn*vW!H
wW:?h

     int ch; d8x
v
M
{8AU

     char string1[80];   /* 请注意! 不可宣告为 char *string1; */
/uK&B;n(@x2Irtech.techweb.com.cn     char string2[80]; tech.techweb.com.cn2_mo}5HD4k
8f6HH9V)Hl.Y
     echo();            /* 开启 echo 模式, 使输入立刻显示在萤幕上 */
x"qFn1NY){�gL     ch=getch();
%U9xe2~.w]b/Z.Y     string1=getstr();
-S5_ h�|9d*K.KTechWeb技术社区     scanw("%s",string2);
uIn.s+|aM程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码     mvprintw(10,10,"String1=%s",string1); 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码&t-B`$p0I'BG+e(d
     mvprintw(11,10,"String2=%s",string2);
9L8VubOA5h4AaP程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码k?+U+XR3~
■ 如何利用方向键
$]xPC$E%T,N2FWO/_,o6^(it�F,]
   curses 将一些如方向键等特殊控制字元, 以 KEY_ 为开头定义在 curses.h
Y%N�o[4qE2|_]m#STechWeb技术社区
j-]O)EMdde'Y*SETechWeb技术社区   这个档案里头, 如 KEY_UP  即代表方向键的  " ↑ ".  但, 如果您想使用 )[ Q5o#/o2H8joa
tech.techweb.com.cn$C2zN_Z`
   curses.h  所为您定义的这些特殊键的话,  您就必须将   keypad  设定为
o%qDA`)q&~Qna1iD
   TRUE. 否则, 您就必须自己为所有的特殊键定义了.
vsNXVK7jCTechWeb技术社区
5St!V(f6SqM`9{  curses.h 为一些特殊键的定义如下:
by^H J
m/u        d$c4EV程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码    KEY_UP          0403           ↑
V2D1D"A*O']2T程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码    KEY_DOWN        0402           ↓ tech.techweb.com.cn? b0pJ#J
    KEY_LEFT        0404           ← 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码_)AoYAeE
    KEY_RIGHT       0405           → TechWeb技术社区K/
^`
JN:@d+mz

    KEY_HOME        0406           Home key (upward+left arrow) TechWeb技术社区;p6x
D_e7U        X.QA

    KEY_BACKSPACE   0407           backspace (unreliable)
nr8rll4?$u0p    KEY_F0          0410           Function keys.
]3K&?0}P+etech.techweb.com.cn    KEY_F(n)        (KEY_F0+(n))   formula for f . tech.techweb.com.cn-K        S?p'jp4Z8]?
Vq0{

    KEY_NPAGE       0522           Next page
7A%`3SY``&{(f
N
    KEY_PPAGE       0523           Previous page
Pz#Vd
oR?"WI(p

L.V(LVB;zPz3[2h   以上仅列出笔者较常使用的一些控制键, 至於其他控制键的定义, 请自行参
j~V/;H7Vyw;Q,S7C4Z0P2^s
w

   阅 man curses (* 注三) ?
RSj
YxQf)Z

_.]        a
Mm[
   一并为您列出其他常用的一些特殊字元 ]d
G+l5^
f'lx&?

H*E5S�TOaJ|    [TAB]                 /t
5}(M.Uwty8VL[TechWeb技术社区    [ENTER]               /r tech.techweb.com.cn!K0TM7O/J0U
    [ESC]                 27
q|SH.hs"fmtech.techweb.com.cn    [BACKSPACE]           127 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码/UkA.LO%n

~X4DQuZv
S*XD oF*FI5p;j$FTechWeb技术社区■ 如何改变萤幕显示字元的属性 TechWeb技术社区0[�tLE"uO2[

~!wF mq;?TechWeb技术社区   为了使输出的萤幕画面更为生动美丽,  我们常须要在萤幕上做一些如反白, TechWeb技术社区1K$E+GwYQ5f6]2o ]

W9_.Q r.Xv+BVP0r-fTechWeb技术社区   闪烁等变化.  curses 定义了一些特殊的属性, 透过这些定义, 我们也可以 7~Pl5o!ID-J"`&Ew
emi+Zy+J
   在 curses 程式□控制萤幕的输出变化. k,L8Kwo+fy7q!y"H
d;w/u2S_O#DJ3?A
    attron(mod)    开启属性 p4va+Tx_
PI

    attroff(mod)   关闭属性
U[)l-v(@5k
(`c!n7waA;M.@-q�xv/tech.techweb.com.cn   curses.h 里头定义了一些属性, 如:
l"OS"y
m(te

!b2M`(I/r9[hM    A_UNDERLINE    加底线
jM/bRQ%@    A_REVERSE      反白
%_)exc!P$b4LVms    A_BLINK        闪烁
)jF[2`
R
r5Da!y
    A_BOLD         高亮度 9FCM5D/mN5Z
    A_NORMAL       标准模式 (只能配合 attrset() 使用)
u        L.S:iod"r7jtech.techweb.com.cnvZ
vv
Q"RI^

!iY5b S']?
   当使用 attron() 开启某一种特殊属性模式後, 接下来在萤幕的输出都会以 J8QEC9a+XG

)[,^T/n5@ny   该种属性出现. 直到您呼叫 attroff() 将此模式关闭.
5be/5G6Fltech.techweb.com.cn        d9Y,S/,n{X
   请注意, 当您欲 attron() 开启另一种属性时, 请记得利用 attroff()先关
G7I6b7V&y5T程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码TechWeb技术社区x1^}2V+gncK"i        a
   闭原来的属性, 或直接以 attrset(A_NORMAL)  将所有特殊属性关闭.否则,
Z0?+W)e`cPR]b)o
pL5T"l&t&c        FT
C程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码
   curses 会将两种属性做重叠处理.
8LCZ EU4n f
rTechWeb技术社区
TechWeb技术社区|2IZ{5k(Fy1y
    □例: 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码7b        sYhG]#Sfun

jE6k?9X       attrset(A_NORMAL);            /* 先将属性设定为正常模式       */
        Y+AY%wV(g3h程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码
SY&fulTechWeb技术社区       attron(A_UNDERLINE);          /* 加底线                       */
'E4@[&sP4B1Ftech.techweb.com.cn程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码;`;~/abbI8[Z
       mvaddstr(9,10,"加底线");      /* 加底线输出一串字元           */ TechWeb技术社区8H{8CF0|5awt
程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码Yw(a!ko@t^ g
       attroff(A_UNDERLINE);         /* 关闭加底线模式, 恢复正常模式 */ sh@W`t
&Q'p C"sz*Zmf
       attron(A_REVERSE);            /* 开启反白模式                 */
AZ9}j.NJ$@p+Stech.techweb.com.cn
;~$i2C)p[       mvaddstr(10,10,"反白");       /* 输出一串反白字元             */ tech.techweb.com.cnW!N(@GM,q

7jBU&vM
n%`
       attroff(A_REVERSE);           /* 关闭反白模式, 恢复正常模式   */ Y:A1x/s9hi/zK.}
tech.techweb.com.cnn2Zj#{j
i
i

       attron(A_BLINK);              /* 开启闪烁模式                 */

u,u4J#r/q D:J_0X{
iTechWeb技术社区
q4w*usjXv!x/Y
zi6zSF

       mvaddstr(11,10,"闪烁");       /* 输出一串闪烁字元             */ +Rhx2}sF        Y1w
tech.techweb.com.cn4c@L4j
JY-a X

       attroff(A_BLINK);             /* 关闭闪烁模式, 恢复正常模式   */ TechWeb技术社区!SPA,_n{.Dc

h!~Y"D        Q/c(m7k5R#j
?
       attron(A_BOLD);               /* 开启高亮度模式               */ TechWeb技术社区!s        Abv["r]q

3@b,/%sT:|�kmtech.techweb.com.cn       mvaddstr(12,10,"高亮度");     /* 输出一串高亮度字元           */
&nIlW(F+T
k

'C�Ms;P;Sxtech.techweb.com.cn       attroff(A_BOLD);              /* 关闭高亮度模式, 恢复正常模式 */ uQOUr;BQ

(@2{{F'|tech.techweb.com.cng;_E7m}$s|

4][
Y3ka#Dr
■ 其他常用的一些函式 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码6A4rf(s"jN G!sf_;q1NN
~r~Q
c"D+j:U

      beep()              发出一声哔声
V0`[2fB9T,?r      box(win,ch1,ch2)    自动画方框  ch1: 画方框时垂直方向所用字元
8h{'l(O
d4[�`"BG%G
                                      ch2: 画方框时水平方向所用字元
K~pk$bTechWeb技术社区t}2])B2D-T_ABU
                                      example: box(stdscr,'|','-'); ga1_g%N G5e3d"E
                                      将以 | 及 - 围成一个方框
1A/nP4Qw2vx�rFV
/O-JEzK!^`"Q/J■ 应用完整□例
)I3K%}2|jT9C^ct)i
   下面所举的例子,  即完全利用刚刚所介绍的含式来完成.这个程式可将从键 zdh,W&/C7s
#TzM
kB W9Z@

   盘上读取的字元显示在萤幕上, 并且可以上下左右方向键来控制游标的位置
k9QKZ ~"Kttech.techweb.com.cnv~q
xGc{�sF

   , 当按下 [ESC] 後, 程式即结束. )m^_#j"H#u.E�iL
tech.techweb.com.cn S)oT)[8j
   您有没有发现, 这不就是一个简单全萤幕编辑器的雏形吗?
yL7J*yY3_�X9KN�f程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码
_-FSk?R~`(kO.JJTU;HJ7pc
  #include <curses.h>                  /* 引进 curses.h , 并自动引进
9t k3U3U/}stdio.h */ TechWeb技术社区'pN?
@M+}x

;enqWcma-NJc`]
wj.O%eb'_3WsF  #define StartX  1                    /* 决定游标初始位置 */
h6_'q-F8d!dh  #define StartY  1 TechWeb技术社区)r?E
a"Ys

%jal[|n4|'e程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码  void initial();
6J&zAhY4h$n
V.M]/A(W3l  main()
%G/(k)J�B!i�o  {
nF.u8I/b%j1qp4u+Qtech.techweb.com.cn     int x=StartX;                     /* 宣告 x,y 并设定其初值
n5Uz/`-?8Uj程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码     */
qjh        {|6yg,|(y/|"P程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码tech.techweb.com.cn%N7VeI8[gCT
     int y=StartY; ke`&Tv(R
     int ch;                           /* 宣告 ch 为整数,配合 getch()
4p/;P7B9Dk6^6t7mOW&d程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码使用   */ 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码`Z)A        z
UF$~w

tech.techweb.com.cn2[%/1C~g7EB9e C
TechWeb技术社区-KGH(^S~5{;H_b
     initial();                        /* 呼叫 initial(), 启动 curses 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码*}zQrt
模式,  */ 3_I5d;A9D]I;?:o

B4`0`+j|'[
At

                                       /* 并完成其它设定 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码k{E        DWT
     */
%B2l-m NxK程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码
"JT?%]:v7CoaNcntech.techweb.com.cn
rF$LZLS./!h     box(stdscr,'|','-');              /* 画方框
C4k`g$[T!Gn-{     */ 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,q8A{Il7}a2r
程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码$O*e)`
I&frp�S

X4g8^b1um)}BMbTechWeb技术社区     attron(A_REVERSE);                /* 开启反白模式
-ozKwcj
dWw
     */ tech.techweb.com.cn"c@VD+N`

^5dgf8]Z     mvaddstr(0,20,"Curses Program");  /* 在 (20,0) 处输出反白字元
uG t6T/n![6S8H$JTechWeb技术社区     */ tech.techweb.com.cn
Ub
O^:Y

&I+^{F;u,dtech.techweb.com.cn     attroff(A_REVERSE);               /* 关闭反白模式 Z7l8ezn4c/+{jQO
     */ tech.techweb.com.cnXq8Ls7@
LU)X2^9GkT}
/k8Gm6i,G
     move(x,y);                        /* 将游标移至初始位置
5wx'EF�mVtech.techweb.com.cn     */
~-x+WYChU1||tech.techweb.com.cn
6eCQ^0i"qUi*|Gi+r4L/%Mm*E'V
     do {                              /* 以无限回圈不断等待输入
2@N!F7L.YJP!]y:/*Mtech.techweb.com.cn     */
`I)hOQn!W        n^;ztech.techweb.com.cn
?8F){vk程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码      ch=getch();                      /* 等待自键盘输入字元
V9B
aS!U
      switch(ch) {                     /* 判断输入字元为何
SO6l_T.LTechWeb技术社区     */
3dgB{n|N2A

w7A!h)~7X"|8]+YB        ^
9i0y&wk(L
         case KEY_UP: --y;             /* 判断是否"↑"键被按下
9U@R'EmHtech.techweb.com.cn     */ 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码#D)`'U
_0J!a,JZ3p

y4WB,gB
                      break; 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码S+K8/a/b3?6h
         case KEY_DOWN: ++y;           /* 判断是否"↓"键被按下 TechWeb技术社区.t/EPd1J e#w
     */
v'h/px.h6C*~3{%j+M1WE
                      break; QE+e.JSM-Y
a+{

         case KEY_RIGHT: ++x;          /* 判断是否"→"键被按下 TechWeb技术社区^}uRR        y2SxU
     */
$|'}:vo2_(`0JhbG?�butR&?4a
                      break;
+^4/
z"N$hW;NTechWeb技术社区
         case KEY_LEFT: --x;           /* 判断是否"←"键被按下
P!~.{R4};@
j
     */
BZ        f.f5B程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码        F9]|$[
Zp(['O7X

                      break;
i7g9_+j)t        Dt_tech.techweb.com.cn         case '/r':                    /* 判断是否 ENTER 键被按下 C~KS7v^
     */ tech.techweb.com.cnm9a2g?0s.M1|F

*/)ly;|'`                   ++y; 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码[&cESf`6u+O7o(z
                   x=0; 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码^/J9y&tO
Vl!bY

                   break; "Q6FvH(P0t;S8y
         case '/t':                    /* 判断是否 TAB 键被按下 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码mAJ0?U
     */
^/Tjp-G1FprTechWeb技术社区Ux|8kj
                   x+=7;
K2n*^?xJ,R                   break;
/ql#UPUAO9t         case 127:                     /* 判断是否 BACKSPACE 键被按下
        T
@#Z-{yip+iM,i
     */ ra&/t"p6`O9~_
#e#fY3T.U/p
                    mvaddch(y,--x,' ');/* delete 一个字元 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码P0cP#u~+H|y*~?`U
     */ tech.techweb.com.cn]$]hu        p6H;n


c~iB)xOl)|1W
                    break; :u9E5sFC

m&u*D#r_{
SRtech.techweb.com.cn
         case 27: endwin();            /* 判断是否[ESC]键被按下
'Z
j-vD:W"rj/~TechWeb技术社区
     */ 7c/Hb8gj*n
^3`_$a5s"d
                  exit(1);             /* 结束 curses 模式
Wk7XXf;CO     */
#x9Y�b        zv+`6Etech.techweb.com.cn程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码X]*c-Ax&z2tlW
                                       /* 结束此程式
%P~cC(qoqeTechWeb技术社区     */
}9H,a
RZ2WlH.ZAtech.techweb.com.cn

X;Hx7xf3Wm$?tech.techweb.com.cnL}_y.S(@
         default: 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码oq1FNZ+@
                  addch(ch);           /* 如果不是特殊字元, 将此字元印
aT4l t0N"yC2MTechWeb技术社区出     */ TechWeb技术社区Z/3f        ?O;n7`#}

;foN;P@,PQ_9alTechWeb技术社区                  x++;
_
`!Y3n
[&Cf%m?+s
                  break; TechWeb技术社区6YPx!FsTlG!{
       } 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码
h7B`+WP)}#b9F

       move(y,x);                      /* 移动游标至现在位置
q-y8R*}h!b1`~tech.techweb.com.cn     */
:f3trB3Jtech.techweb.com.cnZ-@K/jI]T
     } while (1); 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码$r�_&X%`6`%Sr2T5v
   }
G-?~#m&L程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码
gCy%?J�E(FF

  void initial()                       /* 自定开启 curses 函式
*[#SH,n)vsPq`atech.techweb.com.cn     */ zb$mv%E#z7g�h
dshb:_&V
  {
1^wZs9uRtech.techweb.com.cn      initscr();
'u
{]!e%NN        z程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码
      cbreak();
jn,qH
U]tech.techweb.com.cn
      nonl();
pNpkD&~*M1i(Ctech.techweb.com.cn      noecho();
8U.h@NpEDjp程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码      intrflush(stdscr,FALSE);
/-V-Ypu`(l(@tech.techweb.com.cn      keypad(stdscr,TRUE); 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码2~^'e2?4^-PX9W
      refresh(); 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码 UDL$o�}*p6^5}
   }
T#xsm*hL?~tech.techweb.com.cn程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码9l3L!n$v3m6Z6[

-?^+?:yHSX程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码
kkG/|E_U        Bf■ 後记
!`0Py.|HTechWeb技术社区WuOVml7r6{:D�?
   学完了上述的一些命令,  相不相信您已经可以写出一个漂亮的全萤幕编辑 N-h?LM/3s        /7G
   器了? 事实上, curses 提供的函式不下  200 个, 可是笔者认为, 一切再
v-g2U        /9Nm]g
qTechWeb技术社区
   复杂的函式都可以用本文提到的一些组合变化而成,  学了太多的函式, 只
3B"GVkwF#S   是徒增自己困扰罢了.  当然,  如果您对其它函式有兴趣,  可以自行参阅 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码a:qyL.N.J
   curses 说明档.  ( 方法: % man curses ) 本文不过行抛砖引玉之效, 也
.m+tA_L;a-_+~#/   希望未来能陆续出现更多同学自行创作的程式.
(eA#Cl,v_-Nb1Ttech.techweb.com.cn7{*ZGzu;g        [;@]
    * 任何疑问及建议, 欢迎 e-mail 至 ljh@CCCA.NCTU.edu.tw. 谢谢 ! *
{j:Z$o%FR*/fTechWeb技术社区tech.techweb.com.cnTWz
Uj-/1B]gs

&A7? hf8n,_3N
l

3TQfb6H8c        N注一:
3om�`G]|'`0t
LTechWeb技术社区
    请参考 /usr/share/lib/termcup 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码K3sM-do
           /usr/share/lib/terminfo/s/sun
5AxP9f/nu5Mox~_-Gbb@~3bG)y@
注二: 2FD7_!BI�l/f+swd
    1.如果是 BSD 的版本, 需使用
%Nq-WB;Z;j5A
Alc
      cc

-lcurses -ltermcap 来完成 compile. Qu/@$e'RdW
    2.计中工作站不知何故将原来的 /usr/5bin/cc 更改为 /usr/5bin/cc.org tech.techweb.com.cn h;PapwV9wJ


y7B9HL)D
      因此, 您若想在计中工作站 compile curses 程式.需以 /usr/5bin/cc.
4lYS0~M!K-R1@tech.techweb.com.cnorg 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码|z-T        jOf
      取代 /usr/5bin/cc , 否则 compile 可能发生错误. 6oGB4_-p$zl.[S
    3.较旧版的 curses 需同时引进 curses 和 termlib 这两个 library, hd]l[
      因此, 您必须使用 /usr/5bin/cc

-lcurses -ltermlib 来 H/@*tn,K~
compile.
y        ^f2SZy)x1b程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码th,}Az/o
注三: TechWeb技术社区_
D@9Fn!S`-[

     根据笔者的经验, 上下左右方向键应可正常使用而不会发生问题, 但其它 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码um?N0I1O/
O$iI8d*M3D
     如 PgUp,PgDn,功能键,Home,End

抱歉!评论已关闭.