1. 程式人生 > >Unix/Linux下的Curses庫開發指南——第三章curses庫視窗

Unix/Linux下的Curses庫開發指南——第三章curses庫視窗

3 curses 庫視窗

3 .1 curses 視窗簡介

3.1.1視窗概念

視窗是 curses 庫中最重要的一個元件,它實際上是螢幕上的一塊矩形區域,在上面我們可以進行各種輸出以及操作。 curses 庫中提供了大量的函式以允許我們建立和操作自己的視窗,而不僅僅是隻能使用標準視窗 stdscr 。對自定義視窗進行操作的函式一般與對標準視窗進行操作的函式是相同的,除非它們需要特別的引數,這個引數通常為一個指向自定義視窗的指標。 curses 也允許建立一種稱之為基墊的視窗,英文名稱為 pad 。基墊的各個方面與視窗並無二異,只是它的大小和位置不再侷限於終端螢幕的可視部分。它可以比標準螢幕大,位置也可以位於標準螢幕之外而我們看不到。因為視窗函式只是

curses 庫函式的一部分,因此我們可以用同樣的方法來編譯使用視窗的程式。我們在這一章只介紹最常用的一些函式,必要時我們會給出幾個綜合的例子,從而加深對視窗的理解和應用能力。

視窗可以位於標準螢幕的任何位置,它們之間可以相互重迭包括與標準螢幕。視窗同時可以包含與它們相關聯的子視窗。任何在父視窗和子視窗重迭區域的變化都會同時影響到它們中的任何一個。與子視窗類似,基墊也同樣有子基墊,英文名稱為 subpad 。子基墊是與父基墊相關聯並且位於父基墊之內的視窗。重新整理基墊和子基墊與重新整理視窗和子視窗有些細微的差異。這種具體的差異我們在後面會慢慢介紹。

3.1 具體的演示了視窗、子視窗、基墊、子基墊之間的相互關係。

3. 1

3.1.2視窗資料結構

在使用視窗之前我們先看一下視窗的資料結構定義,通常它在標頭檔案curses.h 中:

typedef struct _win_st  WINDOW

struct _win_st

{

short     _cury  _curx     /*  游標當前位置  */

short _maxy  _maxx /*  最大的位置值  */

short _begy  _begx /* (0

0)  視窗相對於標準視窗的位置  */

char      _flags

short      _yoffset;        /*  偏移量  */

bool      _clear /* clearok()  資訊  */

        _leave /* leaveok()  資訊  */

        _immed /* window in immediate mode */

        _sync /* auto syncup of parent */

WINDOW     *_padwin /*  當前視窗的 ”pad” 區域 */

#ifdef _VR3_COMPAT_CODE

_ochtype **       _y16   /* MUST stay at this offset in WINDOW */

#endif

short         *_firstch /* first change in line */

short         *_lastch    /* last change in line */

short         _tmarg  _bmarg /* scrolling region bounds */

             /* MUST stay at this offset in WINDOW */

unsigned _scroll : 1;     /* scrollok() info */

unsigned _use_idl     : 1

unsigned _use_keypad : 1

unsigned _notimeout : 1

unsigned _use_idc     : 1

chtype         _attrs /* current window attributes */

chtype         _bkgd /* background  normally blank */

int             _delay /* delay period on wgetch */

                /* 0:  for nodelay */

                /* <0: for infinite delay */

                /* >0: delay time in millisec */

short        _ndescs  /* number of descendants */

short        _parx  _pary /* coords relative to parent (0 0) */

WINDOW *_parent   /* 如果視窗為子視窗則這指向父視窗  */

chtype    **_y  /* lines of data */

short        _nbyte    /* number of bytes to come */

short        _index /* index to hold coming char */

char        _waitc[CSMAX];  /* array to hold partial m-width char */

bool        _insmode    /* TRUE for inserting  */

  /* FALSE for adding */

}

