控制台双缓冲防闪烁--功能封装

使用时,将包括#define DATALEN 10000的语句以及整个类、全局变量scrbuf的定义都拷贝到你的代码文件中。
默认不开启双缓冲。

  • 调用scrbuf.on()开始双缓冲模式
  • 此模式下,输出文字不会立即显示在屏幕上。
    需要手动调用scrbuf.update()刚才输入的内容才会显示在屏幕上。
  • 清空屏幕操作不要用system("cls"),而是用成员函数scrbuf.clear()
  • 调用scrbuf.off()关闭双缓冲模式
#include<bits/stdc++.h>
#include<Windows.h>
using namespace std;
#define DATALEN 10000
class ScreenBuff{
public:
    HANDLE hOutput;
    HANDLE hOutBuf;
    COORD coord={0,0};
    DWORD bytes;
    bool isOn;
    char data[DATALEN];
    ScreenBuff(){
        bytes = 0;
        hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
        hOutBuf = CreateConsoleScreenBuffer(
            GENERIC_READ | GENERIC_WRITE, 
            FILE_SHARE_READ | FILE_SHARE_WRITE, 
            NULL, 
            CONSOLE_TEXTMODE_BUFFER, 
            NULL
        );
        CONSOLE_CURSOR_INFO cci;
        cci.bVisible=0;
        cci.dwSize=1;
        SetConsoleCursorInfo(hOutput, &cci);
        SetConsoleCursorInfo(hOutBuf, &cci);
    }
    void on()
    {//开启双缓冲后,在输出后必须调用update才能显示 
        isOn = true;
        SetConsoleActiveScreenBuffer(hOutBuf);
    }
    void off()
    {//关闭双缓冲 
        isOn = false;
        SetConsoleActiveScreenBuffer(hOutput);
    }
    void update()
    {//更新屏幕 
        if(isOn)
        {
            ReadConsoleOutputCharacterA(hOutput, data, DATALEN, coord, &bytes);
       	    WriteConsoleOutputCharacterA(hOutBuf, data, DATALEN, coord, &bytes);
        }
    }
    void clear()//清空屏幕 
    {
    	CONSOLE_SCREEN_BUFFER_INFO cinfo;//用于储存控制台缓冲区信息,在这里主要获取控制台缓冲区大小
		DWORD recnum;
		GetConsoleScreenBufferInfo(hOutput, &cinfo);//cinfo.dwSize储存的是缓冲区大小//cinfo.dwSize.X * cinfo.dwSize.Y 即需填充的字符数
		FillConsoleOutputCharacterW(hOutput,  L' ', cinfo.dwSize.X * cinfo.dwSize.Y, (COORD){0, 0}, &recnum);//从{0,0}处开始填充' '字符,成功填充个数为recnum
		FillConsoleOutputAttribute(hOutput, 0, cinfo.dwSize.X * cinfo.dwSize.Y, (COORD){0, 0}, &recnum);//设置输出颜色,如果不是单一颜色,可能会有清除字符而背景色没有清除的现象
		SetConsoleCursorPosition(hOutput, (COORD){0, 0});//将光标设为{0,0}
		update();	
	}
}scrbuf;
int main()
{
    scrbuf.on();
    while(1)
    {
	    for (char c='a'; c<='e'; c++)
	    {
	        scrbuf.clear();//清空屏幕 
	        for (int i=0; i<2000; i++)
	        {
	            printf("%c",c);
	        }
	        scrbuf.update();
	    }
	}
    scrbuf.off();
    return 0;
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值