Прокрутка окна буфера экрана
Важно!
В этом документе описаны функции платформы консоли, которые больше не являются частью стратегии развития экосистемы. Мы не рекомендуем использовать это содержимое в новых продуктах, но мы будем продолжать поддерживать существующие использования для неопределенного будущего. Наше предпочтительное современное решение ориентировано на последовательности виртуальных терминалов для обеспечения максимальной совместимости в кроссплатформенных сценариях. Дополнительные сведения об этом решении по проектированию можно найти в классической консоли и в документе виртуального терминала .
Функцию SetConsoleWindowInfo можно использовать для прокрутки содержимого буфера экрана в окне консоли. Эта функция также может изменить размер окна. Функция может указать новые верхние и правые угла окна экрана консоли в качестве абсолютных координат буфера экрана или указать изменения из текущих координат окна. Функция завершается ошибкой, если указанные координаты окна находятся вне границ буфера экрана консоли.
В следующем примере прокручивается представление буфера экрана консоли вверх, изменив координаты окна, возвращаемые функцией GetConsoleScreenBufferInfo . Функция ScrollByAbsoluteCoord
демонстрирует, как указать абсолютные координаты, а ScrollByRelativeCoord
функция демонстрирует, как указать относительные координаты.
#include <windows.h>
#include <stdio.h>
#include <conio.h>
HANDLE hStdout;
int ScrollByAbsoluteCoord(int iRows)
{
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
SMALL_RECT srctWindow;
// Get the current screen buffer size and window position.
if (! GetConsoleScreenBufferInfo(hStdout, &csbiInfo))
{
printf("GetConsoleScreenBufferInfo (%d)\n", GetLastError());
return 0;
}
// Set srctWindow to the current window size and location.
srctWindow = csbiInfo.srWindow;
// Check whether the window is too close to the screen buffer top
if ( srctWindow.Top >= iRows )
{
srctWindow.Top -= (SHORT)iRows; // move top up
srctWindow.Bottom -= (SHORT)iRows; // move bottom up
if (! SetConsoleWindowInfo(
hStdout, // screen buffer handle
TRUE, // absolute coordinates
&srctWindow)) // specifies new location
{
printf("SetConsoleWindowInfo (%d)\n", GetLastError());
return 0;
}
return iRows;
}
else
{
printf("\nCannot scroll; the window is too close to the top.\n");
return 0;
}
}
int ScrollByRelativeCoord(int iRows)
{
CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
SMALL_RECT srctWindow;
// Get the current screen buffer window position.
if (! GetConsoleScreenBufferInfo(hStdout, &csbiInfo))
{
printf("GetConsoleScreenBufferInfo (%d)\n", GetLastError());
return 0;
}
// Check whether the window is too close to the screen buffer top
if (csbiInfo.srWindow.Top >= iRows)
{
srctWindow.Top =- (SHORT)iRows; // move top up
srctWindow.Bottom =- (SHORT)iRows; // move bottom up
srctWindow.Left = 0; // no change
srctWindow.Right = 0; // no change
if (! SetConsoleWindowInfo(
hStdout, // screen buffer handle
FALSE, // relative coordinates
&srctWindow)) // specifies new location
{
printf("SetConsoleWindowInfo (%d)\n", GetLastError());
return 0;
}
return iRows;
}
else
{
printf("\nCannot scroll; the window is too close to the top.\n");
return 0;
}
}
int main( void )
{
int i;
printf("\nPrinting twenty lines, then scrolling up five lines.\n");
printf("Press any key to scroll up ten lines; ");
printf("then press another key to stop the demo.\n");
for(i=0; i<=20; i++)
printf("%d\n", i);
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if(ScrollByAbsoluteCoord(5))
_getch();
else return 0;
if(ScrollByRelativeCoord(10))
_getch();
else return 0;
}