上面的結構基本包含了一個視窗所需要的各種資料,在以後的建立和使用視窗的過程中我們返回以及需要的都是這個的結構。下面是幾個最經常用到的成員:

_cury  _curx :當前視窗中游標的位置

_begy  _begx :當前視窗的左上角相對於標準螢幕的位置

_parent :當前視窗的父視窗

_parx  _pary :子視窗的左上角相對於父視窗的位置

_attrs :當前視窗的屬性

_bkgd :當前視窗的背景字元

3 .2 視窗操作

自定義視窗函式跟與標準螢幕互動的函式基本是相同的,除非它需要特殊的引數來指明函式作用的視窗不是標準螢幕。比如標準螢幕重新整理用 refresh()  函式,而視窗重新整理卻是通過 wrefresh() 進行,wrefresh() 有一個指標用來指向需要重新整理的視窗。當它呼叫的時候,螢幕上只有代表視窗的部分才會進行重新整理,標準螢幕的其餘部分並不會重新整理。下面我們對視窗的函式進行詳細的探討,同時在一些函式說明後面會附上完整的使用程式碼,這些程式碼都是在 SCO UNIX 上測試過的,在別的平臺上只要稍做改動甚至不需要改動就可以直接編譯。

3 .2.1 建立和刪除視窗

函式 newwin() 用來建立視窗並且返回 WINDOW 指標。這個指標在各個視窗處理函式中作為引數傳遞過去。newwin() 語法如表 3.1 所示。

3 .1 newwin ()函式概述

標頭檔案

curses.h

概述

WINDOW *newwin(lines cols begin_y begin_x)

int lines cols begin_y begin_x

返回

成功

失敗

*WINDOW

(*WINDOW)NULL

newwin() 的引數含義如下:

 line cols 給出了需要建立的視窗所佔的總行數和總列數,它們都是整數值。

 begin_y  begin_x 給出了視窗的左上角所在的行數和列數,它們也是整數值。需要注意的是begin_y begin_x 的順序,它們與通常的 (x y) 順序正好相反。

newwin() 返回的是一個 WINDOW 型別的指標。如果建立失敗,函式返回 (WINDOW*)NULL 。一旦獲取了 WINDOW 結構,我們就可以訪問這個結構中的所有的成員。例如,下面的程式片斷中我們在標準螢幕上建立了一個視窗 midscreen

WINDOW* midscreen

midscreen=newwin(5 10 9 53)

建立的視窗有五行十列,在標準螢幕上它的左上角的位置是 (9 35)

如果 lines 或者 cols 0 的話,函式將自動建立一個行數和列數分別為 LINES  COLS 的視窗,這個視窗的範圍包括整個終端螢幕。例如下面的程式片斷建立一個行數為 LINES ,列數為 COLS 的視窗,它的左上角為 (0 0)

newwin(0 0 0 0)

必須注意的是建立視窗的大小不能超出實際螢幕的大小,視窗的行和列數的最大值也就是 LINES COLS ,如果超過了,則返回失敗。

對於那些不再使用的視窗我們有必要及時清除它。視窗清除包括兩方面的含義:清除視窗畫面和清除視窗記憶體。對於清除視窗畫面,我們可以使用函式werase() wclear() 實現,它們的作用和第二章的 erase() clear() 非常類似。如果視窗區域性清除,則可以使用 wclrtobot() wclrtoeol() ,它們的用法和 clrtobot() clrtoeol() 類似。

事實上,不管werase() 還是 wclear() ,它們並不能清除選單所佔的記憶體空間,因此有可能無意中會造成記憶體洩漏,因此我們還必須呼叫函式 delwin() 釋放記憶體。函式語法如表 3.2 所示:

3 . 2 delwin()函式概述

標頭檔案

curses.h

概述

int delwin(win)

WINDOW* win

有必要指出的是,在主視窗刪除之前我們必須先刪除與它關聯的所有子視窗。

3 .2.2 建立子視窗

