Я пытался создать / протестировать двойной буфер для консоли в 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")
только потому, что это был тест, и вам не стоит беспокоиться о том, что я использую его в реальном программном обеспечении.
1 ответ
Узнал ответы, если кому интересно:
1) Я обнаружил, что это вообще безразлично. Однако, если вы запустите свою программу из cmd, это обеспечит появление другой консоли.
2) CloseHandle()
следует использовать только для экранного буфера консоли. Стандартный вывод обрабатывается автоматически.
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.