2011-05-15 145 views
4

在下面的代碼中,我該如何在控制檯底部創建一個彩色條? 下面的代碼使得酒吧在最頂端,但我不想在底部創建酒吧。我該怎麼做?控制檯圖形幫助!

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

Windows應用程序沒有'void main()'函數。 – 2011-05-15 12:42:01

回答

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:我在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'å'

,這會使得像一個結果:

Console output on Win7 x86-64

你可以看到一些剩餘的問題在這裏。我們的緩衝區不覆蓋所有的屏幕區域,留下一些作品完整(你可以看到從cl.exe那裏的利潤率的結果。)

爲什麼這應該是很明顯的:SCREEN_*不符合實際的寬度和窗戶的高度。

此外,我的提示最終在塊的中間,但主要是因爲我們的程序不退出後清理。直到終止後纔可見。

+0

我仍然無法使其工作。請詳細說明代碼....這就是我正在做的: \t'CONSOLE_SCREEN_BUFFER_INFO bufferInfo; \t bufferInfo.srWindow.Left = 0; \t bufferInfo.srWindow.Bottom = 25; \t GetConsoleScreenBufferInfo(hOutput,&bufferInfo);' – Rafay 2011-05-15 12:30:24

+1

@Spoilt:我的思維有誤。我也知道爲什麼它不起作用。等一下,我會更新我的答案。 – Skurmedel 2011-05-15 12:45:45