1. 程式人生 > >Linux下c語言的圖形程式設計(轉) curses.h 函式庫

Linux下c語言的圖形程式設計(轉) curses.h 函式庫

這是轉貼哈,最近想吧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/[email protected]&aqe|)i
    #include <curses.h>
)W4G~6W)ji
~`%CUBTpS        c

    main()
-WT)qbQ"u,h(_,UB6{U    { [email protected] z+zHj_r
     :  : 8^j['yV9f6w*g
     :  : 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼7b^[email protected]?I!r
    }
4?y+?+DpuTechWeb技術社群
;bW�Il3uT-Htech.techweb.com.cn   當然, 您的系統內必須放有 curses.h 這個函式庫. tech.techweb.com.cn�Nqh3wX*F_
_vo&`&gNZ+e5rP

&[email protected]%v-/k
Q
■ 如何編譯(compile)
&|TCw%J
/j/XNX L0I7xU7}   當您編輯好您的程式, 在 UNIX 提示符號下鍵入: tech.techweb.com.cn-/jD1VM/

/y:OkK
`+Z
     % /usr/5bin/cc [file.c] -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 [file.c] -lcurses -ltermlib TechWeb技術社群�V        e[(tQi
TechWeb技術社群'EO$/_](Fq
     (*注二)
pQ,a9|PD&C

ZQD8ELT~HO

m&E// vd(zzTechWeb技術社群■ 如何開始我的第一個 curses 程式?
XH!T#PzTechWeb技術社群
%pOwg"[email protected](|�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`[email protected]'KEJ
      initscr();
(O:[email protected]?a,Qtech.techweb.com.cn      :  :

pU*ms(m!Nc!rtech.techweb.com.cn
      :  : TechWeb技術社群!hq!F{4?!x7_'n"w
      :  : &}Q.L!V|^[email protected]
      endwin(); tech.techweb.com.cn"M;G*P,`dN+~-K
    }
y;ELOcLCDtech.techweb.com.cn
[email protected]
|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'[email protected])Vtech.techweb.com.cn      keypad(stdscr,TRUE); .Sr/vl][email protected]
      refresh(); tech.techweb.com.cn]4~a
Eq~

     }
Z5|%?o dj-LTechWeb技術社群
Oa;OZ z,[email protected]
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}&[email protected]

,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([email protected](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
[email protected]#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}[email protected]$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
         將較為快速.但可能會造成螢幕的錯亂. [email protected]"/)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([email protected][
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        [email protected]
tech.techweb.com.cn/s
rR�YEf        y

         refresh() 為 curses 最常呼叫的一個函式. [email protected]

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
[email protected]        rlS
g3TL%MPy3t4nQ1V&HE
]%h.C rGg

■ 遊標的控制 [email protected]"Q!eV

'v'rhF#_,S2Xdtech.techweb.com.cn      move(y,x)       將遊標移動至 x,y 的位置
[email protected]? xCU      getyx(win,y,x)  得到目前遊標的位置 [email protected]
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"[email protected]!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[email protected]!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
     □例: $[[email protected]
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;[email protected]�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/[email protected]   該種屬性出現. 直到您呼叫 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);          /* 加底線                       */
'[email protected][&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([email protected]^ g
       attroff(A_UNDERLINE);         /* 關閉加底線模式, 恢復正常模式 */ [email protected]`t
&Q'p C"sz*Zmf
       attron(A_REVERSE);            /* 開啟反白模式                 */
AZ9}[email protected]+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
[email protected]
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

[email protected],/%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 [email protected]

   盤上讀取的字元顯示在螢幕上, 並且可以上下左右方向鍵來控制遊標的位置
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"[email protected]+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
     */ [email protected]
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 {                              /* 以無限迴圈不斷等待輸入
[email protected]!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;             /* 判斷是否"↑"鍵被按下
[email protected]'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,下載,原始碼[email protected]
                  addch(ch);           /* 如果不是特殊字元, 將此字元印
aT4l t0N"yC2MTechWeb技術社群出     */ TechWeb技術社群Z/3f        ?O;n7`#}

;foN;[email protected],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.cn[email protected]/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();
[email protected]程式開發,作業系統,伺服器,原始碼下載,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技術社群
   複雜的函式都可以用本文提到的一些組合變化而成,  學了太多