我忘记了什么吗? (适用于Windows的双控制台缓冲区)

时间:2013-01-19 23:33:35

标签: c++ winapi console

我试图使用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"),因为这是一个测试,你不应该担心我在实际的软件中使用它。

1 个答案:

答案 0 :(得分:0)

如果有人有兴趣,请找出答案:

1)我发现根本没有任何区别。但是,如果您从cmd执行程序,将确保另一个控制台弹出。

2)CloseHandle()只应用于控制台屏幕缓冲区。标准输出会自动处理。