Как очистить область от текста с помощью WriteConsoleOutputCharacter ()? - PullRequest
0 голосов
/ 31 марта 2019

Итак, у меня есть класс C ++, который представляет прямоугольники, я использую функцию WriteConsoleOutputCharacter, которая выводит быстрее, чем cout или printf(), я уже создал программу, которая печатает прямоугольник, но у меня возникли проблемыочистка прямоугольника.

Насколько я понимаю из msdn, эта функция может печатать символы Unicode или 8-разрядные символы из текущей кодовой страницы консоли.Во всяком случае, когда я хотел напечатать backspace, чтобы очистить прямоугольник, он не работал, и он печатает что-то еще (◘).Когда я попытался напечатать backspace через его шестнадцатеричный код (0x008), он снова напечатал символ.

Код довольно прост:

const char clr[] ="\b";//Thar the array I'm printing 


void rect_m::clr_ar()
{

    Ex = Vx + Lx;//These variables are the rectangle's sizes
    Ey = Vy + Ly;
    HANDLE mout = GetStdHandle(STD_OUTPUT_HANDLE);
        //The loops cover the rectangle area
    for (SHORT i = Vy; i < Ey; i++)
    {
        for (SHORT j = Vx; j < Ex; j++)
        {
            WriteConsoleOutputCharacter(mout, clr, strlen(clr), { j,i }, &dwWritten);

        }
    }


}

Ну, все, что мне нужно, это способ печати backspace с функцией WriteConsoleOutputCharacter, чтобы очистить текст (а не печатать пробелы надЭто).Я знаю, что это очень простая ошибка, и есть лучший способ.Так, может кто-нибудь сказать мне, пожалуйста, что не так с моим кодом?

1 Ответ

1 голос
/ 31 марта 2019

для чистой области прямоугольника мы можем использовать ScrollConsoleScreenBufferW для заполнения выделенного прямоугольника пустыми символами. обратите внимание, что пустые символы равны пустому пространству, которое мы можем просмотреть в тесте, если вызов ReadConsoleOutputCharacter в начале начинается на пустой консоли:

COORD xy{};
ULONG n;
WCHAR c;
ReadConsoleOutputCharacterW(hConsoleOutput, &c, 1, xy, &n);
//c == ' ';

полный код может выглядеть так:

BOOL cls(const SMALL_RECT* lpScrollRectangle = 0)
{
    HANDLE hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    if (GetConsoleScreenBufferInfo(hConsoleOutput, &csbi))
    {
        CHAR_INFO fi = { ' ', csbi.wAttributes };
        if (!lpScrollRectangle)
        {
            csbi.srWindow.Left = 0;
            csbi.srWindow.Top = 0;
            csbi.srWindow.Right = csbi.dwSize.X - 1;
            csbi.srWindow.Bottom = csbi.dwSize.Y - 1;
            lpScrollRectangle = &csbi.srWindow;
        }
        return ScrollConsoleScreenBufferW(hConsoleOutput, lpScrollRectangle, 0, csbi.dwSize, &fi);
    }
    return FALSE;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...