本系列文章改編自《C語言控制台視窗介面編程(修正版)》。本系列文章會拋棄一些原文中難懂難理解且不常用的部分,並修改了部分範例程式。只為了更加清晰地學習C語言的控制台視窗介面編程。而想要更加深入的瞭解本系列文章,請閱讀《C語言控制台視窗介面編程(修正版)》。
《C語言控制台視窗介面編程(修正版)》下載地址:http://download.csdn.net/detail/jzqt_t/7471013
在Windows作業系統下用C語言編寫控制台的視窗介面首先要擷取當前標準輸入和標準輸出裝置的控制代碼。通過調用函數GetStdHandle可以擷取當前標準輸入以及輸出裝置的控制代碼。函數原型為:
HANDLE GetStdHandle(DWORD nStdHandle); /* 其中,nStdHandle可以是 STD_INPUT_HANDLE 標準輸入裝置控制代碼 STD_OUTPUT_HANDLE 標準輸出裝置控制代碼 STD_ERROR_HANDLE 標準錯誤裝置控制代碼 */
本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/C/
需要說明的是,“控制代碼”是Windows最常用的一個概念。它通常用來標識Windows資源(如菜單、 表徵圖、視窗等)和裝置等對象。雖然可以把控制代碼理解為是一個指標變數類型,但它不是對象所在的地址指標,而是作為Windows系統內部表的索引值來使用 的。調用相關文本介面控制的API函數。這些函數可分為三類。一是用於控制台視窗操作的函數(包括視窗的緩衝區大小、視窗前景字元和背景顏色、視窗標題、大小和位置等);二是用於控制台輸入輸出的函數(包括字元屬性操作函數);其他的函數並為最後一類。通過調用CloseHandle函數來關閉輸入輸出控制代碼。
樣本程式:
#include <stdio.h> #include <windows.h> #include <conio.h> int main(int argc,char *argv[]) { HANDLE handle_out; //定義一個控制代碼 CONSOLE_SCREEN_BUFFER_INFO screen_info; //定義視窗緩衝區資訊結構體 COORD pos = {0, 0}; //定義一個座標結構體 handle_out = GetStdHandle(STD_OUTPUT_HANDLE); //獲得標準輸出裝置控制代碼 GetConsoleScreenBufferInfo(handle_out, &screen_info); //擷取視窗資訊 _getch(); //輸入一個字元,不會顯示到螢幕上 /* 向整個緩衝區填充字元'A' 其中填充的開始處為pos,座標為{0, 0},也就是螢幕最左上方的字元處 填充個數為screen_info.dwSize.X(緩衝區寬度,也就是橫座標) * screen_info.dwSize.Y(緩衝區高度,也就是縱座標) 因此可以達到向整個緩衝區填充字元'A'的效果 */ FillConsoleOutputCharacter(handle_out, 'A', screen_info.dwSize.X * screen_info.dwSize.Y, pos, NULL); CloseHandle(handle_out); //關閉標準輸出裝置控制代碼 return 0; }
//程式中,COORD和CONSOLE_SCREEN_BUFFER_ INFO是wincon.h定義的控制台結構體類型 //原型如下 //座標結構體 typedef struct _COORD { SHORT X; SHORT Y; }COORD; //控制台視窗資訊結構體 typedef struct _CONSOLE_SCREEN_BUFFER_INFO { COORD dwSize; //緩衝區大小 COORD dwCursorPosition; //當前游標位置 WORD wAttributes; //字元屬性 SMALL_RECT srWindow; //當前視窗顯示的大小和位置 COORD dwMaximumWindowSize; // 最大的視窗緩衝區大小 }CONSOLE_SCREEN_BUFFER_INFO;
還需要說明的是,雖然在C++中,iostream.h定義了cin和cout的標準輸入和輸出資料流對象。但它們只能實現基本的輸入輸出 操作,對於控制台視窗介面的控制卻無能為力,而且不能與stdio.h和conio.h友好相處,因為iostream.h和它們是C++兩套不同的輸入 輸出操作方式,使用時要特別注意。
(
jzqt_t
)