本系列文章改編自《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 標准錯誤設備句柄
- */
需要說明的是,“句柄”是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
)