双缓冲技术解决屏闪问题

函数system(“cls”)在很多时候会造成屏闪的情况。

#include<cstdio>
#include<windows.h>
#define LENGTH 6
void show()
{
    system("cls");
    for(int i=0;i<LENGTH;i++){
        for(int j=0;j<LENGTH;j++){
            printf("*");
        }
        printf("\n");
    }
}
int main()
{
    while(1)
        show();
}

双缓冲技术可以很好的解决这一问题

#include<cstdio>
#include<cstdlib>
#include<windows.h>
#define LENGTH 6

//控制台屏幕缓冲区句柄
HANDLE hOutput,hOutBuf;
COORD coord={0,0};//COORD是个结构体变量类型typedef struct _COORD{SHORT X;SHORT Y;}COORD;
//双缓冲处理显示
DWORD bytes=0;
char data[LENGTH][LENGTH];

void double_buff_init()
{
    //创建新的控制台缓冲区
    hOutBuf = CreateConsoleScreenBuffer(
        GENERIC_WRITE,//定义进程可以往缓冲区写数据
        FILE_SHARE_WRITE,//定义缓冲区可共享写权限
        NULL,
        CONSOLE_TEXTMODE_BUFFER,
        NULL
    );
    hOutput = CreateConsoleScreenBuffer(
        GENERIC_WRITE,//定义进程可以往缓冲区写数据
        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 show()
{
    int i,j;
    for(i=0;i<LENGTH;i++){
        for(j=0;j<LENGTH;j++){
            //printf("*");
            data[i][j]='*';
        }
        //printf("\n");
    }

    /*双buff切换显示*/
    static bool switchover=0;
    if(switchover){
        for(int i=0;i<LENGTH;i++){
            coord.Y=i;
            WriteConsoleOutputCharacterA(hOutBuf,data[i],LENGTH,coord,&bytes);//该函数的五个参数分别为:句柄、要输出的字符串、输出长度、起始位置、已写个数
        }
        SetConsoleActiveScreenBuffer(hOutBuf);//设置新的缓冲区为活动显示缓冲
    }
    else{
        for(int i=0;i<LENGTH;i++){
            coord.Y=i;
            WriteConsoleOutputCharacterA(hOutBuf,data[i],LENGTH,coord,&bytes);
        }
        SetConsoleActiveScreenBuffer(hOutBuf);//设置新的缓冲区为活动显示缓冲
    }
    switchover=!switchover;
    Sleep(200);
}
void show1()
{
    int i,j;
    for(i=0;i<LENGTH;i++)
    for(j=0;j<LENGTH;j++)
        data[i][j]='*';
    for(i=0;i<LENGTH;i++){
        coord.Y=i;
        WriteConsoleOutputCharacterA(hOutBuf,data[i],LENGTH,coord,&bytes);
    }
    SetConsoleActiveScreenBuffer(hOutBuf);
    Sleep(200);
    for(i=0;i<LENGTH;i++)
    for(j=0;j<LENGTH;j++)
        data[i][j]='-';
    for(i=0;i<LENGTH;i++){
        coord.Y=i;
        WriteConsoleOutputCharacterA(hOutput,data[i],LENGTH,coord,&bytes);
    }
    SetConsoleActiveScreenBuffer(hOutput);
    Sleep(200);
}
int main()
{
    double_buff_init();
    while(1)
        show();
        //show1();
    return 0;
}

详细请看:双缓冲解决控制台应用程序输出“闪屏”(C/C++,Windows)

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值