use*_*410 5 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);
}
Run Code Online (Sandbox Code Playgroud)
尽管如此,我还是得到了一些微小的眨眼.有人有主意吗?
发生这种情况的原因是因为在您清除控制台屏幕和实际绘制到它之间,显示会刷新。通常,这可能发生得如此之快,以至于您永远不会看到它,但偶尔您会在正确的时间执行此操作,并且会体验到闪烁。
一个很好的选择是创建一个与控制台屏幕大小和宽度相同的屏幕外缓冲区,在那里完成所有文本输出和更新,然后使用WriteConsoleOutput. 确保您考虑到屏幕缓冲区必须保存文本和属性信息,格式与控制台相同。
BOOL WINAPI WriteConsoleOutput(
_In_ HANDLE hConsoleOutput,
_In_ const CHAR_INFO *lpBuffer,
_In_ COORD dwBufferSize,
_In_ COORD dwBufferCoord,
_Inout_ PSMALL_RECT lpWriteRegion
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5123 次 |
| 最近记录: |