加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 01:53:25 所属栏目:Windows 来源:网络整理
导读:我见过一些控制台游戏,屏幕刷新/清除,没有烦人的眨眼.我尝试了很多解决方案,这就是我现在所获得的解决方案: while(true){ if(screenChanged) //if something needs to be drawn on new position { COORD coordScreen = { 0,0 }; DWORD cCharsWritten; CONSO
我见过一些控制台游戏,屏幕刷新/清除,没有烦人的眨眼.我尝试了很多解决方案,这就是我现在所获得的解决方案:

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,&cCharsWritten);
    SetConsoleCursorPosition(hConsole,coordScreen);
    } 

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

    Sleep(33.3f);
}

尽管如此,我还是得到了一些微小的眨眼.有人有主意吗?

解决方法

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读