3

を使用して、Windows でコンソールのダブル バッファを作成/テストしようとしていましたwindows.h

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()andAllocConsole()は本当に必要ですか?

2) CloseHandle()buffer1 にも使用する必要がありますか? または、buffer2に使用するべきではありませんか?

3) その他、指摘することが重要だと思われること。

PS: これは私の最初の質問です。ガイドラインに違反していないことを願っています。

PS²:system("PAUSE")これはテストのためだけに使用したものであり、実際のソフトウェアで使用することについて心配する必要はありません。

4

1 に答える 1

0

誰かが興味を持っている場合に備えて、答えを見つけてください:

1) 私はそれがまったく違いがないことを発見しました. ただし、cmd からプログラムを実行すると、別のコンソールが表示されます。

2)CloseHandle()は、コンソール画面バッファにのみ使用する必要があります。標準出力は自動的に処理されます。

于 2013-01-21T01:17:11.433 に答える