初识句柄操作(控制台窗口小实验)
今日学习了控制台使用句柄操作的方法。
我们都知道,使用iostream也可以向屏幕中输出语句。
但它们只能实现基本的输入输出 操作,对于控制台窗口界面的控制却无能为力,而且不能与stdio.h和conio.h友好相处,因为iostream和它们是C++两套不同的输入。
因此,我们需要句柄类来帮助我们完成这个操作。
下面直接上练习小代码,为贪食蛇清屏的小片段。 经一番查找,习得基本用法。
1 void clrscr(void) { 2 //控制台窗口信息类型 存有缓冲区大小 当前光标位置 窗口显示大小和位置等信息 3 CONSOLE_SCREEN_BUFFER_INFO csbiInfo; 4 // 设备句柄类 5 HANDLE hConsoleOut; 6 7 // 坐标类 结构体 存有x与y坐标 8 COORD home = { 0, 0 }; 9 DWORD dummy; 10 11 // 获取标准输出设备句柄 12 // 函数原型为: HANDLE GetStdHandle(DWORD nStdHandle ); 13 // nStdHandle可以是STD_INPUT_HANDLE(标准输入设备句柄)、 14 // STD_OUTPUT_HANDLE(标准输出设备句柄)和 STD_ERROR_HANDLE(标准错误句柄)。 15 hConsoleOut = GetStdHandle(STD_INPUT_HANDLE); 16 // 获取窗口信息 17 GetConsoleScreenBufferInfo(hConsoleOut, &csbiInfo); 18 // 向窗口填充字符 此处填入' ' 空格用于清屏 19 FillConsoleOutputCharacter(hConsoleOut, ' ', csbiInfo.dwSize.X * csbiInfo.dwSize.Y, home, &dummy); 20 // 以下为窗口信息类中当前光标位置的设置 21 csbiInfo.dwCursorPosition.X = 0; 22 csbiInfo.dwCursorPosition.Y = 0; 23 // 设置当前句柄光标位置 24 SetConsoleCursorPosition(hConsoleOut, csbiInfo.dwCursorPosition); 25 26 // 记得擦屁股 关闭此句柄类 27 CloseHandle(hConsoleOut); 28 29 }
为了帮助更好理解,下面给出COORD与CONSOLE_BUFFER_INFO的代码:
1 // 坐标结构体 2 typedef struct _COORD { 3 SHORT X; 4 SHORT Y; 5 } COORD; 6 7 8 // 控制台窗口信息结构体 9 typedef struct _CONSOLE_SCREEN_BUFFER_INFO { 10 COORD dwSize; // 缓冲区大小 11 COORD dwCursorPosition; // 当前光标位置 WORD wAttributes; // 字符属性 12 SMALL_RECT srWindow; // 当前窗口显示的大小和位置 13 COORD dwMaximumWindowSize; // 最大的窗口缓冲区大小 14 } CONSOLE_SCREEN_BUFFER_INFO
有了句柄类,就能帮助更好的操作屏幕,为我们实现控制台游戏打下进一步基础。
Vane_Tse On the Road. 2014-06-20 17:02:15