Win32 C ++控制台清除屏幕没有闪烁

时间:2013-04-21 12:34:14

标签: c++ windows winapi console-application

我见过一些控制台游戏,屏幕刷新/清除,没有烦人的眨眼。我尝试了很多解决方案,这就是我现在所获得的:

while(true)
{
    if(screenChanged) //if something needs to be drawn on new position
    {
    COORD coordScreen = { 0, 0 };
    DWORD cCharsWritten;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    DWORD dwConSize;
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    GetConsoleScreenBufferInfo(hConsole, &csbi);
    dwConSize = csbi.dwSize.X * csbi.dwSize.Y;
    FillConsoleOutputCharacter(hConsole, TEXT(' '), dwConSize, coordScreen, &cCharsWritten);
    GetConsoleScreenBufferInfo(hConsole, &csbi);
    FillConsoleOutputAttribute(hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten);
    SetConsoleCursorPosition(hConsole, coordScreen);
    } 

    ///printf all the time graphics on their right position with SetConsoleCursorPosition

    Sleep(33.3f);
}  

尽管如此,我还是有点眨眼了。有人有什么想法吗?

3 个答案:

答案 0 :(得分:4)

发生这种情况的原因是因为显示屏会在您清除控制台屏幕和实际绘制屏幕之间刷新。通常这种情况发生得如此之快,以至于你永远都看不到它,但偶尔你会在正确的时间做到这一点并且你会遇到闪烁。

一个很好的选择是创建一个与控制台屏幕大小和宽度相同的屏幕外缓冲区,完成所有文本输出并在那里更新,然后使用WriteConsoleOutput将整个缓冲区发送到控制台屏幕。请确保您考虑到屏幕缓冲区必须同时包含文本和属性信息,格式与控制台相同。

BOOL WINAPI WriteConsoleOutput(
  _In_     HANDLE hConsoleOutput,
  _In_     const CHAR_INFO *lpBuffer,
  _In_     COORD dwBufferSize,
  _In_     COORD dwBufferCoord,
  _Inout_  PSMALL_RECT lpWriteRegion
);

答案 1 :(得分:3)

你想要做相当于双缓冲。使用CreateConsoleScreenBuffer和SetConsoleActiveScreenBuffer api调用,您可以修改屏幕外缓冲区,然后切换缓冲区,就像过去那样糟糕的过去:)这里有一篇文章解释了如何:http://msdn.microsoft.com/en-us/library/windows/desktop/ms685032%28v=vs.85%29.aspx

答案 2 :(得分:-2)

您正在寻找双缓冲