Desplazamiento por la ventana de un búfer de pantalla
Importante
En este documento se describe funcionalidad de la plataforma de consola que ya no forma parte de nuestro plan de desarrollo del ecosistema. No se recomienda utilizar este contenido en nuevos productos, pero seguiremos admitiendo los usos existentes en un futuro indefinido. Nuestra solución moderna preferida se centra en secuencias de terminal virtual para lograr la máxima compatibilidad en escenarios multiplataforma. Puede encontrar más información sobre esta decisión de diseño en nuestro documento de Comparación de consola clásica y terminal virtual.
La función SetConsoleWindowInfo se puede utilizar para desplazar el contenido de un búfer de pantalla en la ventana de consola. Esta función también puede cambiar el tamaño de la ventana. La función puede especificar las nuevas esquinas superior izquierda e inferior derecha de la ventana del búfer de pantalla de la consola como coordenadas absolutas del búfer de pantalla, o bien especificar los cambios de las coordenadas de la ventana actual. Se produce un error en la función si las coordenadas de ventana especificadas están fuera de los límites del búfer de pantalla de la consola.
En el ejemplo siguiente se desplaza la vista del búfer de pantalla de la consola hacia arriba modificando las coordenadas de ventana que devuelve la función GetConsoleScreenBufferInfo. La función ScrollByAbsoluteCoord
muestra cómo especificar coordenadas absolutas, y la función ScrollByRelativeCoord
cómo especificar coordenadas relativas.
#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;
}