Следующий код работает должным образом в Windows XP, но в Windows 10 изображение начинает мерцать. Как мне заставить это работать в Windows 10?
#include <windows.h>
#include <ctime>
#include <vector>
#define xMax 180
#define yMax 45
#define Fps 250
class dbconsole
{
private:
int width, height, FPS, delay;
HANDLE h0, h1;
std::vector<CHAR_INFO> chiBuffer;
bool curBuffer;
int drawingTimer;
void preparebuffer(HANDLE &h)
{
CONSOLE_CURSOR_INFO cursor = {false, 1};
SMALL_RECT windowRectangle = {0,0,width-1,height-1};
h = CreateConsoleScreenBuffer(
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
CONSOLE_TEXTMODE_BUFFER,
NULL);
SetConsoleCursorInfo(h, &cursor);
SetConsoleScreenBufferSize (h, {width,height});
SetConsoleWindowInfo(h,true,&windowRectangle);
}
public:
dbconsole(int Width, int Height, int fps)
{
chiBuffer.reserve(Width*Height);
width = Width;
height = Height;
FPS = fps;
preparebuffer(h0);
preparebuffer(h1);
curBuffer = 0;
drawingTimer = clock();
for (int i = 0; i < xMax; i++) for (int j = 0; j < yMax; j++) chiBuffer[i+width*j] = {'t',16};
}
void depict()
{
SMALL_RECT srctWriteRect;
srctWriteRect.Top = 0;
srctWriteRect.Left = 0;
srctWriteRect.Bottom = height-1;
srctWriteRect.Right = width-1;
if ((clock()-drawingTimer)*FPS>CLOCKS_PER_SEC)
{
if (curBuffer)
{
WriteConsoleOutput(h0, &chiBuffer[0], {width,height}, {0,0}, &srctWriteRect);
SetConsoleActiveScreenBuffer(h0);
}
else
{
WriteConsoleOutput(h1, &chiBuffer[0], {width,height}, {0,0}, &srctWriteRect);
SetConsoleActiveScreenBuffer(h1);
}
curBuffer=!curBuffer;
drawingTimer = clock();
}
}
};
int main(void)
{
dbconsole myConsole = dbconsole(xMax,yMax,Fps);
while (true) myConsole.depict();
}
Я хочу, чтобы программа показывала черные буквы ‘t’ на синем фоне, но без мерцания и с двойной буферизацией
Хорошо, после изучения проблемы в любом случае, вот ответ.
CONSOLE_CURSOR_INFO
определяется как первый DWORD dwSize
и второй BOOL bVisible
но вы используете его, как будто первый и второй член, где наоборот. Как следствие, SetConsoleCursorInfo
не удается с возвращаемым значением 0
а также GetLastError
возвращает 87, что ERROR_INVALID_PARAMETER
(Смотрите коды ошибок)
Правильное отключение курсора должно решить проблему, хотя у меня нет windows 10 для тестирования.
Других решений пока нет …