2016-01-07 70 views
-1

我在C++中找到了一個刪除控制檯內容的函數。我測試了它,它工作,但我不明白。下面是函數:C/C++中的ClearConsole() - 清除控制檯的函數

void ClearScreen() 
{ 
    HANDLE      hStdOut; 
    CONSOLE_SCREEN_BUFFER_INFO csbi; 
    DWORD      count; 
    DWORD      cellCount; 
    COORD      homeCoords = { 0, 0 }; 
    hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); 
    if (hStdOut == INVALID_HANDLE_VALUE) return; 
    if (!GetConsoleScreenBufferInfo(hStdOut, &csbi)) return; 
    cellCount = csbi.dwSize.X *csbi.dwSize.Y; 
    if (!FillConsoleOutputCharacter(
    hStdOut, 
    (TCHAR) ' ', 
    cellCount, 
    homeCoords, 
    &count 
    )) return; 
    if (!FillConsoleOutputAttribute(
    hStdOut, 
    csbi.wAttributes, 
    cellCount, 
    homeCoords, 
    &count 
    )) return; 
    SetConsoleCursorPosition(hStdOut, homeCoords); 
} 

此功能使用

#include <windows.h> 

如果任何人都可以向我解釋,它是如何工作的,如果是有效的,並隨時給我建議其他的方式做同樣的事情。謝謝!

+0

如果您只是想清除命令窗口,那麼您可以使用[system](http://www.cplusplus.com/reference/cstdlib/system/)方法傳遞正確的清除命令。在Windows上,clear命令是'cls'。請查看[this](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682022(v = vs.85).aspx)瞭解有關注釋的代碼示例。 –

+0

如果您有工作代碼,請索取SE代碼審查的評論。 –

回答

1

system("cls");我想是更好的方法。

你的函數從控制檯的標準輸出句柄(聊到微軟)

hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); // info stays in hStdOut (HANDLE) 

和控制檯緩衝區的信息(也跟微軟)

GetConsoleScreenBufferInfo(hStdOut, &csbi) // info stays in csbi (CON._SCREEN_BUFFER_INFO) 

然後,填補當前控制檯內容與' '字符(空格)

FillConsoleOutputCharacter(hStdOut, (TCHAR) ' ', cellCount, homeCoords, &count) 
                  //count is amount of ' ' filled 

重置控制檯a ttributes:

FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, cellCount, homeCoords, &count) 
// takes info from hStdOut and csbi (cellCount based on csbi), homeCoords is simply {0,0} 

和反繞光標到控制檯緩衝區的開始。

SetConsoleCursorPosition(hStdOut, homeCoords); // sets cursor to {0,0} coords 
+0

只是不便攜式,但因爲OP的代碼不是。 –

+0

謝謝!我會嘗試系統(「cls」),看看它是如何工作的。祝你有美好的一天! – AceX