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

时间:2019-03-31 19:33:30

标签: c++ windows output

所以,我有一个表示矩形的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函数来打印退格键的方法,以清除文本(而不是在其上方打印空格)。我知道这是一个非常基本的错误,并且有更好的方法。那么,有人可以告诉我我的代码有什么问题吗?

1 个答案:

答案 0 :(得分: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;
}