一、原始方法
System("cls");//存在频闪
二、改进
#include<iostream>
#include "stdlib.h"
#include <Windows.h>
bool switchOver = false;
const int width = 20;
const int height = 20;
HANDLE hOutput, hOutBuf;//控制台屏幕缓冲区句柄
COORD coord = { 0,0 };
//双缓冲处理显示
DWORD bytes = 0;
char data[height + 2][width + 2];
void Draw() {
char a = ' ';
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
data[i][j] = '#';
}
std::cout << '\n';
}
//设置新的缓冲区为活动显示缓冲
if (!switchOver) {
for (int i = 0; i < height; i++) {
coord.Y = i;
WriteConsoleOutputCharacterA(hOutBuf, data[i], width, coord, &bytes);
}
SetConsoleActiveScreenBuffer(hOutBuf);
}
else {
//设置新的缓冲区为活动显示缓冲
for (int i = 0; i < height; i++) {
coord.Y = i;
WriteConsoleOutputCharacterA(hOutput, data[i], width, coord, &bytes);
}
SetConsoleActiveScreenBuffer(hOutput);
}
switchOver = !switchOver;
Sleep(200);
}
int main() {
//创建新的控制台缓冲区
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);
while (1) {
Draw();
}
return 0;
}