Tamaño de la ventana de consola en C

MrSteinfeld -  
[Dal] Mensajes publicados 6122 Fecha de registro   Estado Colaborador Última intervención   -
Buenas noches,
Aquí está mi problema.
Estoy desarrollando un programa en C que muestra elementos en la consola.
Sin embargo, cuando compilo la ventana no se abre lo suficientemente grande como para mostrar todo correctamente y cuando la pongo en pantalla completa, los caracteres de uno de los elementos que muestro 2 segundos después de abrir la consola se desalinean ligeramente.
Así que he estado buscando una solución para que, cuando compile, obtenga una ventana de consola más grande.
Me informé sobre la función:
SetWindowPos(HWND, hWnd, int X, int Y, cx,cy,UINT uFlags);
Sin embargo, no entiendo nada de los argumentos que debo ingresar entre los paréntesis excepto int X, int Y, cx,cy.
¿Alguien podría explicarme qué debo poner para que la función funcione bien, por favor?
Y si alguien conoce otro método para manejar el tamaño de la ventana de consola en C, también estoy interesado, por favor.
Gracias de antemano.
Que tengas una buena noche.
MrSteinfeld

Configuración: Windows / Chrome 96.0.4664.110

2 respuestas

[Dal] Mensajes publicados 6122 Fecha de registro   Estado Colaborador Última intervención   1 108
 
Hola MrSteinfeld,

SetWindowPos() se utiliza para posicionar una ventana de una aplicación gráfica de Windows.

Para actuar sobre la ventana de terminal CMD.exe, tienes funciones específicas en la API de Windows.

La función SetConsoleWindowInfo():

https://docs.microsoft.com/en-us/windows/console/setconsolewindowinfo

Para utilizarla, no es tarea fácil. Debes:
  • obtener un handle de la ventana CMD.exe
  • obtener un handle de la salida estándar
  • obtener el tamaño máximo para la mayor ventana de consola posible, según la fuente actual y el tamaño de la pantalla
  • modificar el tamaño del buffer de pantalla de la consola CMD en la que estás trabajando
  • reactivar la ventana de la consola CMD pidiendo al sistema que la maximice


Esto da como resultado:

#include <stdio.h> #include <windows.h> int main(void) { printf("Por favor, presiona Enter\n"); getchar(); HWND console_window = GetConsoleWindow(); if (!console_window) { printf("GetConsoleWindow() falló\n"); return EXIT_FAILURE; } HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE); if (handle_out == INVALID_HANDLE_VALUE) return GetLastError(); COORD largest_size = GetLargestConsoleWindowSize(handle_out); if (!largest_size.X && !largest_size.Y) return GetLastError(); largest_size.X--; largest_size.Y--; if (!SetConsoleScreenBufferSize(handle_out, largest_size)) { return GetLastError(); } if (!ShowWindow(console_window, SW_MAXIMIZE)) { printf("ShowWindow() falló\n"); return EXIT_FAILURE; } printf("Este programa continúa ahora en la ventana de terminal " "más ancha posible\n"); printf("Por favor, presiona Enter para terminar este magnífico programa\n"); getchar(); return 0; }


(código probado en un Windows 10 con el MinGW proporcionado por Codeblocks)

Sin embargo, en la documentación actual de Microsoft, el uso de SetConsoleWindowInfo() ahora es desalentado por ellos (aunque indican que seguirán apoyándolo en el futuro) y sugieren el uso de secuencias de escape (que sólo funcionan en sistemas recientes de Windows 10 que las soportan).

https://docs.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#window-width

SetConsoleWindowInfo() está soportada desde Windows 2000 :-)

Dal
0
Michel_pc4 Mensajes publicados 5 Estado Miembro
 
Hola,

también estoy buscando un poco lo mismo.
Estoy en Linux Mint 20.1, estoy desarrollando
con Code::Blocks 20.3.

Actualmente, creo que puedo sortear el problema
instalando un "temporizador" de 5 segundos para darme
tiempo de agrandar la ventana y así refrescar
la pantalla.

Es un poco lo que hago de hecho en mi versión de 80X24.

Sin embargo, sigo buscando una solución más elegante.
Así que me conecto a tu hilo, si encuentro, si alguien conoce la solución...

Utilizo gotoxy(x,y) para leer/escribir en la pantalla.

Michel.
0
[Dal] Mensajes publicados 6122 Fecha de registro   Estado Colaborador Última intervención   1 108
 
Hola Michel_pc4,

1.

Bajo Linux, dependiendo de los terminales que vayas a usar, las secuencias de escape correspondientes pueden funcionar o no.

printf("\x1b[9;1;t");


Se supone que maximiza la ventana.

printf("\x1B[8;48;179t");


Se supone que establece la altura en 48 caracteres y el ancho en 179.

Sin embargo, este tipo de secuencias de manipulación de la ventana rara vez son soportadas por los terminales virtuales, por ejemplo gnome-terminal en Debian no hace nada (creo que es un terminal basado en gnome-terminal el que es predeterminado en Mint, pero no estoy seguro). En cambio, otras secuencias CSI pueden ser soportadas, por ejemplo, aquellas que permiten cambiar los colores del texto:

 printf("\x1b[104;93m"); printf("Texto coloreado\n"); printf("\x1b[0m"); 


pero también aquellas que permiten mover el cursor a coordenadas (quizás tu función gotoxy() a la que haces alusión las utilice), limpiar la pantalla, etc.

2.

Los terminales virtuales generalmente gestionan sus propios parámetros y permiten al usuario cambiar el tamaño de la ventana por diferentes métodos. En el caso de gnome-terminal en Debian, puedes gestionar varios perfiles, cada uno con preferencias particulares.

Por ejemplo, gnome-terminal en Debian permite especificar que se quiere iniciar maximizado y ejecutando un programa dado:

gnome-terminal --quiet --maximize -- /usr/bin/links www.commentcamarche.net


En un terminal, escribe
gnome-terminal --help
o el nombre de tu gestor de terminal virtual seguido de
--help
para conocer sus posibles opciones de lanzamiento.

Dal
0