双缓冲技术解决屏闪问题
程序员文章站
2022-03-05 09:54:11
...
函数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;
}
上一篇: ElasticSearch基本使用
下一篇: windows API(8)线程控制