Linux下c語言的圖形程式設計(轉) curses.h 函式庫
阿新 • • 發佈:2019-01-02
這是轉貼哈,最近想吧TC的圖形程式設計搞到LINUX下面來,所以就對其有所研究了哦。
http://tech.techweb.com.cn/viewthread.php?tid=181892
註明了轉載,以後自己牛了再自己寫,呵呵。先看看哈。
以下是UNIX下c語言的圖形程式設計
UNIX下c語言的圖形程式設計--curses.h 函式庫
作者:不詳 來源:supcode.com收集整理 釋出時間:2005-7-22 19:39:36
減小字型 增大字型
相信您在網路上一定用過如 tin,elm 等工具, 這些軟體有項共同的特色,
即他們能利用上下左右等方向鍵來控制遊標的位置. 除此之外, 這些程式
的畫面也較為美觀. 對 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 上是沒有定義的. 有些
在 Turbo-C 上被廣泛使用的一些函式, 可能在 UNIX 上是不被定義的.
TechWeb技術社群(h9lRF||j
go2z"bJ
為了因應網路上各式各樣的終端機形態 (terminal), UNIX 上特別發展出
一套函式庫, 專門用來處理 UNIX 上游標移動及螢幕的顯示. 這就是本篇
文章要為您介紹的 - curses.h 函式庫. 利用這個函式庫, 您也可以寫出 -f1f7^z0[?9x
像 elm 般利用方向鍵來移動光棒位置的程式. (CCCA 近來所提供的線上選
課程式, 及程式服務介面, 即是筆者利用 curses 發展而成的 )
■ curses 的歷史與版本 ~lUhl-iXW
t/~,X8m8FGXlG
cureses 最早是由柏克萊大學的 Bill Joy 及 Ken Arnold 所發展出來的. 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼
mh&CC)L
o/d
當時發展此一函式庫主要原因是為了提高程式對不同終端機的相容性而設
計的. 因此, 利用 curses 發展出來的程式將和您所使用的終端機無關.
也就是說, 您不必擔心您的程式因為換了一部終端機而無法使用. 這對程 'T(v%B8l/|
Xya
式設計師而言, 尤其是網路上程式的撰寫, 是件相當重要的一件事. ~}E*^(E
curses之所以能對上百種以上的終端機工作, 是因為它將所有終端機的資
料, 存放在一個叫 termcap 的資料庫, ( 而在第二版的 System V 系統中 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼O+cU2H$O
, 新版的 curses 以 terminfo 取代原來的 termcap). 有了這些記錄, 程 tech.techweb.com.cn
E4b9o(t�@`
式就能夠知道遇到哪一種終端機時, 須送什麼字元才能移動遊標的位置,
送什麼字元才能清除整個螢幕清除. (* 注一)
8g$ifHw)f j~'lT
另外, 本文的介紹 以 System V 的 curses 版本為主. tech.techweb.com.cng"E m%F1|
■ 如何在您的程式使用 curses ? 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼5K'r8FT([{P
"nY0j
^GY0nd
在您的 C 程式的檔頭將 <curses.h> include 進來.當您引進 curses.h
這個函式庫後, 系統會自動將 <stdio.h> 和 <unctl.h>一併 include 進
來.另外, 在 System V 版本中, <terminfo.h> 這個函式庫也將一併 TechWeb技術社群0Te9f(hU
include進來.
/jx.P/[email protected]&aqe|)i
#include <curses.h>
i
~`%CUBTpS c
main()
{ [email protected] z+zHj_r
: : 8^j['yV9f6w*g
: : 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼7b^[email protected]?I!r
}
當然, 您的系統內必須放有 curses.h 這個函式庫. tech.techweb.com.cn�Nqh3wX*F_
_vo&`&gNZ+e5rP
■ 如何編譯(compile)
當您編輯好您的程式, 在 UNIX 提示符號下鍵入: tech.techweb.com.cn-/jD1VM/
% /usr/5bin/cc [file.c] -lcurses
^^^^^^^
引進 curses.h 這個 library
或 % /usr/5bin/cc [file.c] -lcurses -ltermlib TechWeb技術社群�V e[(tQi
TechWeb技術社群'EO$/_](Fq
(*注二)
pQ,a9|PD&C
ZQD8ELT~HO
■ 如何開始我的第一個 curses 程式?
在開始使用 curses 的一切命令之前, 您必須先利用 initscr()這個函式 gk,Kwr,Y[] e9lC
來開啟 curses 模式.
相對的, 在結束 curses 模式前 ( 通常在您結束程式前 ) 也必須以 ]Q
hT8[ e+|^
endwin()來關閉 curses 模式. J/EU{`5J
#include <curses.h> TechWeb技術社群/p
I}2j
main() e,?d(Sb+V0oo%{ l
{ E`[email protected]'KEJ
initscr();
: :
: : TechWeb技術社群!hq!F{4?!x7_'n"w
: : &}Q.L!V|^[email protected]
endwin(); tech.techweb.com.cn"M;G*P,`dN+~-K
}
這是一般 curses 程式標準的模式.
此外, 您可以就您程式所須, 而做不同的設定. 當然, 您可以不做設定,而
只是呼叫 initscr().
0VD#Y;X2c
您可以自己寫一個函式來存放所有您所須要的設定. 平常使用時, 只要呼
叫這個函式即可啟動 curses 並完成一切設定.
程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼7t ])Nj1N
Y4Q
下面的例子, 即是筆者將平常較常用的一些設定放在一個叫 initial()的函 rn,I/TZ/RgV*E
式內.
TechWeb技術社群Z z}X gh2R(a
void initial()
{
initscr();
cbreak();
nonl();
noecho(); 7d
a.q)Y!J`Z8A0[
intrflush(stdscr,FALSE);
keypad(stdscr,TRUE); .Sr/vl][email protected]
refresh(); tech.techweb.com.cn]4~a
Eq~
}
各函式分別介紹如下:
F�Sl|+m"[-AQ3|.F
□ initscr()
initscr() 是一般 curses 程式必須先呼叫的函式, 一但這個函式
被呼叫之後, 系統將根據終端機的形態並啟動 curses 模式.
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() 可用來關閉
curses 模式, 或是暫時的跳離 curses 模式.如果您在程式中須要 f!/,{T;pMr!n
call shell ( 如呼叫 system() 函式 ) 或是需要做 system call,
就必須先以 endwin() 暫時跳離 curses 模式. 最後再以 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼M)[ C9S._m.z
wrefresh() doupdate() 來重返 curses 模式. TechWeb技術社群)j(K(fL0_M7u
`S{!?
tech.techweb.com.cnzx�m8A}uD(j
□ cbreak()
nocbreak()
當 cbreak 模式被開啟後, 除了 DELETE 或 CTRL 等仍被視為特殊
控制字元外一切輸入的字元將立刻被一一讀取.當處於 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()
TechWeb技術社群js(^e
c/lv
□ nl() #G/aHGl+xW1x3O8~
nonl() i2||Wc(y�dL:e
u'W0R/(d!T+L6t
用來決定當輸入資料時, 按下 RETURN 鍵是否被對應為 NEWLINE 字
元 ( 如 /n ).
而輸出資料時, NEWLINE 字元是否被對應為 RETURN 和 LINDFEED
系統預設是開啟的.
9/-rI,l"CD8E
□ echo() tech.techweb.com.cnV2y/J${N
noecho()
此函式用來控制從鍵盤輸入字元時是否將字元顯示在終端機上.系統 B1R0{m*Z5e
預設是開啟的. tech.techweb.com.cnz4Z#H
}oG+{'B4/
@6s,B6o*B5f[{,aX
□ intrflush(win,bf)
呼叫 intrflush 時須傳入兩個值: P
g"oeA
win 為一 WINDOW 型態指標, 通常傳入標準輸出入螢幕 stdscr @H%ic-Y!y-j,C
bf 為 TRUE 或 FALSE
程式開發,作業系統,伺服器,原始碼下載,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
□ keypad(win,bf)
呼叫 keypad 時須傳入兩個值:
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_ 開頭.
tech.techweb.com.cn:b^4k2H"ai
□ refresh() 0[:[ yb [email protected]
tech.techweb.com.cn/s
rR�YEf y
refresh() 為 curses 最常呼叫的一個函式. [email protected]
curses 為了使螢幕輸出入達最佳化, 當您呼叫螢幕輸出函式企圖改 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼HI.{9D#Mz
變螢幕上的畫面時, curses 並不會立刻對螢幕做改變, 而是等到 tsmUCoY
refresh() 呼叫後, 才將剛才所做的變動一次完成. 其餘的資料將 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼!oK#{M6Rb[
維持不變. 以儘可能送最少的字元至螢幕上. 減少螢幕重繪的時間.
如果是 initscr() 後第一次呼叫 refresh(), curses 將做清除螢
幕的工作. ;{-M#O
[9UU#j
4nQ1V&HE
]%h.C rGg
■ 遊標的控制 [email protected]"Q!eV
move(y,x) 將遊標移動至 x,y 的位置
getyx(win,y,x) 得到目前遊標的位置 [email protected]
B QF&Ry
(請注意! 是 y,x 而不是 &y,&x ) I*YY
ILwgY]
■ 有關清除螢幕的函式
clear() %g~&d5_ h k?S
erase() 將整個螢幕清除 :sfN9rL-P?
(請注意配合refresh() 使用)
J"Z3HW6Ju*c3S(a
■ 如何在螢幕上顯示字元 i3O3sDvs;E
tech.techweb.com.cntR_-FK%b+k
echochar(ch) 顯示某個字元
MkX
whak4M;a!y g
addch(ch) 顯示某個字元
mvaddch(y,x,ch) 在(x,y) 上顯示某個字元 bC v
O�h
相當於呼叫 move(y,x);addch(ch);
u,VIc"[email protected]!W0Q
addstr(str) 顯示一串字串
mvaddstr(y,x,str) 在(x,y) 上顯示一串字串 TechWeb技術社群$^L9v(Gz:yh
相當於呼叫 move(y,x);addstr(str);
printw(format,str) 類似 printf() , 以一定的格式輸出至螢幕
mvprintw(y,x,format,str) 在(x,y) 位置上做 printw 的工作.
相當於呼叫 move(y,x);printw(format,str);
[email protected]!K
R.sl
z!T/jka LKm
■ 如何從鍵盤上讀取字元
0I#VUa9f
getch() 從鍵盤讀取一個字元 (注意! 傳回的是
整數值)
getstr() 從鍵盤讀取一串字元 TechWeb技術社群&Q,EUig
scanw(format,&arg1,&arg2...) 如同 scanf, 從鍵盤讀取一串字元
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; */
char string2[80]; tech.techweb.com.cn2_mo}5HD4k
8f6HH9V)Hl.Y
echo(); /* 開啟 echo 模式, 使輸入立刻顯示在螢幕上 */
ch=getch();
string1=getstr();
scanw("%s",string2);
mvprintw(10,10,"String1=%s",string1); 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼&t-B`$p0I'BG+e(d
mvprintw(11,10,"String2=%s",string2);
程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼k?+U+XR3~
■ 如何利用方向鍵
O/_,o6^(it�F,]
curses 將一些如方向鍵等特殊控制字元, 以 KEY_ 為開頭定義在 curses.h
這個檔案裡頭, 如 KEY_UP 即代表方向鍵的 " ↑ ". 但, 如果您想使用 )[ Q5o#/o2H8joa
tech.techweb.com.cn$C2zN_Z`
curses.h 所為您定義的這些特殊鍵的話, 您就必須將 keypad 設定為
Qna1iD
TRUE. 否則, 您就必須自己為所有的特殊鍵定義了.
curses.h 為一些特殊鍵的定義如下:
KEY_UP 0403 ↑
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)
KEY_F0 0410 Function keys.
KEY_F(n) (KEY_F0+(n)) formula for f . tech.techweb.com.cn-K S?p'jp4Z8]?
Vq0{
KEY_NPAGE 0522 Next page
KEY_PPAGE 0523 Previous page
以上僅列出筆者較常使用的一些控制鍵, 至於其他控制鍵的定義, 請自行參
;Q,S7C4Z0P2^s
w
閱 man curses (* 注三) ?
RSj
YxQf)Z
一併為您列出其他常用的一些特殊字元 ]d
G+l5^
f'lx&?
[TAB] /t
[ENTER] /r tech.techweb.com.cn!K0TM7O/J0U
[ESC] 27
[BACKSPACE] 127 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼/UkA.LO%n
■ 如何改變螢幕顯示字元的屬性 TechWeb技術社群0[�tLE"uO2[
為了使輸出的螢幕畫面更為生動美麗, 我們常須要在螢幕上做一些如反白, TechWeb技術社群1K$E+GwYQ5f6]2o ]
閃爍等變化. 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) 關閉屬性
curses.h 裡頭定義了一些屬性, 如:
A_UNDERLINE 加底線
A_REVERSE 反白
A_BLINK 閃爍
A_BOLD 高亮度 9FCM5D/mN5Z
A_NORMAL 標準模式 (只能配合 attrset() 使用)
vZ
vv
Q"RI^
!iY5b S']?
當使用 attron() 開啟某一種特殊屬性模式後, 接下來在螢幕的輸出都會以 J8QEC9a+XG
該種屬性出現. 直到您呼叫 attroff() 將此模式關閉.
tech.techweb.com.cn d9Y,S/,n{X
請注意, 當您欲 attron() 開啟另一種屬性時, 請記得利用 attroff()先關
TechWeb技術社群x1^}2V+gncK"i a
閉原來的屬性, 或直接以 attrset(A_NORMAL) 將所有特殊屬性關閉.否則,
curses 會將兩種屬性做重疊處理.
TechWeb技術社群|2IZ{5k(Fy1y
□例: 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼7b sYhG]#Sfun
attrset(A_NORMAL); /* 先將屬性設定為正常模式 */
attron(A_UNDERLINE); /* 加底線 */
程式開發,作業系統,伺服器,原始碼下載,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); /* 開啟反白模式 */
mvaddstr(10,10,"反白"); /* 輸出一串反白字元 */ tech.techweb.com.cnW!N(@GM,q
attroff(A_REVERSE); /* 關閉反白模式, 恢復正常模式 */ Y:A1x/s9hi/zK.}
tech.techweb.com.cnn2Zj#{j
i
i
attron(A_BLINK); /* 開啟閃爍模式 */
q4w*usjXv!x/Y
zi6zSF
mvaddstr(11,10,"閃爍"); /* 輸出一串閃爍字元 */ +Rhx2}sF Y1w
[email protected]
JY-a X
attroff(A_BLINK); /* 關閉閃爍模式, 恢復正常模式 */ TechWeb技術社群!SPA,_n{.Dc
attron(A_BOLD); /* 開啟高亮度模式 */ TechWeb技術社群!s Abv["r]q
mvaddstr(12,10,"高亮度"); /* 輸出一串高亮度字元 */
attroff(A_BOLD); /* 關閉高亮度模式, 恢復正常模式 */ uQOUr;BQ
tech.techweb.com.cng;_E7m}$s|
■ 其他常用的一些函式 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼6A4rf(s"jN G!sf_;q1NN
~r~Q
c"D+j:U
beep() 發出一聲嗶聲
box(win,ch1,ch2) 自動畫方框 ch1: 畫方框時垂直方向所用字元
ch2: 畫方框時水平方向所用字元
TechWeb技術社群t}2])B2D-T_ABU
example: box(stdscr,'|','-'); ga1_g%N G5e3d"E
將以 | 及 - 圍成一個方框
■ 應用完整□例
T9C^ct)i
下面所舉的例子, 即完全利用剛剛所介紹的含式來完成.這個程式可將從鍵 zdh,W&/C7s
#TzM
kB [email protected]
盤上讀取的字元顯示在螢幕上, 並且可以上下左右方向鍵來控制遊標的位置
tech.techweb.com.cnv~q
xGc{�sF
, 當按下 [ESC] 後, 程式即結束. )m^_#j"H#u.E�iL
tech.techweb.com.cn S)oT)[8j
您有沒有發現, 這不就是一個簡單全螢幕編輯器的雛形嗎?
`(kO.JJTU;HJ7pc
#include <curses.h> /* 引進 curses.h , 並自動引進
stdio.h */ TechWeb技術社群'pN?
@M+}x
#define StartX 1 /* 決定遊標初始位置 */
#define StartY 1 TechWeb技術社群)r?E
a"Ys
void initial();
main()
{
int x=StartX; /* 宣告 x,y 並設定其初值
*/
tech.techweb.com.cn%N7VeI8[gCT
int y=StartY; ke`&Tv(R
int ch; /* 宣告 ch 為整數,配合 getch()
使用 */ 程式開發,作業系統,伺服器,原始碼下載,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
*/
box(stdscr,'|','-'); /* 畫方框
*/ 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼,q8A{Il7}a2r
程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼$O*e)`
I&frp�S
attron(A_REVERSE); /* 開啟反白模式
*/ tech.techweb.com.cn"[email protected]+N`
mvaddstr(0,20,"Curses Program"); /* 在 (20,0) 處輸出反白字元
*/ tech.techweb.com.cn
Ub
O^:Y
attroff(A_REVERSE); /* 關閉反白模式 Z7l8ezn4c/+{jQO
*/ [email protected]
LU)X2^9GkT}
/k8Gm6i,G
move(x,y); /* 將遊標移至初始位置
*/
i*|Gi+r4L/%Mm*E'V
do { /* 以無限迴圈不斷等待輸入
*/
ch=getch(); /* 等待自鍵盤輸入字元
switch(ch) { /* 判斷輸入字元為何
*/
9i0y&wk(L
case KEY_UP: --y; /* 判斷是否"↑"鍵被按下
*/ 程式開發,作業系統,伺服器,原始碼下載,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
*/
*~3{%j+M1WE
break; QE+e.JSM-Y
a+{
case KEY_RIGHT: ++x; /* 判斷是否"→"鍵被按下 TechWeb技術社群^}uRR y2SxU
*/
G?�butR&?4a
break;
case KEY_LEFT: --x; /* 判斷是否"←"鍵被按下
*/
程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼 F9]|$[
Zp(['O7X
break;
case '/r': /* 判斷是否 ENTER 鍵被按下 C~KS7v^
*/ tech.techweb.com.cnm9a2g?0s.M1|F
++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
*/
TechWeb技術社群Ux|8kj
x+=7;
break;
case 127: /* 判斷是否 BACKSPACE 鍵被按下
*/ 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
break; :u9E5sFC
case 27: endwin(); /* 判斷是否[ESC]鍵被按下
*/ 7c/Hb8gj*n
^3`_$a5s"d
exit(1); /* 結束 curses 模式
*/
程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼X]*c-Ax&z2tlW
/* 結束此程式
*/
tech.techweb.com.cnL}_y.S(@
default: 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼[email protected]
addch(ch); /* 如果不是特殊字元, 將此字元印
出 */ TechWeb技術社群Z/3f ?O;n7`#}
x++;
break; TechWeb技術社群6YPx!FsTlG!{
} 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼
h7B`+WP)}#b9F
move(y,x); /* 移動遊標至現在位置
*/
[email protected]/jI]T
} while (1); 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼$r�_&X%`6`%Sr2T5v
}
gCy%?J�E(FF
void initial() /* 自定開啟 curses 函式
*/ zb$mv%E#z7g�h
dshb:_&V
{
initscr();
cbreak();
nonl();
noecho();
intrflush(stdscr,FALSE);
keypad(stdscr,TRUE); 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼2~^'e2?4^-PX9W
refresh(); 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼 UDL$o�}*p6^5}
}
程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼9l3L!n$v3m6Z6[
■ 後記
WuOVml7r6{:D�?
學完了上述的一些命令, 相不相信您已經可以寫出一個漂亮的全螢幕編輯 N-h?LM/3s /7G
器了? 事實上, curses 提供的函式不下 200 個, 可是筆者認為, 一切再
複雜的函式都可以用本文提到的一些組合變化而成, 學了太多
http://tech.techweb.com.cn/viewthread.php?tid=181892
註明了轉載,以後自己牛了再自己寫,呵呵。先看看哈。
以下是UNIX下c語言的圖形程式設計
UNIX下c語言的圖形程式設計--curses.h 函式庫
作者:不詳 來源:supcode.com收集整理 釋出時間:2005-7-22 19:39:36
相信您在網路上一定用過如 tin,elm 等工具, 這些軟體有項共同的特色,
即他們能利用上下左右等方向鍵來控制遊標的位置. 除此之外, 這些程式
的畫面也較為美觀. 對 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 上是沒有定義的. 有些
在 Turbo-C 上被廣泛使用的一些函式, 可能在 UNIX 上是不被定義的.
TechWeb技術社群(h9lRF||j
go2z"bJ
為了因應網路上各式各樣的終端機形態 (terminal), UNIX 上特別發展出
一套函式庫, 專門用來處理 UNIX 上游標移動及螢幕的顯示. 這就是本篇
像 elm 般利用方向鍵來移動光棒位置的程式. (CCCA 近來所提供的線上選
課程式, 及程式服務介面, 即是筆者利用 curses 發展而成的 )
■ curses 的歷史與版本 ~lUhl-iXW
t/~,X8m8FGXlG
cureses 最早是由柏克萊大學的 Bill Joy 及 Ken Arnold 所發展出來的. 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼
mh&CC)L
o/d
當時發展此一函式庫主要原因是為了提高程式對不同終端機的相容性而設
計的. 因此, 利用 curses 發展出來的程式將和您所使用的終端機無關.
也就是說, 您不必擔心您的程式因為換了一部終端機而無法使用. 這對程 'T(v%B8l/|
Xya
式設計師而言, 尤其是網路上程式的撰寫, 是件相當重要的一件事. ~}E*^(E
curses之所以能對上百種以上的終端機工作, 是因為它將所有終端機的資
料, 存放在一個叫 termcap 的資料庫, ( 而在第二版的 System V 系統中 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼O+cU2H$O
, 新版的 curses 以 terminfo 取代原來的 termcap). 有了這些記錄, 程 tech.techweb.com.cn
E4b9o(t�@`
式就能夠知道遇到哪一種終端機時, 須送什麼字元才能移動遊標的位置,
送什麼字元才能清除整個螢幕清除. (* 注一)
8g$ifHw)f j~'lT
另外, 本文的介紹 以 System V 的 curses 版本為主. tech.techweb.com.cng"E m%F1|
■ 如何在您的程式使用 curses ? 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼5K'r8FT([{P
"nY0j
^GY0nd
在您的 C 程式的檔頭將 <curses.h> include 進來.當您引進 curses.h
這個函式庫後, 系統會自動將 <stdio.h> 和 <unctl.h>一併 include 進
來.另外, 在 System V 版本中, <terminfo.h> 這個函式庫也將一併 TechWeb技術社群0Te9f(hU
include進來.
/jx.P/[email protected]&aqe|)i
#include <curses.h>
i
~`%CUBTpS c
main()
{ [email protected] z+zHj_r
: : 8^j['yV9f6w*g
: : 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼7b^[email protected]?I!r
}
當然, 您的系統內必須放有 curses.h 這個函式庫. tech.techweb.com.cn�Nqh3wX*F_
_vo&`&gNZ+e5rP
■ 如何編譯(compile)
當您編輯好您的程式, 在 UNIX 提示符號下鍵入: tech.techweb.com.cn-/jD1VM/
% /usr/5bin/cc [file.c] -lcurses
^^^^^^^
引進 curses.h 這個 library
或 % /usr/5bin/cc [file.c] -lcurses -ltermlib TechWeb技術社群�V e[(tQi
TechWeb技術社群'EO$/_](Fq
(*注二)
pQ,a9|PD&C
ZQD8ELT~HO
■ 如何開始我的第一個 curses 程式?
在開始使用 curses 的一切命令之前, 您必須先利用 initscr()這個函式 gk,Kwr,Y[] e9lC
來開啟 curses 模式.
相對的, 在結束 curses 模式前 ( 通常在您結束程式前 ) 也必須以 ]Q
hT8[ e+|^
endwin()來關閉 curses 模式. J/EU{`5J
#include <curses.h> TechWeb技術社群/p
I}2j
main() e,?d(Sb+V0oo%{ l
{ E`[email protected]'KEJ
initscr();
: :
: : TechWeb技術社群!hq!F{4?!x7_'n"w
: : &}Q.L!V|^[email protected]
endwin(); tech.techweb.com.cn"M;G*P,`dN+~-K
}
這是一般 curses 程式標準的模式.
此外, 您可以就您程式所須, 而做不同的設定. 當然, 您可以不做設定,而
只是呼叫 initscr().
0VD#Y;X2c
您可以自己寫一個函式來存放所有您所須要的設定. 平常使用時, 只要呼
叫這個函式即可啟動 curses 並完成一切設定.
程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼7t ])Nj1N
Y4Q
下面的例子, 即是筆者將平常較常用的一些設定放在一個叫 initial()的函 rn,I/TZ/RgV*E
式內.
TechWeb技術社群Z z}X gh2R(a
void initial()
{
initscr();
cbreak();
nonl();
noecho(); 7d
a.q)Y!J`Z8A0[
intrflush(stdscr,FALSE);
keypad(stdscr,TRUE); .Sr/vl][email protected]
refresh(); tech.techweb.com.cn]4~a
Eq~
}
各函式分別介紹如下:
F�Sl|+m"[-AQ3|.F
□ initscr()
initscr() 是一般 curses 程式必須先呼叫的函式, 一但這個函式
被呼叫之後, 系統將根據終端機的形態並啟動 curses 模式.
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() 可用來關閉
curses 模式, 或是暫時的跳離 curses 模式.如果您在程式中須要 f!/,{T;pMr!n
call shell ( 如呼叫 system() 函式 ) 或是需要做 system call,
就必須先以 endwin() 暫時跳離 curses 模式. 最後再以 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼M)[ C9S._m.z
wrefresh() doupdate() 來重返 curses 模式. TechWeb技術社群)j(K(fL0_M7u
`S{!?
tech.techweb.com.cnzx�m8A}uD(j
□ cbreak()
nocbreak()
當 cbreak 模式被開啟後, 除了 DELETE 或 CTRL 等仍被視為特殊
控制字元外一切輸入的字元將立刻被一一讀取.當處於 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()
TechWeb技術社群js(^e
c/lv
□ nl() #G/aHGl+xW1x3O8~
nonl() i2||Wc(y�dL:e
u'W0R/(d!T+L6t
用來決定當輸入資料時, 按下 RETURN 鍵是否被對應為 NEWLINE 字
元 ( 如 /n ).
而輸出資料時, NEWLINE 字元是否被對應為 RETURN 和 LINDFEED
系統預設是開啟的.
9/-rI,l"CD8E
□ echo() tech.techweb.com.cnV2y/J${N
noecho()
此函式用來控制從鍵盤輸入字元時是否將字元顯示在終端機上.系統 B1R0{m*Z5e
預設是開啟的. tech.techweb.com.cnz4Z#H
}oG+{'B4/
@6s,B6o*B5f[{,aX
□ intrflush(win,bf)
呼叫 intrflush 時須傳入兩個值: P
g"oeA
win 為一 WINDOW 型態指標, 通常傳入標準輸出入螢幕 stdscr @H%ic-Y!y-j,C
bf 為 TRUE 或 FALSE
程式開發,作業系統,伺服器,原始碼下載,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
□ keypad(win,bf)
呼叫 keypad 時須傳入兩個值:
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_ 開頭.
tech.techweb.com.cn:b^4k2H"ai
□ refresh() 0[:[ yb [email protected]
tech.techweb.com.cn/s
rR�YEf y
refresh() 為 curses 最常呼叫的一個函式. [email protected]
curses 為了使螢幕輸出入達最佳化, 當您呼叫螢幕輸出函式企圖改 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼HI.{9D#Mz
變螢幕上的畫面時, curses 並不會立刻對螢幕做改變, 而是等到 tsmUCoY
refresh() 呼叫後, 才將剛才所做的變動一次完成. 其餘的資料將 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼!oK#{M6Rb[
維持不變. 以儘可能送最少的字元至螢幕上. 減少螢幕重繪的時間.
如果是 initscr() 後第一次呼叫 refresh(), curses 將做清除螢
幕的工作. ;{-M#O
[9UU#j
4nQ1V&HE
]%h.C rGg
■ 遊標的控制 [email protected]"Q!eV
move(y,x) 將遊標移動至 x,y 的位置
getyx(win,y,x) 得到目前遊標的位置 [email protected]
B QF&Ry
(請注意! 是 y,x 而不是 &y,&x ) I*YY
ILwgY]
■ 有關清除螢幕的函式
clear() %g~&d5_ h k?S
erase() 將整個螢幕清除 :sfN9rL-P?
(請注意配合refresh() 使用)
J"Z3HW6Ju*c3S(a
■ 如何在螢幕上顯示字元 i3O3sDvs;E
tech.techweb.com.cntR_-FK%b+k
echochar(ch) 顯示某個字元
MkX
whak4M;a!y g
addch(ch) 顯示某個字元
mvaddch(y,x,ch) 在(x,y) 上顯示某個字元 bC v
O�h
相當於呼叫 move(y,x);addch(ch);
u,VIc"[email protected]!W0Q
addstr(str) 顯示一串字串
mvaddstr(y,x,str) 在(x,y) 上顯示一串字串 TechWeb技術社群$^L9v(Gz:yh
相當於呼叫 move(y,x);addstr(str);
printw(format,str) 類似 printf() , 以一定的格式輸出至螢幕
mvprintw(y,x,format,str) 在(x,y) 位置上做 printw 的工作.
相當於呼叫 move(y,x);printw(format,str);
[email protected]!K
R.sl
z!T/jka LKm
■ 如何從鍵盤上讀取字元
0I#VUa9f
getch() 從鍵盤讀取一個字元 (注意! 傳回的是
整數值)
getstr() 從鍵盤讀取一串字元 TechWeb技術社群&Q,EUig
scanw(format,&arg1,&arg2...) 如同 scanf, 從鍵盤讀取一串字元
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; */
char string2[80]; tech.techweb.com.cn2_mo}5HD4k
8f6HH9V)Hl.Y
echo(); /* 開啟 echo 模式, 使輸入立刻顯示在螢幕上 */
ch=getch();
string1=getstr();
scanw("%s",string2);
mvprintw(10,10,"String1=%s",string1); 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼&t-B`$p0I'BG+e(d
mvprintw(11,10,"String2=%s",string2);
程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼k?+U+XR3~
■ 如何利用方向鍵
O/_,o6^(it�F,]
curses 將一些如方向鍵等特殊控制字元, 以 KEY_ 為開頭定義在 curses.h
這個檔案裡頭, 如 KEY_UP 即代表方向鍵的 " ↑ ". 但, 如果您想使用 )[ Q5o#/o2H8joa
tech.techweb.com.cn$C2zN_Z`
curses.h 所為您定義的這些特殊鍵的話, 您就必須將 keypad 設定為
Qna1iD
TRUE. 否則, 您就必須自己為所有的特殊鍵定義了.
curses.h 為一些特殊鍵的定義如下:
KEY_UP 0403 ↑
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)
KEY_F0 0410 Function keys.
KEY_F(n) (KEY_F0+(n)) formula for f . tech.techweb.com.cn-K S?p'jp4Z8]?
Vq0{
KEY_NPAGE 0522 Next page
KEY_PPAGE 0523 Previous page
以上僅列出筆者較常使用的一些控制鍵, 至於其他控制鍵的定義, 請自行參
;Q,S7C4Z0P2^s
w
閱 man curses (* 注三) ?
RSj
YxQf)Z
一併為您列出其他常用的一些特殊字元 ]d
G+l5^
f'lx&?
[TAB] /t
[ENTER] /r tech.techweb.com.cn!K0TM7O/J0U
[ESC] 27
[BACKSPACE] 127 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼/UkA.LO%n
■ 如何改變螢幕顯示字元的屬性 TechWeb技術社群0[�tLE"uO2[
為了使輸出的螢幕畫面更為生動美麗, 我們常須要在螢幕上做一些如反白, TechWeb技術社群1K$E+GwYQ5f6]2o ]
閃爍等變化. 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) 關閉屬性
curses.h 裡頭定義了一些屬性, 如:
A_UNDERLINE 加底線
A_REVERSE 反白
A_BLINK 閃爍
A_BOLD 高亮度 9FCM5D/mN5Z
A_NORMAL 標準模式 (只能配合 attrset() 使用)
vZ
vv
Q"RI^
!iY5b S']?
當使用 attron() 開啟某一種特殊屬性模式後, 接下來在螢幕的輸出都會以 J8QEC9a+XG
該種屬性出現. 直到您呼叫 attroff() 將此模式關閉.
tech.techweb.com.cn d9Y,S/,n{X
請注意, 當您欲 attron() 開啟另一種屬性時, 請記得利用 attroff()先關
TechWeb技術社群x1^}2V+gncK"i a
閉原來的屬性, 或直接以 attrset(A_NORMAL) 將所有特殊屬性關閉.否則,
curses 會將兩種屬性做重疊處理.
TechWeb技術社群|2IZ{5k(Fy1y
□例: 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼7b sYhG]#Sfun
attrset(A_NORMAL); /* 先將屬性設定為正常模式 */
attron(A_UNDERLINE); /* 加底線 */
程式開發,作業系統,伺服器,原始碼下載,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); /* 開啟反白模式 */
mvaddstr(10,10,"反白"); /* 輸出一串反白字元 */ tech.techweb.com.cnW!N(@GM,q
attroff(A_REVERSE); /* 關閉反白模式, 恢復正常模式 */ Y:A1x/s9hi/zK.}
tech.techweb.com.cnn2Zj#{j
i
i
attron(A_BLINK); /* 開啟閃爍模式 */
q4w*usjXv!x/Y
zi6zSF
mvaddstr(11,10,"閃爍"); /* 輸出一串閃爍字元 */ +Rhx2}sF Y1w
[email protected]
JY-a X
attroff(A_BLINK); /* 關閉閃爍模式, 恢復正常模式 */ TechWeb技術社群!SPA,_n{.Dc
attron(A_BOLD); /* 開啟高亮度模式 */ TechWeb技術社群!s Abv["r]q
mvaddstr(12,10,"高亮度"); /* 輸出一串高亮度字元 */
attroff(A_BOLD); /* 關閉高亮度模式, 恢復正常模式 */ uQOUr;BQ
tech.techweb.com.cng;_E7m}$s|
■ 其他常用的一些函式 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼6A4rf(s"jN G!sf_;q1NN
~r~Q
c"D+j:U
beep() 發出一聲嗶聲
box(win,ch1,ch2) 自動畫方框 ch1: 畫方框時垂直方向所用字元
ch2: 畫方框時水平方向所用字元
TechWeb技術社群t}2])B2D-T_ABU
example: box(stdscr,'|','-'); ga1_g%N G5e3d"E
將以 | 及 - 圍成一個方框
■ 應用完整□例
T9C^ct)i
下面所舉的例子, 即完全利用剛剛所介紹的含式來完成.這個程式可將從鍵 zdh,W&/C7s
#TzM
kB [email protected]
盤上讀取的字元顯示在螢幕上, 並且可以上下左右方向鍵來控制遊標的位置
tech.techweb.com.cnv~q
xGc{�sF
, 當按下 [ESC] 後, 程式即結束. )m^_#j"H#u.E�iL
tech.techweb.com.cn S)oT)[8j
您有沒有發現, 這不就是一個簡單全螢幕編輯器的雛形嗎?
`(kO.JJTU;HJ7pc
#include <curses.h> /* 引進 curses.h , 並自動引進
stdio.h */ TechWeb技術社群'pN?
@M+}x
#define StartX 1 /* 決定遊標初始位置 */
#define StartY 1 TechWeb技術社群)r?E
a"Ys
void initial();
main()
{
int x=StartX; /* 宣告 x,y 並設定其初值
*/
tech.techweb.com.cn%N7VeI8[gCT
int y=StartY; ke`&Tv(R
int ch; /* 宣告 ch 為整數,配合 getch()
使用 */ 程式開發,作業系統,伺服器,原始碼下載,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
*/
box(stdscr,'|','-'); /* 畫方框
*/ 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼,q8A{Il7}a2r
程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼$O*e)`
I&frp�S
attron(A_REVERSE); /* 開啟反白模式
*/ tech.techweb.com.cn"[email protected]+N`
mvaddstr(0,20,"Curses Program"); /* 在 (20,0) 處輸出反白字元
*/ tech.techweb.com.cn
Ub
O^:Y
attroff(A_REVERSE); /* 關閉反白模式 Z7l8ezn4c/+{jQO
*/ [email protected]
LU)X2^9GkT}
/k8Gm6i,G
move(x,y); /* 將遊標移至初始位置
*/
i*|Gi+r4L/%Mm*E'V
do { /* 以無限迴圈不斷等待輸入
*/
ch=getch(); /* 等待自鍵盤輸入字元
switch(ch) { /* 判斷輸入字元為何
*/
9i0y&wk(L
case KEY_UP: --y; /* 判斷是否"↑"鍵被按下
*/ 程式開發,作業系統,伺服器,原始碼下載,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
*/
*~3{%j+M1WE
break; QE+e.JSM-Y
a+{
case KEY_RIGHT: ++x; /* 判斷是否"→"鍵被按下 TechWeb技術社群^}uRR y2SxU
*/
G?�butR&?4a
break;
case KEY_LEFT: --x; /* 判斷是否"←"鍵被按下
*/
程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼 F9]|$[
Zp(['O7X
break;
case '/r': /* 判斷是否 ENTER 鍵被按下 C~KS7v^
*/ tech.techweb.com.cnm9a2g?0s.M1|F
++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
*/
TechWeb技術社群Ux|8kj
x+=7;
break;
case 127: /* 判斷是否 BACKSPACE 鍵被按下
*/ 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
break; :u9E5sFC
case 27: endwin(); /* 判斷是否[ESC]鍵被按下
*/ 7c/Hb8gj*n
^3`_$a5s"d
exit(1); /* 結束 curses 模式
*/
程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼X]*c-Ax&z2tlW
/* 結束此程式
*/
tech.techweb.com.cnL}_y.S(@
default: 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼[email protected]
addch(ch); /* 如果不是特殊字元, 將此字元印
出 */ TechWeb技術社群Z/3f ?O;n7`#}
x++;
break; TechWeb技術社群6YPx!FsTlG!{
} 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼
h7B`+WP)}#b9F
move(y,x); /* 移動遊標至現在位置
*/
[email protected]/jI]T
} while (1); 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼$r�_&X%`6`%Sr2T5v
}
gCy%?J�E(FF
void initial() /* 自定開啟 curses 函式
*/ zb$mv%E#z7g�h
dshb:_&V
{
initscr();
cbreak();
nonl();
noecho();
intrflush(stdscr,FALSE);
keypad(stdscr,TRUE); 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼2~^'e2?4^-PX9W
refresh(); 程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼 UDL$o�}*p6^5}
}
程式開發,作業系統,伺服器,原始碼下載,Linux,Unix,BSD,PHP,Apach,asp,下載,原始碼9l3L!n$v3m6Z6[
■ 後記
WuOVml7r6{:D�?
學完了上述的一些命令, 相不相信您已經可以寫出一個漂亮的全螢幕編輯 N-h?LM/3s /7G
器了? 事實上, curses 提供的函式不下 200 個, 可是筆者認為, 一切再
複雜的函式都可以用本文提到的一些組合變化而成, 學了太多