在下面的代码中,我应该如何在控制台底部创建彩色条? 下面的代码使条形图位于顶部,但我不想在底部创建条形图。我该怎么做?
void main(void)
{
HANDLE hOutput = (HANDLE)GetStdHandle( STD_OUTPUT_HANDLE );
// Set the text output position to (5,10)
COORD sPos;
sPos.X = 5;
sPos.Y = 10;
SetConsoleCursorPosition( hOutput, sPos );
// Set the color to bright green
SetConsoleTextAttribute( hOutput,
FOREGROUND_INTENSITY | FOREGROUND_GREEN );
// Write the text
DWORD nWritten;
WriteConsole( hOutput, "This is a test", 14, &nWritten, NULL );
CHAR_INFO buffer[SCREEN_HEIGHT][SCREEN_WIDTH];
COORD dwBufferSize = { SCREEN_WIDTH,SCREEN_HEIGHT };
COORD dwBufferCoord = { 0, 0 };
SMALL_RECT rcRegion = { 0, 0, SCREEN_WIDTH-1, SCREEN_HEIGHT-1 };
WriteConsoleOutput( hOutput, (CHAR_INFO *)buffer, dwBufferSize,
dwBufferCoord, &rcRegion );
}
答案 0 :(得分:2)
使用GetConsoleScreenBufferInfo
获取CONSOLE_SCREEN_BUFFER_INFO
结构。
CONSOLE_SCREEN_BUFFER_INFO bufferInfo;
GetConsoleScreenBufferInfo(hOutput, &bufferInfo);
您可以使用srWindow
,它将为您提供显示窗口角落的坐标。
使用此选项将栏放在底部:
// bufferInfo is a structure CONSOLE_SCREEN_BUFFER_INFO.
SMALL_RECT rcRegion =
{
bufferInfo.srWindow.Left,
bufferInfo.srWindow.Top,
SCREEN_WIDTH-1,
SCREEN_HEIGHT-1
};
我不确定sr.Window.Left
是否为零,但让我们玩得安全。
更新1:我在Bottom
中使用了rcRegion
,它应该是Top
。我误解了原始代码。
现在您的代码存在一些问题。首先,您使用未初始化的内存并将其写入缓冲区。这通常会带来欢闹的效果。
其次,您需要了解当您将这样的大区域直接写入缓冲区时,您将覆盖之前的任何内容。这包括您在开始时编写的文本。
如果你想保留它,你首先需要从缓冲区读取,改变它并回写。
无论如何,如何修复CHAR_BUFFER
问题:
CHAR_INFO buffer[SCREEN_HEIGHT][SCREEN_WIDTH];
memset(&buffer, 0, sizeof(buffer));
归零。这可以确保缓冲区中的每个字符都会在写入的位置呈现黑色空白。
然后我们需要打印我们的酒吧。我在这里使用小写字母O.
for (int i = 0; i < SCREEN_WIDTH; i++)
{
buffer[SCREEN_HEIGHT - 1][i].Char.AsciiChar = 'o';
buffer[SCREEN_HEIGHT - 1][i].Attributes = FOREGROUND_BLUE;
}
这应该非常简单。您将o
写入缓冲区的最后一行。我们也告诉它让它变蓝。如果您愿意,可以使用“宽字符”(unicode),UnicodeChar = L'å'
。
这会产生如下结果:
您可以在此处查看其余一些问题。我们的缓冲区不会覆盖所有屏幕区域,保留一些部分(您可以在边距中看到cl.exe
的结果。)
为什么这应该非常明显:SCREEN_*
与窗口的实际宽度和高度不对应。
此外,我的提示最终在块的中间,但这主要是因为退出后我们的程序没有清理。直到终止才能看到它。