Как я могу сделать экранный буфер C ++ - PullRequest
0 голосов
/ 05 февраля 2019

Я хочу иметь возможность рисовать весь мой текст, линии, треугольники и другие элементы на экране, а затем очищать экран и рисовать что-то новое, НО этот метод заставляет экран мерцать, и все рисунки не появляются одновременно.

Моя идея - нарисовать какой-нибудь буфер, а затем вывести этот буфер на экран, очистить буфер и повторить.Таким образом, экран не будет мерцать, и все будет отображаться одновременно.

Я использую 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));       
    }
}

Заранее спасибо, Марк.

1 Ответ

0 голосов
/ 06 февраля 2019

Я не думаю, что вы обладаете таким большим контролем над окном консоли, как если бы вы управляли своим собственным 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);

к GetMousePos() после того, как вы позвоните GetCursorPos(&p);.Это отобразит указатель совместно с окном вместо экрана.

Дополнительная информация о создании собственного окна: Создание окна .Не так просто, как с использованием окна консоли, но у вас гораздо больший контроль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...