Поделиться через


Прокрутка буфера экрана

Важно!

В этом документе описаны функции платформы консоли, которые больше не являются частью стратегии развития экосистемы. Мы не рекомендуем использовать это содержимое в новых продуктах, но мы будем продолжать поддерживать существующие использования для неопределенного будущего. Наше предпочтительное современное решение ориентировано на последовательности виртуальных терминалов для обеспечения максимальной совместимости в кроссплатформенных сценариях. Дополнительные сведения об этом решении по проектированию можно найти в классической консоли и в документе виртуального терминала .

В окне консоли отображается часть активного буфера экрана. Каждый буфер экрана поддерживает собственный прямоугольник окна, указывающий координаты ячеек верхнего левого и нижнего правого символов, отображаемых в окне консоли. Чтобы определить текущий прямоугольник окна буфера экрана, используйте GetConsoleScreenBufferInfo. При создании буфера экрана верхний левый угол окна находится в левом верхнем углу буфера экрана консоли (0,0).

Прямоугольник окна может измениться, чтобы отобразить различные части буфера экрана консоли. Прямоугольник окна буфера экрана может измениться в следующих ситуациях:

  • При вызове SetConsoleWindowInfo для указания нового прямоугольника окна он прокручивает представление буфера экрана консоли, изменяя положение прямоугольника окна, не изменяя размер окна. Примеры прокрутки содержимого окна см. в разделе "Прокрутка окна буфера экрана".

    screen buffer window panning around large buffer of content

  • При использовании функции WriteFile для записи в буфер экрана с включенным режимом вывода в конце строки (EOL) прямоугольник окна автоматически перемещается, поэтому курсор всегда отображается.

  • Если функция SetConsoleCursorPosition задает новую позицию курсора, которая находится за пределами текущего прямоугольника окна, прямоугольник окна автоматически перемещается для отображения курсора.

  • Когда пользователь изменяет размер окна консоли или использует полосы прокрутки окна, прямоугольник окна активного буфера экрана может измениться. Это изменение не сообщается как событие изменения размера окна в входном буфере.

В каждой из этих ситуаций прямоугольник окна сдвигается, чтобы отобразить другую часть буфера экрана консоли, но содержимое буфера экрана консоли остается в той же позиции. В следующих ситуациях содержимое буфера экрана консоли может привести к перемещению содержимого буфера экрана консоли:

  • При вызове функции ScrollConsoleScreenBuffer прямоугольный блок копируется из одной части буфера экрана в другую.
  • При использовании WriteFile для записи в буфер экрана с включенной оболочкой в режиме вывода EOL содержимое буфера экрана консоли будет автоматически прокручиваться при обнаружении конца буфера экрана консоли. Это прокрутка не карта верхней строке буфера экрана консоли.

ScrollConsoleScreenBuffer указывает прямоугольник буфера экрана консоли, который перемещается, и новые верхние левые координаты, в которые копируется прямоугольник. Эта функция может прокручивать часть или все содержимое буфера экрана консоли.

На рисунке показана операция ScrollConsoleScreenBuffer , которая прокручивает все содержимое буфера экрана консоли вверх по нескольким строкам. Содержимое верхних строк не карта, а нижние строки заполняются указанным символом и цветом.

screen buffer window scrolling content off top to discard

Эффекты ScrollConsoleScreenBuffer можно ограничить, указав необязательный прямоугольник обрезки, чтобы содержимое буфера экрана консоли за пределами прямоугольника обрезки не изменилось. Эффект вырезки заключается в создании подмножика (прямоугольник с вырезкой), содержимое которого прокручивается, не затрагивая остальную часть буфера экрана консоли. Пример использования ScrollConsoleScreenBuffer см. в разделе "Прокрутка содержимого буфера экрана".