所以,我有一个代表矩形的C ++类,我使用WriteConsoleOutputCharacter
函数输出比cout
或printf()
更快,我已经制作了一个打印矩形的程序,但是我无法清除矩形。
根据我对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
函数打印退格的方法来清除文本(而不是在它上面打印空格)。我知道这是一个非常基本的错误,并且有更好的方法。那么,有人可以告诉我,我的代码有什么问题吗?
对于清晰的矩形区域,我们可以使用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;
}