在下面的代码中,我应该如何在控制台底部创建一个彩色条?
下面的代码使条形图位于顶部,但我不想在底部创建条形图.我该怎么做?
下面的代码使条形图位于顶部,但我不想在底部创建条形图.我该怎么做?
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,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_HEIGHT-1 };
我不确定sr.Window.Left是否只是零,但让我们玩得安全.
更新1:我在rcRegion中使用了Bottom,它应该是Top.我误解了原始代码.
现在你的代码有一些问题.首先,您使用未初始化的内存并将其写入缓冲区.最通常会产生搞笑效果.
其次,您需要了解当您将这样一个大区域直接写入缓冲区时,您将覆盖之前的所有内容.这包括您在开始时编写的文本.
如果要保留它,首先需要从缓冲区读取,更改它并回写.
无论如何,如何修复CHAR_BUFFER问题:
CHAR_INFO buffer[SCREEN_HEIGHT][SCREEN_WIDTH]; memset(&buffer,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_ *与窗口的实际宽度和高度不对应.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。