如何制作屏幕缓冲区 c++

How can i make a screen buffer c++

本文关键字:c++ 缓冲区 屏幕 何制作      更新时间:2023-10-16

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

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

我正在使用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的控制。我能够通过用InvalidateRect()替换system("cls");来消除代码中的闪烁。

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

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

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

ScreenToClient(console, &p);

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

有关创建自己的窗口的进一步阅读:创建窗口。不像使用控制台窗口那么简单,但您可以更好地控制。