小白求解,问:怎么在缓冲模式下先暂停5秒后再大矩形里再显示另一个矩形?

0

怎么在缓冲模式下先暂停5秒后再大矩形里再显示另一个矩形?

问题:在 EASYX 的无限循环清屏缓冲区模式下,无法达到暂缓的功能。

目标:在 EASYX 的无限循环清屏缓冲区模式下,达到成功在一个大矩形区里先暂停 5 秒后显示里头的另一个小红矩形

问题示例代码:

#include<graphics.h>

// 合成初始化,初始程序位置,大小,参数,背景及标题名称,窗口圆角度。
void iniwindows(int x, int y, int w, int h, int flag, COLORREF RGB, LPCTSTR str, int xr, int yr)
{
	// 初始化绘图库
	initgraph(w, h, flag);
	setbkcolor(RGB);
	// 刷新背景
	cleardevice();
	// 获得窗口句柄
	HWND hWnd = GetHWnd();
	// 初始程序位置
	MoveWindow(hWnd, x, y, w, h, true);
	// 设置圆角
	HRGN rgn = CreateRoundRectRgn(10, 8, w - 10, h - 10, xr, yr);
	SetWindowRgn(hWnd, rgn, true);
	// 使用 Windows API 修改窗口名称
	SetWindowText(hWnd, str);
	setlinecolor(BLACK);

}

int main()
{
	
	// 合成初始化,初始程序位置,大小,参数,背景及标题名称,窗口圆角度。
	iniwindows(400, 400, 500, 600, NULL, WHITE, _T("怎么在缓冲模式下先暂停5秒后再大矩形里再显示另一个矩形?"), 20, 20);

	// 缓冲区
	BeginBatchDraw();
	while(1)
	{
	// 循环清屏
	cleardevice();
	
	// 大矩形
	rectangle(100, 100, 200, 200);
	
	// 先暂停五秒再显示下个的小红矩形,可以在这里没有用
	Sleep(5000);
	// 大矩形里的小红矩形
	setlinecolor(RED);
	rectangle(100+10, 100+10, 200-10, 200-10);
	
	// 缓冲区
	FlushBatchDraw();

	
	}

	EndBatchDraw();

	getmessage(EX_CHAR);
	return 0;
}

我要的效果代码:

#include<graphics.h>

// 合成初始化,初始程序位置,大小,参数,背景及标题名称,窗口圆角度。
void iniwindows(int x, int y, int w, int h, int flag, COLORREF RGB, LPCTSTR str, int xr, int yr)
{
	// 初始化绘图库
	initgraph(w, h, flag);
	setbkcolor(RGB);
	// 刷新背景
	cleardevice();
	// 获得窗口句柄
	HWND hWnd = GetHWnd();
	// 初始程序位置
	MoveWindow(hWnd, x, y, w, h, true);
	// 设置圆角
	HRGN rgn = CreateRoundRectRgn(10, 8, w - 10, h - 10, xr, yr);
	SetWindowRgn(hWnd, rgn, true);
	// 使用 Windows API 修改窗口名称
	SetWindowText(hWnd, str);
	setlinecolor(BLACK);

}

int main()
{
	
	// 合成初始化,初始程序位置,大小,参数,背景及标题名称,窗口圆角度。
	iniwindows(400, 400, 500, 600, NULL, WHITE, _T("怎么在缓冲模式下先暂停5秒后再大矩形里再显示另一个矩形?"), 20, 20);

	// 缓冲区
	
	while(1)
	{
	// 循环清屏
		cleardevice();	
	// 大矩形
	rectangle(100, 100, 200, 200);
	
	// 先暂停五秒再显示下个的小红矩形,可以在这里没有用
	Sleep(200);
	// 大矩形里的小红矩形
	setlinecolor(RED);
	rectangle(100+10, 100+10, 200-10, 200-10);
	// 缓冲区
	Sleep(180);
	
	}
	getmessage(EX_CHAR);
	return 0;
}
ava
随波逐流

2022-12-18

1

在批量绘图模式下,任何时候想要显示,都必须执行 FlushBatchDraw()。

所以,只需要在 Sleep 之前执行 FlushBatchDraw() 即可。

ava
慢羊羊

2022-12-19

试了下的解和加 EndBatchDraw(); 一样的效果,区别在于  FlushBatchDraw()  函数不需要开头循环 BeginBatchDraw(); 感觉性能会增加?这个写入缓冲区是不是有点像多线程一样的机制?还是把绘制图像的函数底层换成了缓冲区?? -  随波逐流  2022-12-19
1

想要缓冲区停下来很简单,把 EndBatchDraw();  这个打屎棍加进入就好了,不清楚这函数是干啥的,但是实测有用,在这个缓冲区循环里。

修改后代码:

#include<graphics.h>

// 合成初始化,初始程序位置,大小,参数,背景及标题名称,窗口圆角度。
void iniwindows(int x, int y, int w, int h, int flag, COLORREF RGB, LPCTSTR str, int xr, int yr)
{
	// 初始化绘图库
	initgraph(w, h, flag);
	setbkcolor(RGB);
	// 刷新背景
	cleardevice();
	// 获得窗口句柄
	HWND hWnd = GetHWnd();
	// 初始程序位置
	MoveWindow(hWnd, x, y, w, h, true);
	// 设置圆角
	HRGN rgn = CreateRoundRectRgn(10, 8, w - 10, h - 10, xr, yr);
	SetWindowRgn(hWnd, rgn, true);
	// 使用 Windows API 修改窗口名称
	SetWindowText(hWnd, str);
	setlinecolor(BLACK);

}

void be()
{
	EndBatchDraw();
}
int main()
{

	// 合成初始化,初始程序位置,大小,参数,背景及标题名称,窗口圆角度。
	iniwindows(400, 400, 500, 600, NULL, WHITE, _T("怎么在缓冲模式下先暂停5秒后再大矩形里再显示另一个矩形?"), 20, 20);

	// 缓冲区
	BeginBatchDraw();
	while (1)
	{
		
		// 循环清屏
		cleardevice();
		
		// 大矩形
		rectangle(100, 100, 200, 200);

	
		EndBatchDraw();
		// 先暂停五秒再显示下个的小红矩形,可以在这里没有用
		Sleep(500);

		
		// 大矩形里的小红矩形
		setlinecolor(RED);
		rectangle(100 + 10, 100 + 10, 200 - 10, 200 - 10);
		
		Sleep(500);
		// 缓冲区
	
		FlushBatchDraw();
		
	}

	EndBatchDraw();

	getmessage(EX_CHAR);
	return 0;
}
ava
Margoo

2022-12-19

根据我的项目,这样搞很有用,但是可以 EndBatchDraw(); 加 sleep 这样组合起来吗?同时也不能让缓冲区失去作用,因为按你的方法,我点一下会闪一下。就是专门的函数,缓冲区专用暂缓函数有没有? -  随波逐流  2022-12-19
技术讨论社区