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輸入函式:字元+字串的輸入函式字元字串
- Sanic response raw() 函式用法和示例函式
- golang中的init初始化函式Golang函式
- 【C++】初始化列表建構函式VS普通建構函式C++函式
- 類內初始化、預設初始函式、=default;函式
- C++——建構函式之初始化列表C++函式
- Vue原始碼探究-類初始化函式詳情Vue原始碼函式
- 用懶載入等函式式思想重構Java的初始化函式Java
- C++ 類建構函式初始化列表介紹C++函式
- 編譯 ncurses編譯
- 認識ncurses
- C# 建構函式 (初始化成員變數的角色)C#函式變數
- 痞子衡嵌入式:深扒IAR啟動函式流程之段初始化函式__iar_data_init3實現函式
- c++中使用建構函式初始化列表的情況C++函式
- javascript中初始化建構函式時new所起的作用JavaScript函式
- Java static變數、作用域、建構函式初始化順序Java變數函式
- MySQL函式大全(字串函式,數學函式,日期函式,系統級函式,聚合函式)MySql函式字串
- python中id()函式、zip()函式、map()函式、lamda函式Python函式
- C++ 建構函式 explicit 關鍵字 成員初始化列表C++函式
- 類的陣列初始化後會呼叫拷貝建構函式陣列函式
- Python 擴充之特殊函式(lambda 函式,map 函式,filter 函式,reduce 函式)Python函式Filter
- MySQL(四)日期函式 NULL函式 字串函式MySql函式Null字串
- 第7章 IF函式 COUNTIF函式 SUMIF函式函式
- (譯) 函式式 JS #2: 函式!函式JS
- 初始化樣式cssCSS
- 核函式 多項式核函式 高斯核函式(常用)函式
- 【16位RAW影像處理四】 HDR->LDR:Matlab中tonemapfarbman函式的解析和自我實現。Matlab函式
- 第 8 節:函式-匿名函式、遞迴函式函式遞迴
- bat檔案用echo列印變數顯示ECHO IS OFF/ECHO已關閉BAT變數
- lambda匿名函式sorted排序函式filter過濾函式map對映函式函式排序Filter
- 用ncurses庫寫掃雷
- SQL-函式 - 聚合函式SQL函式
- 【每日函式】每日函式(2021.08.05)函式
- 【每日函式】每日函式(2021.08.06)函式
- 【每日函式】每日函式(2021.08.10)函式