控制台双缓冲技术

控制台双缓冲技术

前言

在控制台重绘中,由于界面的不断刷新,显示部分会有一定的闪烁,解决这个问题的办法就是双缓冲技术,由两个缓冲区相互输出,从而达到屏幕无闪烁的效果

相关函数

CreateConsoleScreenBuffer

创建一个屏幕缓冲区

声明
HANDLE WINAPI CreateConsoleScreenBuffer( 
	 _In_             DWORD               dwDesiredAccess,         //权限
	 _In_             DWORD               dwShareMode,             	//共享模式 
	 _In_opt_   const SECURITY_ATTRIBUTES *lpSecurityAttributes,   //安全级别
	 _In_             DWORD               dwFlags,                 //标识符
	 _Reserved_       LPVOID              lpScreenBufferData       //保留,为NULL
);//创建屏幕缓冲区
参数
dwDesiredAccess

缓冲区权限,有以下可选值

名称 含义
GENERIC_READ 0x80000000 指示缓冲区可读
GENERIC_WRITE 0x40000000 指示缓冲区可写
dwShareMode

分享权限

名称 含义
FILE_SHARE_READ 0x00000001 缓冲区可共享读
FILE_SHARE_WRITE 0x00000002 缓冲区可共享写
lpSecurityAttributes

指向安全属性的指针,如不是NULL,将指示一个SECURITY_ATTRIBUTES结构体,若是NULL,则该句柄无法被子进程继承

dwFlags

标识符,指创建缓冲区的类型,目前只支持一种

名称 含义
CONSOLE_TEXTMODE_BUFFER 0x00000001 文本模式输出
lpScreenBufferData

该值保留,应为NULL

返回值

若函数成功,则返回指向缓冲区的一个句柄
若函数失败,则返回INVALID_HANDLE_VALUE(-1),若获取更多的信息请使用GetLastError
成功返回的缓冲区以下属性与现有缓冲区相同

  • 字体 - 从当前活跃的缓冲区复制
    • 显示的窗口大小 - 从当前活跃的缓冲区复制
    • 缓冲区大小 - 与显示的窗口匹配 (不复制)
    • 默认属性 (颜色) - 从当前活跃的缓冲区复制
    • 默认弹出属性 (颜色) - 从当前活跃的缓冲区复制
  • 要求
名称
最小支持客户端版本 Windows 2000专业版[仅桌面应用程序]
最小支持服务器版本 Windows 2000服务器[仅桌面应用程序]
头文件 ConsoleApi2.h(通过Wincon.h,包含Windows.h)
库文件 Kernel32.lib
DLL Kernel32.dll

SetConsoleActiveScreenBuffer

设置控制台活动缓冲区

声明
BOOL WINAPI SetConsoleActiveScreenBuffer(
	_In_ HANDLE hConsoleOutput  //缓冲区输出句柄
);//设置控制台活动缓冲区
参数
hConsoleOutput

要设置的缓冲区输出句柄

返回值若函数成功,则返回非零(TRUE)

若函数不成功,则返回FALSE,若获取更多的信息请使用GetLastError

要求
名称
最小支持客户端版本 Windows 2000专业版[仅桌面应用程序]
最小支持服务器版本 Windows 2000服务器[仅桌面应用程序]
头文件 ConsoleApi2.h(通过Wincon.h,包含Windows.h)
库文件 Kernel32.lib
DLL Kernel32.dll

CloseHandle

关闭指定打开的句柄

声明
BOOL CloseHandle(
	HANDLE hObject  //指定的句柄
);//关闭打开的句柄
参数
hObject

指向打开对象的句柄

返回值

若函数成功,则返回非零
若函数失败,则返回0,若获取更多的信息请使用GetLastError
若程序在调试模式下进行,则失败时抛出异常
失败有以下几种情况

  • 句柄无效- 将同一句柄使用CloseHandle两次
  • 将应使用FindClose关闭的句柄使用CloseHandle关闭
标记

使用CloseHandle可关闭以下类型的句柄

  • 权限令牌
  • 交互设备
  • 控制台输入
  • 控制台屏幕缓冲区
  • 事件 (Event)
  • 文件
  • 文件映射
  • 输入与输出端口
  • 任务(Job)
  • 邮槽(Mailslot)
  • 内存资源标识
  • 互斥量(Mutex)
  • 被命名的管道
  • 管道
  • 进程
  • 信号(Semaphore)
  • 线程- Transaction
  • 可等待的计时器
要求
名称
最小支持客户端版本 Windows 2000专业版[桌面应用程序 或 UWP程序]
最小支持服务器版本 Windows 2000服务器[桌面应用程序 或 UWP程序]
头文件 handleapi.h(包括Windows.h)
库文件 Kernel32.lib
DLL Kernel32.dll

应用

以下代码会有闪烁出现

#include <stdio.h>
#in
  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值