一個視窗通常都是有一些子視窗與之關聯的。 subwin() 函式建立一個子視窗,同時返回一個指向子視窗的指標。一個子視窗實際上是與父視窗共享所有的或者部分的字元空間的視窗。從 WINDOW 結構中可以看出,結構中的 _parent 就是指向父視窗的指標,通過戶取這個 _parent 指標,我們可以得到子視窗的父視窗。

3 . subwin ()函式概述

標頭檔案

curses.h

概述

WINDOW *subwin(win lines cols begin_y beign_x)

WINDOW *win

int lines cols begin_y begin_x

subwin 的引數的意義如下:

■  win 是指向當前建立的子視窗的父視窗的指標。一旦函式呼叫成功,子視窗結構中的 _parent 指標將指向父視窗 win

 lines cols 給出了建立的子視窗的總行數和總列數。

 beign_y begin_x 是子視窗的左上角在標準螢幕中的相對位置。注意不是在父視窗中的相對位置。

subwin() 同樣返回一個 WINDOW 型別的指標,如果執行失敗,它將同樣返回 (WINDOW*)NULL 。由於子視窗位於復視窗之中,因此對其中任何一個的改變都會同時影響到它們。它們共享部分字元空間。

subwin() 函式的最通常的用法是將已存在的視窗切分成不同的區域。例如在下面的程式片斷中, subwin 在標準螢幕的下面部分建立了一個稱之為 cmdmenu 的視窗。

WINDOW* cmdmenu

cmdmenu = subwin(stdscr   5   80  19   0 )

在這個例子中, cmdmenu 與標準螢幕共享部分字元空間,因此改變 cmdmenu 同樣影響標準螢幕。

相對於subwin() ,我們在程式中更經常使用的則是 derwin() 函式。它的語法如表 3.4 所示。

3 . 4 der win ()函式概述

標頭檔案

curses.h

概述

WINDOW * der win(win lines cols begin_y beign_x)

WINDOW *win

int lines cols begin_y begin_x

derwin() subwin()

相關推薦

Unix/LinuxCurses開發指南——curses視窗

第3 章 curses 庫視窗 3 .1 curses 視窗簡介 3.1.1視窗概念 視窗是 curses 庫中最重要的一個元件,它實際上是螢幕上的一塊矩形區域,在上面我們可以進行各種輸出以及操作。 curses 庫中提供了大量的函式以允許我們建立和操作自己的視

Vert.x Java開發指南—— 利用RxJava進行響應式程式設計

第九章 利用RxJava進行響應式程式設計 截止目前,我們已經探索了Vert.x技術棧的多個部分,使用基於回撥的API。它僅僅可以正常工作,而且這個程式設計模型對於開發者在許多語言中是非常熟悉的。儘管如此,它可能有點繁瑣,尤其當你組合幾個事件源或者處理複雜

05.ThreeJs開發指南--幾何體

第五章 學習使用幾何體 二維幾何體: 一、PlaneGeometry:平面 var plane = new THREE.PlaneGeometry(width,height,widthSegments,heightSegments); width:

10.ThreeJs開發指南--載入和使用紋理

