c++ - Win32 C++ 控制台清屏不闪烁

标签 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);
}  

不过,我还是有点眨眼。有人有什么想法吗?

最佳答案

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

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

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

关于c++ - Win32 C++ 控制台清屏不闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16131148/

相关文章:

C++ printf 带 %f 但已针对用户所在国家/地区进行了本地化

c++类型转换以获得访问权限

c++ - (缺少)使用 C++11 move 语义的性能改进

java - Runtime.getRuntime().exec() 的奇怪行为

c - 捕获WM_CHAR消息时如何检测UNICODE字符?

c++ - 如何配置 HttpEndRequest 的超时?

c++ - 如何使用linux接受多个输入来做操作

c++ - 如何在结构数组中自动初始化最后一项?

c++ - 表示纪元之前的日期

c++ - 为什么我无法使用 CreateFile Win32 API 打开文件 RW 但可以使用 std::remove 将其删除?