EGE基础入门篇(八):清屏与重绘

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

EGE专栏: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 Nwidthheight 字节的存储空间就可以用来表示窗口区域的图像内容。这个存储空间称之为帧缓冲(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

依稀_yixy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值