第十章 載入和使用紋理 在材質中使用紋理 function createMesh(geom,imageFile){ var texture = THREE.ImageUtils.loadTexture('../assets/textures/g

07.ThreeJs開發指南--粒子系統

第七章 粒子系統 function createParticles(){ var meaterial = new THREE.ParticleBasicMaterial(); for(var x = -5 ; x < 5 ; x +

Kali Linux 無線滲透測試入門指南 高階 WLAN 攻擊

第七章 高階 WLAN 攻擊 作者:Vivek Ramachandran, Cameron Buchanan 譯者:飛龍 簡介 知己知彼,百戰不殆。 孫子,《孫子兵法》 作為滲透測試者,瞭解黑客可以執行

Kali Linux 無線滲透測試入門指南 攻擊 Web 設施

第五章 攻擊 Web 設施 作者:Vivek Ramachandran, Cameron Buchanan 譯者:飛龍 簡介 故上兵伐謀 – 孫子,《孫子兵法》 這一章中,我們會攻擊 WLAN 設施的核

『Python』Numpy學習指南__常用函數

第一個 indices first 填充 del lib ida like otl 感覺心情漸漸變好了,加油!np.eye(2)np.savetxt(‘eye.txt‘,i2)c,v = np.loadtxt(‘data.csv‘, delimiter=‘,‘, useco

路飛學城——Python開發集訓——

技術分享 開發 In TP alt http 圖片 pytho image 路飛學城——Python開發集訓——第三章

JavaScript---設計模式與開發實踐-- 閉包

JavaScript—設計模式與開發實踐–第三章 閉包 閉包(closure)是Javascript語言的一個難點,也是它的特色,很多高階應用都要依靠閉包實現。 對於 JavaScript程式設計師來說,閉包(closure)是一個難懂又必須征服的概念。

計算機網路自頂向方法 習題參考答案

複習題 R1. a. 稱這個簡單的運輸層協議為 STP。 在傳送端,STP 接收應用程式要傳送的資料(不超過 1196 位元組)、目的地址、埠號;然後 STP 新增 4 位元組頭部資訊,即埠號;將這 1200 位元組的報文段連同目的地址交付給網路層; 在接收端,

linux核心程式設計讀書筆記【程序管理】

第三章程序管理 應專業選修Linux程式設計老師的要求,記錄讀書筆記 3.1程序 1)程序:處於執行期的程式(目標碼存放在某種介質上),包含程式碼段還包含其他資源(開啟的檔案、核心內部資料、存放全域性變數的資料段),是正在執行的程式程式碼的實時結果,Linux通

C++ Primer 【四版】 標準型別

預設建構函式(default constructor)就是在沒有顯式提供初始化式時呼叫的建構函式。它由不帶引數的建構函式,或者為所有形參提供預設實參的建構函式定義。如果定義某個類的變數時沒有提供初始化式,就會使用預設建構函式。如果使用者定義的類中沒有顯式定義任何建構函式,編譯器就會自動為該類生成預設建構函式,

C++ Primer 4 標準型別

  1. 名稱空間的 using 宣告          使用 using 宣告可以在不需要加字首 namespace_name:: 的情況下訪問名稱空間中的名字。using 宣告的形式如下:      using namespace::name;          一個

ZeroMQ 中文指南 高階請求-應答模式【轉載】

作者資訊如下。 ZMQ 指南 作者: Pieter Hintjens [email protected], CEO iMatix Corporation. 翻譯: 張吉 [email protected], 安居客集團 好租網工

標準型別(part 1) 標準 string 型別

除基本資料型別外,C++ 還定義了一個內容豐富的抽象資料型別標準庫。 其中最重要的標準庫型別是 string 和 vector,它們分別定義了大小可變的字串和集合。 string 和 vector 往往將迭代器用作配套型別(companion type),用於訪問strin

C++ Primer 標準string型別

標準庫string型別: string型別支援長度可變的字串. #include<string> using std::string; 1.string物件的定義和初始化 string s1;   //預設建構函式,s1為空串 string s2(s1);  

C++ Primer 標準vector型別

vector是同一種類型的物件的集合,每個物件都有一個對應的整數索引值。 使用vector之前,必須包含相應的標頭檔案。 #include<vector> using std::vector; vector不是一種資料型別,而只是一個類模板,可用來定義任意多種資

C++ Primer 標準型別 筆記

C++ Primer 第三章 標準庫型別 標準庫型別是我之前沒有接觸過內容,不僅是這一章,整本書有很多東西對我來說都是新的,譚伯伯那本介紹的東西只是C++中的皮毛罷了。感覺到學習C++將是個無底洞。

C++ 標準型別

 1. 標準庫string型別 標頭檔案#include <string> getline(cin,line)函式接收兩個引數,讀取鍵盤輸入流,遇到換行符返回。 string常用操作,