'Конкретная' Двойная буферизация с этим кодом? - PullRequest
1 голос
/ 26 июня 2019

Для этого кода я пытаюсь реализовать двойную буферизацию, чтобы она не мигала при обновлении std::cout в моем окне консоли в Windows 10. Каков наилучший способ реализовать это в моем текущем коде?Я смотрю на некоторую документацию Microsoft , но я не могу найти способ объединить это так сказать?

void ClearScreen()
{
    HANDLE                     hStdOut;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    DWORD                      count;
    DWORD                      cellCount;
    COORD                      homeCoords = { 0, 0 };

    homeCoords.X = 0;
    homeCoords.Y = 0;

    hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hStdOut == INVALID_HANDLE_VALUE) return;

    /* Get the number of cells in the current buffer */
    if (!GetConsoleScreenBufferInfo(hStdOut, &csbi)) return;
    cellCount = csbi.dwSize.X * csbi.dwSize.Y;

    /* Fill the entire buffer with spaces */
    if (!FillConsoleOutputCharacter(
        hStdOut,
        (TCHAR) ' ',
        cellCount,
        homeCoords,
        &count
    )) return;

    /* Fill the entire buffer with the current colors and attributes */
    if (!FillConsoleOutputAttribute(
        hStdOut,
        csbi.wAttributes,
        cellCount,
        homeCoords,
        &count
    )) return;

    /* Move the cursor home */
    SetConsoleCursorPosition(hStdOut, homeCoords);
}

1 Ответ

3 голосов
/ 26 июня 2019

Основная идея состоит в том, чтобы вызвать CreateConsoleScreenBuffer, чтобы создать внеэкранный буфер.Затем очистите / заполните его по мере необходимости, передавая дескриптор в этот экранный буфер, когда вы делаете ваши вызовы на FillConsoleOutputCharacter, FillConsoleOutputAttribute и т. Д. Когда он готов для просмотра пользователем, вызовите SetConsoleActiveScreenBuffer, чтобы сделать его активным буфером.для консоли.

Обратите внимание, что в большинстве случаев вам не нужно создавать новый экранный буфер каждый раз, когда вы очищаете экран - скорее вы захотите создать два экранных буфера при запуске вашей программыи чередуйте их, когда вы пишете и отображаете вывод.

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