EGE专栏:EGE专栏
上一篇:EGE基础入门篇(七):组合图形
一、清屏
清屏即 清除屏幕(clear screen) ,可以将窗口上的输出内容全部清空,是重绘常用的一种方法。
1. 控制台清屏
在控制台下,执行 cls命令 将清除控制台中的所有输入输出,光标回到左上角。
当控制台输出的字符内容达到一定行数的时候,控制台会自动向下滚动,以便用户能查看到最新的输出。并且用户可以拖动滚动条查看之前输出的信息,便于查看历史记录。
但如果是用控制台做UI界面的话,太多的信息显示在窗口中反而显得杂乱,并且很难一眼看到关键信息。如下图所示:

如果在输出前,先调用cls命令清屏,将之前的输出信息清除,再输出当前要显示的文字,那么窗口上只显示相关内容,清晰明了,有利于用户的阅读和界面交互。如下图所示:

但是清屏会使得控制台之前的输出信息会丢失,所以清屏并不适合在输出调试信息时使用。
控制台可以控制光标位置,当需要动态输出时,比如加载进度的显示,可以稍微跳转到目标位置,改变字符,这适用于明确输出内容并且只有少量修改的情况。在不清楚之前控制台中的输出内容,以及需要改变大量字符的时候,还是需要进行清屏,然后重新打印输出。
1.1 控制台清屏命令:cls
控制台的 cls命令 可以通过 system() 函数调用, system() 函数在 <stdlib.h> 头文件中声明。
在cpp源文件中包含 <stdlib.h> 头文件:
#include <stdlib.h>
当需要对控制台清屏时,调用 system("cls") 即可。
system("cls");
控制台清屏示例:
下面是纯控制台的一个程序,在输出N行信息后,通过调用 system("cls") 将控制台清屏。
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int main()
{
for (int i = 0; i < 30; i++) {
printf("[%2d]输出信息\n", i);
}
printf("\n按任意键将清除所有输出...\n");
getch();
//清屏
system("cls");
printf("清除完毕,按任意键退出");
getch();
return 0;
}

2. 图形窗口清屏
控制台可以将输出存储到一个字符序列里,输出字符串时就直接把字符串添加进字符序列中。那窗口显示的内容是怎么存储的呢?
光栅显示器能显示图像是依靠显示器上一个个会发光的像素,这些像素通过发出不同的色光来组成一张彩色的图像。为了让窗口显示出对应的图像,我们就需要把组成图像的每一个像素的颜色值都存储下来。等到系统来读取我们存储的颜色数据时,系统就能按照这些颜色数据,一一改变对应像素的颜色,这样我们就能在屏幕上看到我们想要的图像。

2.1 窗口像素颜色值的存储:帧缓冲
窗口区域通常是矩形,对于宽高分别为 w i d t h width width, h e i g h t height height 的矩形区域,如果表示一个像素颜色值需要 N N N个字节,那么开辟一个大小为 N ⋅ w i d t h ⋅ h e i g h t N \cdot width \cdot height N⋅width⋅height 字节的存储空间就可以用来表示窗口区域的图像内容。这个存储空间称之为帧缓冲(Frame Buffer),窗口的帧缓冲通常是在开辟在内存中,帧缓冲数据最终需要传输到显存中,由显卡读取并显示到屏幕上。
在EGE中,像素颜色格式为ARGB格式,每一个像素点的颜色都用4个字节来表示,这样可以表示约1678万种颜色。

2.1.1 获取帧缓冲首地址
EGE中图像和窗口内容的帧缓冲首地址,可以使用 getbuffer() 函数获取。
像素颜色的类型为color_t,帧缓冲首地址类型是color_t *。
color_t* buffer = getbuffer((PIMAGE)NULL);
得到帧缓冲首地址后,我们便可以直接读取和修改帧缓冲中的值。
2.1.2 获取帧缓冲大小
帧缓冲区保存的颜色值数量和矩形区域中的像素数量一致,假设矩形区域宽高分别为 w i d t h \mathrm{width} width 和

本文详细讲解了如何在EGE中实现控制台和图形窗口的清屏操作,包括cls命令的使用、帧缓冲的工作原理以及cleardevice()函数的作用。同时,阐述了为何需要清屏重绘以及如何高效地进行图形的动态重绘。
:清屏与重绘&spm=1001.2101.3001.5002&articleId=123433093&d=1&t=3&u=837a8932cec540309fa5e50f14346978)
2505

被折叠的 条评论
为什么被折叠?



