gpt4 book ai didi

c++ - 我如何制作屏幕缓冲区 C++

转载 作者:行者123 更新时间:2023-11-28 04:25:01 25 4
gpt4 key购买 nike

我希望能够将我所有的文本、线条、三角形和其他东西绘制到屏幕上,然后清除屏幕并绘制新的东西,但是这种方法会使屏幕闪烁,并且所有绘图不会同时出现.

我的想法是绘制到某种缓冲区,然后将该缓冲区绘制到屏幕并清除缓冲区,然后重复。这样屏幕就不会闪烁,并且所有内容都会同时绘制。

我正在使用 windows.h ,Visual Studio。

#include <Windows.h>
#include <iostream>
using namespace std;

struct vec2d
{
int x, y;
};

void Line(HDC dc, vec2d a, vec2d b)
{
MoveToEx(dc, a.x, a.y, NULL);
LineTo(dc, b.x, b.y);
}

vec2d GetMousePos(HWND console)
{
vec2d out;
POINT p;
GetCursorPos(&p);
out.x = p.x; out.y = p.y;
return out;
}

int main()
{
HWND console = GetConsoleWindow();
HDC dc = GetDC(console);
SelectObject(dc, CreatePen(PS_SOLID, 1, RGB(255, 255, 255)));

while (1)
{
//BitBlt(dc, 0, 0, 1000, 1000, 0, 0, 0, BLACKNESS); Flickering is much much bigger, because its faster
system("cls");
Line(dc, { 0, 0 }, GetMousePos(console));
}
}

提前致谢,马克。

最佳答案

我认为您对控制台窗口的控制不如对您自己的 HWND 的控制多。通过将 system("cls"); 替换为 InvalidateRect(),我能够消除代码中的闪烁。

RECT client;
GetClientRect(console, &client);
while (1)
{
InvalidateRect(console, &client, TRUE);
Line(dc, console, { 0, 0 }, GetMousePos(console));
}

(您可以通过仅使绘制上一条线的区域无效来改进这一点。)

此外,您可以进行的另一项更改(与闪烁无关)是添加:

ScreenToClient(console, &p);

在你调用 GetCursorPos(&p); 之后到 GetMousePos()。这会将指针坐标映射到窗口而不是屏幕。

进一步阅读有关创建您自己的窗口的信息:Creating a Window .不像使用控制台窗口那么简单,但您拥有更大的控制权。

关于c++ - 我如何制作屏幕缓冲区 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54539115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com