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