C++ 刷新屏幕

C++ 刷新屏幕

方法一:清除文字,重新打印

使用system函数清除控制台的文本,再重新打印,实现刷新屏幕的效果

system函数就不用多讲了,直接上代码:

#include <bits/stdc++.h>
#include <windows.h> //Sleep()
using namespace std;

int main() { 
	for(int i=1;i<=10;i++) { 
		system("cls")
		for(int j=1;j<=i;j++)cout<<" ";
		cout<<"Hello, world"<<endl;
		Sleep(100);
	}
	return 0;
}

运行代码,就可以看到Hello, world的字幕在屏幕上移动,看起来没有什么问题,但是,如果把代码改成这样:

#include <bits/stdc++.h>
#include <windows.h> //Sleep()
using namespace std;

int main() { 
	for(int i=1;i<=10;i++) { 
		system("cls");
		for(int k=1;k<=10;k++) { 
			for(int j=1;j<=i;j++)cout<<" ";
			cout<<"Hello, world"<<endl;
		}
		Sleep(100);
	}
	return 0;
}

运行代码,文本清除时的闪烁清晰可见,除非你电脑的性能特别好,不然看着真的很难受,我们不得不换一个方法。

方法二:直接覆盖原来的文本

清除屏幕行不通,那就索性不清除了。

有经验的人肯定知道,控制台里的退格是没有插入模式的,这就意味着我们可以用需要打印的文本覆盖没有用的文本。

我们首先要将光标移动到控制台左上角,也就是第一行第一列,这里我们写一个gotoxy函数,用来移动光标,详见 C++ 移动光标

void gotoxy(int x, int y) { 
	COORD pos = { x,y};
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOut, pos);
}

记得加上头文件:

#include <windows.h>

然后,就可以开始打印文字了,用本次打印的文本覆盖之前打印的文本。
这里贴上代码:

#include <bits/stdc++.h>
#include <windows.h>
using namespace std;

void gotoxy(int x, int y) { 					//移动光标
	COORD pos = { x,y};
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOut, pos);
}

int main() { 
	for(int i=1;i<=10;i++) { 
		gotoxy(0,0);						//将光标移动至控制台左上角
		for(int k=1;k<=10;k++) { 
			for(int j=1;j<=i;j++)cout<<" ";
			cout<<"Hello, world"<<endl;
		}
		Sleep(100);
	}
	return 0;
}

运行代码,闪烁终于没有了,这表明我们成功了。

拓展:局部刷新

也许你会觉得这样的刷新速度太慢了,你可以尝试使用局部刷新。

所谓局部刷新,就是指将需要清除的部分清除,不需要清除的保留,从而起到加快速度的效果。

我们来观察一下,每次打印时都会将Hello, world向后移动一格。所以,需要清除的部分其实就是在Hello, world前面的那一个字符(其它字符都会被Hello, world覆盖),也就是H。我们就将H清除掉就行了。

贴上完整代码:

#include <bits/stdc++.h>
#include <windows.h>
using namespace std;

void gotoxy(int x, int y) { 					//移动光标
	COORD pos = { x,y};
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOut, pos);
}

int main() { 
	for(int i=1;i<=10;i++) { 
		for(int k=1;k<=10;k++) { 
			gotoxy(i-1,k-1);				//将光标移至第k行,第i列
			cout<<"Hello, world";
			if(i>1) { 						//i大于1时做,不然坐标会变成负数
				gotoxy(i-2,k-1);			//将光标移至前一个字符
				cout<<' ';					//清除那个字符
			}
		}
		Sleep(100);
	}
	return 0;
}

小结

通过本章的学习,想必你已经学会了快速清除屏幕的方法。
如果这篇文章对你有帮助的话,一定要点个赞哈!

    原文作者:匿名用户__
    原文地址: https://blog.csdn.net/wangxun20081008/article/details/115594058
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