ncurses初始化函式:raw(),cbreak(),echo(),noecho(),keypad(),halfdelay()
- Copyright(C)
NCURSES Programming HOWTO
初始化函式
我們現在知道在程式中呼叫initscr()
函式,螢幕就會初始化並進入curses 模式。本章我們會介紹其它的初始化函式,這些函式可以根據我們自己的要求在初始化後定製curses 會話(curses session)的功能及模式。例如:終端模式
(terminal mode)、彩色顯示模式
(colormode)、滑鼠操作模式
(mouse mode)等。當然,我們還可以定製混合模式
。這章就讓我們來討論這些在initscr()
函式之後呼叫的初始化函式。
raw()
函式和cbreak()
函式
通常情況下,終端驅動程式會緩衝使用者輸入的字元,直到遇到換行符或回車符後,這些字元才可以被使用。但是大多數程式要求字元在輸入時就可以被使用。raw()
和cbreak()
兩個函式都可以禁止行緩衝(line buffering)。區別
是:在raw()
函式模式下,處理掛起(CTRLZ)、中斷或退出(CTRLC)等控制字元時,將直接傳送給程式去處理而不產生終端訊號;而在cbreak()
模式下,控制字元將被終端驅動程式解釋成其它字元。就我個人而言,比較喜歡使用raw()
函式,因為用它可以做一些一般使用者無法進行的控制操作。
echo()
函式和noecho()
函式
這兩個函式用來控制是否將從鍵盤輸入的字元顯示在終端上。呼叫noecho()
函式禁止輸入的字元出現在螢幕上。也許程式設計師希望使用者在進行控制操作時,需要遮蔽掉控制字元(如組合鍵操作),或呼叫getch()
函式讀取鍵盤字元時,不想顯示輸入的字元(如在控制檯輸入登陸密碼)。大多數的互動式應用程式在初始化時會呼叫noecho()
函式,用於在進行控制操作時不顯示輸入的控制字元。這兩個函式給予程式設計師很大的靈活性,使程式設計師可以在視窗中的任意地方,實現輸入字元的顯示和遮蔽,而不需要重新整理螢幕。
keypad()
函式
這個函式允許使用功能鍵,例如:F1、F2、方向鍵等功能鍵。幾乎所有的互動式程式都需要使用功能鍵,因為絕大多數使用者介面主要用方向鍵進行操作。使用keypad(stdscr,TURE)
就為“標準螢幕”(stdscr
)啟用了功能鍵。你將會在以後的章節中學習到如何使用功能鍵。
halfdelay()
函式
halfdelay()
函式會啟用半延時模式(halfdelaymode)。和cbreak()
函式一樣,當程式需要使用者輸入字元時,輸入的每個字元都是可用的。給halfdelay()
傳遞一個整型引數(以0.1 秒為單位),它就會在這個引數時間內等待輸入。如果沒有有效的輸入,則返回ERR
。 一般來說,這個函式在需要等待輸入的程式中會用到。如果使用者沒有在規定時間內給出有效輸入,程式就可以去處理其它事情。最常見例子就是在輸入密碼時做出超時響應。
其它的初始化函式
上面提到的函式用來定製curses 在初始化後的行為,因此這些函式只能在整個curses 會話的開始部分(即初始化時)呼叫,而不能在程式的其它地方呼叫。
示例程式
讓我們寫一個程式用來說明這些函式的用法。
#include <ncurses.h>
/*
Compile: gcc main.c -lncurses
*/
int main()
{
int ch;
initscr(); /* 開始curses 模式*/
raw(); /* 禁用行緩衝*/
keypad(stdscr, TRUE); /* 開啟功能鍵響應模式*/
noecho(); /* 當執行getch()函式的時候關閉鍵盤迴顯*/
printw("Type any character to see it in bold\n");
ch = getch(); /* 如果沒有呼叫raw()函式,
我們必須按下enter 鍵才可以將字元傳遞給程式*/
if(ch == KEY_F(1)) /* 如果沒有呼叫keypad()初始化,將不會執行這條語句*/
printw("F1 Key pressed");
else /* 如果沒有使用noecho() 函式,一些控制字元將會被列印到螢幕上*/
{
printw("The pressed key is ");
attron(A_BOLD);
printw("%c", ch);
attroff(A_BOLD);
}
refresh(); /* 將緩衝區的內容列印到顯示器上*/
getch(); /* 等待使用者輸入*/
endwin(); /* 結束curses 模式*/
return 0;
}
這個程式很簡單,但還是有一些在前面的章節沒有介紹的函式。getch()
函式用來取得使用者輸入的字元,它等價於通常的getchar()
函式,只是我們在呼叫getchar()
函式時要禁止行緩衝以避免在輸入完成後按enter 鍵。在後面的章節中我們將討論到輸入函式。attron()
和attroff()
函式分別作為修飾的開頭和結尾,修飾其間輸出的字元。例如在本例中加粗(即使用A_BOLD
作為函式引數)使用者輸入的字元。在後面的章節中我們也將會詳細討論這些函式。
相關文章
- ncurses鍵盤管理:cbreak,keypad,getch(),KEY_F(),clrtoeol()
- echo與函式函式
- ncurses輸出函式:字元+字串的輸出函式字元字串
- ncurses輸入函式:字元+字串的輸入函式字元字串
- ORACLE utl_raw函式與dbms_stats.convert_raw_value函式使用Oracle函式
- Sanic response raw() 函式用法和示例函式
- 日期轉換為raw的函式函式
- echo二次開發 ecshop 函式列表函式
- Oracle dump函式的與utl_rawOracle函式
- php輸出帶變數字串(echo函式的應用)PHP變數字串函式
- golang中的init初始化函式Golang函式
- 使用oracle utl_raw作為dump的逆函式Oracle函式
- 【C++】初始化列表建構函式VS普通建構函式C++函式
- C++ 初始化函式的實現C++函式
- C++——建構函式之初始化列表C++函式
- C++建構函式初始化順序C++函式
- python中用函式初始化類變數Python函式變數
- 類內初始化、預設初始函式、=default;函式
- Vue原始碼探究-類初始化函式詳情Vue原始碼函式
- ncurses庫移植
- 編譯 ncurses編譯
- 用懶載入等函式式思想重構Java的初始化函式Java
- C++ 類建構函式初始化列表介紹C++函式
- C語言initgroups()函式:初始化組清單C語言函式
- C語言sigemptyset()函式:初始化訊號集C語言函式
- C++中建構函式後的初始化列表C++函式
- java中靜態初始化塊,例項初始化塊,建構函式區別Java函式
- C# 建構函式 (初始化成員變數的角色)C#函式變數
- 痞子衡嵌入式:深扒IAR啟動函式流程之段初始化函式__iar_data_init3實現函式
- javascript中初始化建構函式時new所起的作用JavaScript函式
- Java static變數、作用域、建構函式初始化順序Java變數函式
- c++中使用建構函式初始化列表的情況C++函式
- MySQL函式大全(字串函式,數學函式,日期函式,系統級函式,聚合函式)MySql函式字串
- 類的陣列初始化後會呼叫拷貝建構函式陣列函式
- C++ 建構函式 explicit 關鍵字 成員初始化列表C++函式
- Oracle 函式大全(字串函式,數學函式,日期函式,邏輯運算函式,其他函式)Oracle函式字串
- 【函式式 Swift】函式式思想函式Swift
- 用ncurses庫寫掃雷