3 curses庫窗口(WINDOW)處理
~~~~~~~~~~~~~~~~~~~~~~~~~~~
3.1 什麼是窗口
===============
* 窗口是屏幕上的一塊區域,在其上面可以進行各種輸出及其操作.
* 窗口可以位於標准屏幕的任意位置,窗口之間可以相互重疊.
* 窗口可以同時包含與它們相關的子窗口,任何在父窗口與子窗口重疊區域的變化會同時影響到他們中的任何一個
3.2 窗口操作
=============
3.2.1 創建和刪除窗口
---------------------
/** @brief 創建窗口並返回WINDOW指針 @param lines 需要創建窗口所占的總行數 @param cols 需要創建窗口所占的總列數 @param begin_x 窗口左上角所在的行數(x坐標) @param begin_y 窗口左上角所在的列數(y坐標) @return 返回WINDOW類型的指針,如果創建失敗,函數返回NULL @note 如果lines或者cols為0,函數自動創建一個行數和列數分別為LINES和COLS的窗口. 所創建窗口的大小不能超過實際屏幕的大小,如果超過了,則返回失敗. 對於不再使用的窗口有必要及時清屏,可以使用werase()和wclear()實現. 不管werase()還是wclear()都不能清除內存空間,需要調用delwin()釋放內存. */ WINDOW* newwin(int lines,int cols,int begin_x,int begin_y); /** @brief 刪除窗口 @param win 待刪除窗口的指針 @note 在主窗口刪除之前必須先刪除與它相關連的所有子窗口 */ int delwin(WINDOW* win); /** @breif 創建子窗口 @param win 父窗口的指針 @param lines,cols 子窗口的總行數和列數 @param begin_x,begin_y 子窗口的左上角在標准屏幕的相對位置 @note 注意相對位置是想對於*標准屏幕*的,而不是父窗口的!! */ WINDOW* subwin(WINDOW* win,int lines,int cols,int begin_x,int begin_y); /** @breif 創建子窗口 @param win 父窗口的指針 @param lines,cols 子窗口的總行數和列數 @param begin_x,begin_y 子窗口的左上角在父窗口的相對位置 @note 注意相對位置是想對於*父窗口*的,而不是標准屏幕的!! */ WINDOW* derwin(WINDOW* win,int lines,int cols,int begin_x,int begin_y);
3.2.2 在窗口進行輸入和輸出
---------------------------
int wmove(WINDOW* win,int x,int y); /**移動光標到相對win的(x,y)處*/ int waddch(WINDOW* win,int ch); /**在窗口的當前位置增加字符ch*/ int mvwaddch(WINDOW* win,x,y,ch); /**在窗口中移動光標到x,y,同時輸出ch*/ int waddstr(WINDOW* win,char* str); /**輸出str*/ int mvwaddstr(WINDOW* win,int x,int y,char* str); /**將窗口光標移動到x,y,同時輸出str*/ int wprintw(WINDOW* win,char* fmt[,arg...]); /**在窗口中格式化輸出*/ int wgetch(WINDOW* win); /**在窗口中獲取輸入*/ int mvwgetch(WINDOW* win,int x,int y); int wgetstr(WINDOW* win); int mvwgetstr(WINDOW* win,int x,int y,char* str); int wscanw(WINDOW* win,char* fmt[,args...]); int mvwscanw(WINDOW* win,int x,int y,char* fmt[,args...]); int winsch(WINDOW* win,int ch); /**在窗口中插入字符*/ int mvwinsch(WINDOW* win,int x,int y,int ch); int winsertln(WINDOW* win,int x,int y); /**在窗口中插入一行*/ int wdelch(WINDOW* win); /**在窗口中刪除一個字符*/ int mvwdelch(WINDOW* win,int x,int y); int wdeleteln(WINDOW* win); int wclear(WINDOW* win); int werase(WINDOW* win); int wclrtoeol(WINDOW* win); int wclrtobot(WINDOW* win); int wstandout(WINDOW* win); int wstandend(WINDOW* win); int wattrset(WINDOW* win,chtype atr); int wattroff(WINDOW* win,chtype atr); int wattron(WINDOW* win,chtype atr); /** @brief 復制srcwin的內容到dstwin中 @param srcwin 被復制窗口的指針 @param dstwin 接受復制窗口的指針 @note srcwin和dstwin的尺寸不需要完全相同,如果srcwin大於dstwin窗口,函數僅僅復制srcwin中適合dstwin的部分 overlay()是一種非破壞性的復制,它不復制原窗口上的空字符,因此如果原窗口的某個位置為空字符,而目標窗口對應位置不為空字符,則目標窗口的原字符繼續保留. */ int overlay(WINDOW* srcwin,WINDOW* dstwin); /** @brief 復制srcwin的內容到dstwin中 @param srcwin 被復制窗口的指針 @param dstwin 接受復制窗口的指針 @note srcwin和dstwin的尺寸不需要完全相同,如果srcwin大於dstwin窗口,函數僅僅復制srcwin中適合dstwin的部分 overwrite()是一種破壞性的復制,它復制原窗口上的所有內容,包括空字符 */ int overwrite(WINDOW* srcwin,WINDOW* dstwin); /** @brief 復制srcwin的部分內容到dstwin的指定部分上 @param srcwin 復制的源窗口指針 @param dstwin 復制的目標窗口指針 @param srcminrow,srcmincol 源窗口待復制部分的左上角坐標 @param dstminrow,dstmincol 目標窗口被復制部分的左上角坐標 @param dstmaxrow,dstmaxcol 指示了需要復制區域的大小 @param overlay 復制是否是破壞性的 */ int copywin(WINDOW* scrwin,WINDOW* dstwin,int srciminrow,int srcmincol,int dstminrow,int dstmincol,int dstmaxrow,int dstmaxcol,int overlayFlag);
3.2.3 窗口刷新
---------------
/** @breif 將窗口內容寫入虛擬屏幕中,虛擬屏幕描述了將要顯示的內容 */ int wnoutrefresh(WINDOW* win); /** @brief 將虛擬屏幕內容刷新到物理屏幕中 */ int doupdate(WINDOW* win); /** @brief 等價於先wnoutrefresh()再doupdate() */ int wrefresh(WINDOW* win); /** @brief 重畫指定窗口 */ int redrawwin(WINDOW* win); /** @brief 重畫指定窗口的指定區域 @param beg_line 區域的起始行 @param num_lines 區域的行數 */ int wredrawln(WINDOW* win,int beg_line,int num_lines);
3.2.4 窗口其他屬性操作
-----------------------
/** @brief 移動窗口到指定位置 @param win 待移動的窗口 @param x,y 移動的目標位置 @note 移動窗口後,記得用wrefresh刷新窗口 */ int mvwin(WINDOW* win,int x,inty); /** @brief 在窗口相互重疊時,激活指定窗口,使它獲取當前操作的焦點 */ void touchwin(WINDOW* win); /** @brief 給窗口加上邊框 @param win 需要畫出邊框的窗口 @vert 垂直方向的字符,通常為ACS_VLINE @hort 水平方向的字符,通常為ACS_HLINE */ int box(WINDOW* win,chtype vert,chtype hort); /** @breif給窗口加上邊框 @param win 需要畫出邊框的窗口 @param ls 窗口左邊字符 //left side @param rs 窗口右邊字符 //right side @param ts 窗口上邊字符 //top side @param bs 窗口下邊字符 //buttom side @param tl 窗口左上角字符 //top left @param tr 窗口右上角字符 //top right @param bl 窗口左下角字符 //buttom left @param br 窗口右下角字符 //buttom right */ int border(WINDOW* win,chtype ls,chtype,rs,chtype ts,chtype bs,chtype tl,chtype tr,chtype bl,chtype br); /** @brief 在標准屏幕繪制橫線 @param ch 直線支付 @param n 制定最大線長度 */ int hline(chtype ch,int n); /** @brief 在標准屏幕繪制豎線 @param ch 直線字符 @param n 制定最大線長度 */ int vline(chtype ch,int n); /** @brief 在指定窗口繪制橫線 @param win 指定窗口 @param ch 直線支付 @param n 制定最大線長度 */ int whline(WINDOW* win,chtype ch,int n); /** @brief 在指定窗口繪制豎線 @param win 指定窗口 @param ch 直線字符 @param n 制定最大線長度 */ int wvline(WINDOW* win,chtype ch,int n); /** @brief 設置窗口的相應標志 @param state TRUE則設置該標志,FLASE則取消設置 */ void leaveok(WINDOW* win,bool state); void scrollok(WINDOW* win,bool state); void clearok(WINDOW* win,bool state);
3.2.5 屏幕的轉存
-----------------
/** @brief 將win中所有數據寫入fp中 */ int putwin(WINDOW* win,FILE* fp); /** @brief 由fp內容創建窗口 */ WINDOW* getwin(FILE* fp); /** @brief 存儲標准屏幕 */ int scr_dump(const char* filename); /** @brief 讀取標准屏幕 */ int src_restore(const char* filename);
本文出自 “暗日” 博客,請務必保留此出處http://darksun.blog.51cto.com/3874064/1297283