学习C/C++中的windows.h库

目前在学习面向对象的C++编程,想使用windows控制台实现一些小程序的界面(常见控制台就是显示你程序输出的小黑窗)

#include <windows.h>

下面是我涉及到的相关windows.h的学习的记录

1、句柄(Handle)

是整个Windows编程的基础。一个句柄是指使用一个唯一的整数值,即一个4字节(32位系统)或8字节(64位程序中)长的数值,来让windows标识应用程序中的 不同对象 和 同类中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。

通用句柄HANDLE有时候是逻辑指针,大多数时候是结构体指针,特殊句柄如HMENU等是结构体指针,Windows内存管理器管理的其实都是句柄,通过句柄来管理指针

下面三句不是很懂:(关于windows编程)

1.通用句柄HANDLE和特殊句柄一般情况下是可以相互转换的,但是有时候会出错

2.如果不考虑跨平台移植的话,应该多采用Windows SDK提供的内存管理函数,这样可以获得更好的内存管理

3.C语言的内存分配函数的实现都是依靠使用GMEM_FIXED调用Windows SDK的内存分配函数的

2、屏幕缓冲区

控制台有一个输入缓冲 和 至少一个屏幕缓冲(输出缓冲)构成

输出缓冲可以认为是一个字符信息的二维数组,每个元素包括实际在控制台显示的字符和颜色。

系统在创建控制台时会自动创建一个屏幕缓冲。可以通过CreateConsoleScreenBuffer函数为控制台创建新的屏幕缓冲。可以通过SetConsoleActiveScreenBuffer 函数将屏幕缓冲设置为活动屏幕缓冲,达到显示的目的。不管是什么类型的屏幕缓冲(活动或者非活动)都可以直接读写。

 

在Windows官网上面有控制台的API函数的介绍,只不过是英文的   点这里直达

下面是我看这个网站 注释的一个别人写的 控制台小游戏2048 的控制台操作部分

/*
该程序用来在屏幕上显示matrix[row][column]数组的,四乘四
*/

	//创建屏幕缓冲区
	HANDLE hNewConsole = CreateConsoleScreenBuffer(GENERIC_WRITE | GENERIC_READ, //控制台屏幕缓冲区的权限 读或者写
		0, //0表示缓冲区不能共享。或者任意下列值:FILE_SHARE_READ共享读 FILE_SHARE_WRITE共享写
		NULL,//指向SECURITY_ATTRIBUTES结构体的指针 决定返回的句柄 是否可被继承 NULL代表处理不能被继承
		CONSOLE_TEXTMODE_BUFFER,//创建该控制台屏幕缓冲区的类型,可选类型只有 CONSOLE_TEXTMODE_BUFFER.
		NULL);  //约定值 就应当是NULL

	//定义一个_COORD类型(COORD)结构体cdBufferSize 存储屏幕尺寸信息
	COORD cdBufferSize = { 320,480 };// {80, 25}  COORD是CONSOLE_CURSOR_INFO 结构体的别名
	//设置窗口缓冲区大小
	SetConsoleScreenBufferSize(hNewConsole,  //有GENERIC_READ属性的 屏幕缓冲区句柄
							   cdBufferSize); //提供具体信息的 COORD 结构体 		

	//定义 _CONSOLE_CURSOR_INFO类型的结构体cci					   
	CONSOLE_CURSOR_INFO cci = { 0,0 };
	//隐藏光标
	SetConsoleCursorInfo(hNewConsole, &cci); //形参为 控制台句柄 和 _CONSOLE_CURSOR_INFO *型
 
	//设置标题栏
	SetConsoleTitle("2048小游戏");
 
	//提示信息
	if (gameWin)
		cout << "You win!" << endl;
	else if (gameOver)
		cout << "You lose!" << endl;
	else
		cout << "Fighting!" << endl;
	//打印格子
	for (int row = 0; row < ROW; row++)
	{
		for (int column = 0; column < COLUMN; column++)
		{
			COORD cdCursorPos = { column,row };
			//cout << matrix[row][column] << '\t';
			int *p = &matrix[row][column];
			SetConsoleCursorPosition(hNewConsole, cdCursorPos);
			WriteConsole(hNewConsole, //句柄
						 p, //一个指针 指向 包含要写元素的一个缓冲区 
						 sizeof(int),//要写元素的数量
						 NULL,//指向接收实际写入字符数的变量的指针。
						 NULL); //默认为NULL
		}
		cout << endl; cout << "row";
	}
	
	SetConsoleActiveScreenBuffer(hNewConsole);//将屏幕缓冲设置为活动屏幕缓冲 显示设计好的东西 参数只有一个— —控制台屏幕缓冲区的句柄
 
	//游戏结束,返回正常模式
	if (gameOver)
		SetConsoleActiveScreenBuffer(GetStdHandle(STD_OUTPUT_HANDLE));//输入以下标准器件参数之一:STD_INPUT_HANDLE(输入);STD_OUTPUT_HANDLE(输出);STD_ERROR_HANDLE(错误器件)	
 

 

 

  • 32
    点赞
  • 176
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值