如何使用WriteConsoleOutputCharacter()从文本中清除区域?

问题描述 投票:-1回答:1

所以,我有一个代表矩形的C ++类,我使用WriteConsoleOutputCharacter函数输出比coutprintf()更快,我已经制作了一个打印矩形的程序,但是我无法清除矩形。

根据我对msdn的理解,这个函数可以从控制台的当前代码页打印unicode字符或8位字符。无论如何,当我想要打印退格以清除矩形时它不起作用并打印其他东西(◘)。当我尝试通过它的十六进制代码(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);

        }
    }


}

好吧,我想要的是一种用WriteConsoleOutputCharacter函数打印退格的方法来清除文本(而不是在它上面打印空格)。我知道这是一个非常基本的错误,并且有更好的方法。那么,有人可以告诉我,我的代码有什么问题吗?

c++ windows output
1个回答
1
投票

对于清晰的矩形区域,我们可以使用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;
}
© www.soinside.com 2019 - 2024. All rights reserved.