控制台图形帮助!

在下面的代码中,我应该如何在控制台底部创建一个彩色条?

下面的代码使条形图位于顶部,但我不想在底部创建条形图.我该怎么做?

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 ); 
}

最佳答案 使用
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:我在rcRegion中使用了Bottom,它应该是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_ *与窗口的实际宽度和高度不对应.

此外,我的提示最终在块的中间,但这主要是因为退出后我们的程序没有清理.直到终止才能看到它.

点赞