初识句柄操作(控制台窗口小实验)

今日学习了控制台使用句柄操作的方法。

我们都知道,使用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

初识句柄操作(控制台窗口小实验),布布扣,bubuko.com

时间: 2024-10-06 01:14:55

初识句柄操作(控制台窗口小实验)的相关文章

VB.net 通过句柄操作其他窗口

Imports System.TextImports System.Runtime.InteropServices Public Class Form1    ' 相关API函数声明,注释掉的这里没用到,但是也比较常用吧,这些函数的功能都能搜到.    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpW

得到控制台窗口的句柄

得到控制台窗口的句柄 调用 GetConsoleTitle() 来保存当前的控制台窗口标题. 调用 SetConsoleTitle() 来将控制台标题更改为一个唯一的标题. 调用 Sleep(40),以确保已更新窗口标题. 调用 FindWindow(NULL, uniquetitle),以获取 HWND,此调用将返回 HWND, 如果操作失败,将返回 NULL. 从步骤 1 中,若要恢复原始窗口标题检索调用 SetConsoleTitle() 的值. 您应该测试结果的 HWND.例如,您可以测

VC 获取控制台窗口的句柄(hWnd)

在Windows中,句柄是一个系统内部数据结构的引用.例如当你操作一个窗口,或说是一个Delphi窗体时,系统会给你一个该窗口的句柄,系统会通知你:你正在操作142号窗口,就此你的应用程序就能要求系统对142号窗口进行操作--移动窗口.改变窗口大小.把窗口极小化为图标等.实际上许多Windows API函数把句柄作为它的第一个参数,如GDI(图形设备接口)句柄.菜单句柄.实例句柄.位图句柄等,不仅仅局限于窗口函数.换句话说,句柄是一种内部代码,通过它能引用受系统控制的特殊元素,如窗口.位图.图标

C语言控制台窗口图形界面编程(五).

控制文本的移动是控制台窗口界面编程的一个很重要的功能,有了这个功能我们可以实现界面的滚动.下面我们介绍一个控制文本移动的函数,如下: BOOL ScrollConsoleScreenBuffer(             //文本移动函数 HANDLE hConsoleOutput,                  //句柄 const SMALL_RECT *lpScrollRectangle,    //移动区域 const SMALL_RECT *lpClipRectangle,    

C语言控制台窗口图形界面编程(一)

本系列文章改编自<C语言控制台窗口界面编程(修正版)>.本系列文章会抛弃一些原文中难懂难理解且不常用的部分,并修改了部分样例程序.只为了更加清晰地学习C语言的控制台窗口界面编程.而想要更加深入的了解本系列文章,请阅读<C语言控制台窗口界面编程(修正版)>. <C语言控制台窗口界面编程(修正版)>下载地址:http://download.csdn.net/detail/jzqt_t/7471013 在Windows操作系统下用C语言编写控制台的窗口界面首先要获取当前标准输

C语言控制台窗口图形界面编程(二)

下面介绍几个用于控制台窗口操作的API函数,如下: [cpp] view plaincopy //获取控制台窗口信息 GetConsoleScreenBufferInfo(); //获取控制台窗口标题 GetConsoleTitle(); //更改指定缓冲区大小 SetConsoleScreenBufferSize(); //设置控制台窗口标题 SetConsoleTitle(); //设置控制台窗口信息 SetConsoleWindowInfo(); 下面的示例程序用于说明此类函数的使用: [

Android开发5:应用程序窗口小部件App Widgets的实现

前言 本次主要是实现一个Android应用,实现静态广播.动态广播两种改变 widget内容的方法,即在上篇博文中实验的基础上进行修改,所以此次实验的重点是AppWidget小部件的实现啦~ 首先,我们简单说一下Widget是一个啥玩意~ 应用程序窗口小部件(Widget)是微小的应用程序视图,可以被嵌入到其它应用程序中(比如桌面)并接收周期性的更新.你可以通过一个App Widget provider来发布一个Widget.可以容纳其它App Widget的应用程序组件被称为App Widge

C语言控制台窗口图形界面编程(八):鼠标事件

<知识分享> 上次讲的是键盘事件,这次我们介绍鼠标事件.下面先介绍下鼠标事件的结构体以及相关信息. typedef struct _MOUSE_EVENT_RECORD      //鼠标事件结构体 { COORD dwMousePosition;      //当前鼠标在控制台窗口缓冲区的位置 DWORD dwButtonState;        //鼠标按键的状态 DWORD dwControlKeyState;    //控制键状态 DWORD dwEventFlags;       

ES6小实验-字符串的扩展

ES6里面的对字符串的扩展实际上就是增加了一些方法,使对字符串的操作更加完善,下面做几个小实验来验证下: includes(): 返回布尔值,表示是否找到了参数字符串,支持第二的参数,表示开始的位置 'use strict'; var s = 'Hello world!'; console.log(s.includes('Hello'));//true startsWith(): 返回布尔值,表示参数字符串是否在源字符串的头部,支持第二的参数,表示开始的位置 'use strict'; var