2011-07-25 32 views
13

Cómo verificar ymax y xmax en una ventana de la consola, en Windows, usando plain c?¿Cómo obtener el tamaño del terminal en c para Windows?

No es este pedazo de código para Linux:

#include <stdio.h> 
#include <sys/ioctl.h> 
int main (void) 
{ 
    struct winsize max; 
    ioctl(0, TIOCGWINSZ , &max); 
    printf ("lines %d\n", max.ws_row); 
    printf ("columns %d\n", max.ws_col); 
} 

Ahora me pregunto cómo puedo hacer lo mismo para las ventanas. Intenté winioctl.h pero no define struct winsize ni ningún otro con un nombre similar.

¿Algún consejo? Gracias.

PS. En Linux también puede encontrar el tamaño de la consola usando getenv("LINES");. ¿Hay una variable similar en Windows?

PPS. Además, siempre hay ncurses.h, que supongo que funcionan en ambos sistemas, pero lo estoy evitando debido a conflictos con otras bibliotecas que tengo.

PPPS. Esta pregunta aquí Getting terminal width in C? tiene muchos consejos, por lo que no es necesario repetir eso.

Respuesta

3

(respuesta parcial)

este código:

CONSOLE_SCREEN_BUFFER_INFO csbi; 
int ret; 
ret = GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&csbi); 
if(ret) 
{ 
    printf("Console Buffer Width: %d\n", csbi.dwSize.X); 
    printf("Console Buffer Height: %d\n", csbi.dwSize.Y); 
} 

da el tamaño de la memoria intermedia. El único problema es que dwSize.Y no es realmente el tamaño de la pantalla (300 aquí en lugar de 25 líneas). Pero dwSize.X coincide con el número de la columna. Solo necesita windows.h para funcionar.

21

Esto imprime el tamaño de la consola, no el buffer:

#include <windows.h> 

int main(int argc, char *argv[]) { 
    CONSOLE_SCREEN_BUFFER_INFO csbi; 
    int columns, rows; 

    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi); 
    columns = csbi.srWindow.Right - csbi.srWindow.Left + 1; 
    rows = csbi.srWindow.Bottom - csbi.srWindow.Top + 1; 

    printf("columns: %d\n", columns); 
    printf("rows: %d\n", rows); 
    return 0; 
} 

Este código funciona porque srWindow "contiene las coordenadas de amortiguamiento pantalla de la consola de las esquinas superior izquierda e inferior derecha de la ventana de visualización" y la estructura SMALL_RECT "especifica las filas y columnas de las celdas de caracteres del búfer de pantalla" según MSDN. Restaba los lados paralelos para obtener el tamaño de la ventana de la consola. Como obtuve 1 menos que el valor real, agregué uno.

+0

Tengo poco tiempo para probarlo, pero parece que esta es la respuesta correcta a la pregunta. ¿Te importaría señalar la diferencia entre esta respuesta y la actualmente aceptada que muestra el tamaño del búfer? ¡Gracias! –

+0

@DrBeco En la mayoría de los casos, el tamaño del búfer de su respuesta y la ventana de visualización mencionada en esta respuesta tienen el mismo ancho, aunque esto no es necesario. Sin embargo, como se observa, el búfer y las ventanas pueden tener diferentes alturas y con frecuencia tienen diferentes alturas: esto es lo que permite desplazarse hacia atrás en una sesión de consola de Windows. Me resulta más fácil pensar en términos de un gran buffer, con una ventana más pequeña (visualización) que puede mirar cualquier sección del buffer principal. – dgnuff

Cuestiones relacionadas