Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 控制台图形帮助!_C_Winapi_Console_Console Application - Fatal编程技术网

C 控制台图形帮助!

C 控制台图形帮助!,c,winapi,console,console-application,C,Winapi,Console,Console Application,在下面的代码中,我应该如何在控制台底部创建一个彩色条?? 下面的代码使条形图位于顶部,但我不想在底部创建条形图。我该怎么做 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; S

在下面的代码中,我应该如何在控制台底部创建一个彩色条?? 下面的代码使条形图位于顶部,但我不想在底部创建条形图。我该怎么做

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 ); 
}
用于获取结构

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_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;
}
for(int i=0;i
这应该非常简单。将
o
写入缓冲区的最后一行。我们还告诉它把它变成蓝色。如果您愿意,您可以使用“宽字符”(unicode),
UnicodeChar=L'å'

这将产生如下结果:

您可以在这里看到一些剩余的问题。我们的缓冲区不会覆盖所有屏幕区域,留下一些完整的部分(您可以在页边空白处看到
cl.exe
的结果)

原因很明显:
屏幕*
与窗口的实际宽度和高度不对应


我的提示也在块的中间结束了,但是这主要是因为我们的程序在退出之后没有清理。直到终止,它才可见。

我仍然无法使它工作。请你详细说明代码好吗。。。。这就是我正在做的:
CONSOLE\u SCREEN\u BUFFER\u INFO bufferInfo;bufferInfo.srWindow.Left=0;bufferInfo.srWindow.Bottom=25;GetConsoleScreenBufferInfo(hOutput和bufferInfo)@宠坏了:我的思维有一个错误。我也知道为什么它不起作用。请稍等,我将更新我的答案。Windows应用程序没有
void main()
函数。