我试图使用windows.h
在Windows上为控制台制作/测试双缓冲区。
经过对msdn的一些研究后,我想出了这个:
`
//Free current console
if ( FreeConsole() == 0 ) return GetLastError();
//Get clean console
if ( AllocConsole() == 0 ) return GetLastError();
HANDLE buffer1 = GetStdHandle( STD_OUTPUT_HANDLE );
HANDLE buffer2 = CreateConsoleScreenBuffer( GENERIC_WRITE,
0,
NULL,
CONSOLE_TEXTMODE_BUFFER,
NULL );
COORD begin;
begin.X = 0;
begin.Y = 0;
SetConsoleCursorPosition(buffer1, begin);
DWORD writen;
WriteConsole( buffer1,
L"Milk\n",
5,
&writen,
NULL );
WriteConsole( buffer2,
L"Melk\n",
5,
&writen,
NULL );
system("PAUSE");
SetConsoleActiveScreenBuffer( buffer2 );
WriteConsole( buffer2,
L"Malk\n",
5,
&writen,
NULL );
WriteConsole( buffer1,
L"Mulk\n",
5,
&writen,
NULL );
system("PAUSE");
SetConsoleActiveScreenBuffer( buffer1 );
system("PAUSE");
CloseHandle( buffer2 );
return 0; //End of main
谢天谢地,这是按预期工作的。
首先屏幕输出只是:
Milk
然后是:
Melk
Malk
结束:
Milk
Mulk
我对此有几个问题:
1)开始时FreeConsole()
和AllocConsole()
是否真的有必要?
2)我是否应该将CloseHandle()
用于buffer1?或者我不应该将它用于缓冲区2?
3)你认为重要的是指出其他任何事情。
PS:这是我的第一个问题,我希望我没有违反任何准则。
PS²:我只使用system("PAUSE")
,因为这是一个测试,你不应该担心我在实际的软件中使用它。
答案 0 :(得分:0)
如果有人有兴趣,请找出答案:
1)我发现根本没有任何区别。但是,如果您从cmd执行程序,将确保另一个控制台弹出。
2)CloseHandle()
只应用于控制台屏幕缓冲区。标准输出会自动处理。