Я пытался создать / протестировать двойной буфер для консоли в 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() и AllocConsole() в начале?

2) Следует ли мне также использовать CloseHandle() для buffer1? Или мне даже не следует использовать его для buffer2?

3) Все остальное, на что вы считаете важным указать.

PS: Это мой первый вопрос, и я надеюсь, что не нарушаю никаких правил.

PS²: Я использовал system("PAUSE") только потому, что это был тест, и вам не стоит беспокоиться о том, что я использую его в реальном программном обеспечении.

3
Panda 20 Янв 2013 в 03:33

1 ответ

Лучший ответ

Узнал ответы, если кому интересно:

1) Я обнаружил, что это вообще безразлично. Однако, если вы запустите свою программу из cmd, это обеспечит появление другой консоли.

2) CloseHandle() следует использовать только для экранного буфера консоли. Стандартный вывод обрабатывается автоматически.

0
Panda 21 Янв 2013 в 05:17