Taille fenêtre console en C

Fermé
MrSteinfeld - 6 janv. 2022 à 21:35
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 12 janv. 2022 à 11:02
Bonsoit,
Voici mon problème.
Je développe un programme en C qui affiche des éléments sur la console.
Cependant lorsque je compile la fenêtre s'ouvre pas suffisamment grande pour bien tout afficher et lorsque je la passe en plein écran les caractères d'un des éléments que j'affiche 2 secondes après l'ouverture de la console sont décale légerement.
J'ai donc cherché une solution pour, lorsque je compile, obtenir une fenetre de console plus grande.
Je me suis donc renseigné sur la fonction :
SetWindowPos(HWND, hWnd, int X, int Y, cx,cy,UINT uFlags);
Cependant je ne comprend rien aux arguments que je doit entrer entre les parenthèses hormis int X, int Y, cx,cy.
Quelqu'un pourrait-il m'expliquer ce que je doit mettre pour que la fonction fonctionne bien s'il vous plait?
Et si quelqu'un connait une autre méthode pour gérer la taille de la fenetre console en C je suis preneur aussi s'il vous plait?
Merci d'avance
Bonne fin de soirée.
MrSteinfeld




Configuration: Windows / Chrome 96.0.4664.110
A voir également:

2 réponses

[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 7 janv. 2022 à 00:04
Salut MrSteinfeld,

SetWindowPos() sert à positionner une fenêtre d'une application graphique Windows.

Pour agir sur la fenêtre de terminal CMD.exe, tu as des fonctions spécifiques dans l'API Windows.

La fonction SetConsoleWindowInfo() :

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

Pour l'utiliser, ce n'est pas une mince affaire. Il faut :
  • obtenir un handle sur la fenêtre CMD.exe
  • obtenir un handle sur la sortie standard
  • obtenir la taille maximale taille pour la plus grande fenêtre de console possible, en fonction de la police actuelle et de la taille de l’affichage
  • modifier la taille de la mémoire tampon d’écran de la console CMD sur laquelle tu travailles
  • réactiver la fenêtre de la console CMD en demandant au système de la maximiser


Cela donne ceci :

#include <stdio.h>
#include <windows.h>

int main(void)
{
        printf("Veuillez presser Enter\n");
        getchar();

        HWND console_window = GetConsoleWindow();
        if (!console_window) {
                printf("GetConsoleWindow() failed\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() failed\n");
                return EXIT_FAILURE;
        }

        printf("Ce programme continue maintenant dans la fenetre de terminal "
                "la plus large possible\n");
        printf("Veuillez presser Enter pour terminer ce magnifique programme\n");
        getchar();

        return 0;
}


(code testé sous un Windows 10 avec le MinGW fournit par Codeblocks)

Sinon, dans la documentation actuelle de Microsoft l'utilisation de SetConsoleWindowInfo() est désormais découragée par eux (même s'ils indiquent qu'ils continuent à la supporter pour l'avenir) et ils suggèrent l'utilisation des séquences d'échappement (qui ne fonctionnent toutefois que sur les systèmes récents Windows 10 qui les supportent).

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

SetConsoleWindowInfo() est supportée depuis Windows 2000 :-)

Dal
0
Michel_pc4 Messages postés 5 Date d'inscription samedi 1 janvier 2022 Statut Membre Dernière intervention 11 janvier 2022
11 janv. 2022 à 14:36
Bonjour,

je cherche aussi un peu la même chose.
Je suis sous Linux Mint 20.1, je développe
sous Code::Blocks 20.3.

Actuellement, je pense contourner le problème
en installant un "timer" de 5 secondes pour me
donner le temps d'agrandir celle-ci et ainsi de rafraichir
l'écran.

C'est un peu ce que je fais d'ailleurs dans ma version de 80X24.

Toutefois, je cherche quand même une solution plus élégante.
Je me connecte donc sur ton fils, si je trouve, si quelqu'un connaît la solution ...

J'utilise le gotoxy(x,y) pour lire/écrire à l'écran.

Michel.
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 12 janv. 2022 à 11:08
Salut Michel_pc4,

1.

Sous Linux, selon les terminaux que tu vas utiliser, les séquences d'échappement AINSI concernées peuvent fonctionner ou non.

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


Est sensée maximiser la fenêtre.

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


Est sensée fixer la hauteur à 48 caractères et la largeur à 179.

Cependant, ce type de séquences de manipulation de la fenêtre sont rarement supportées par les terminaux virtuels, par exemple gnome-terminal sous Debian ne fait rien (je crois que c'est un également un terminal basé sur gnome-terminal qui est celui par défaut sur Mint, mais je ne suis pas sûr). Par contre, d'autres séquences CSI peuvent être supportées, par exemple, celles permettant de changer les couleurs d'écriture :

        printf("\x1b[104;93m");
        printf("Colored text\n");
        printf("\x1b[0m");


mais aussi celles permettant de déplacer le curseur à des coordonnées (peut-être ta fonction gotoxy() à laquelle tu fais allusion les utilises-t-elles), d'effacer l'écran, etc.

2.

Les terminaux virtuels gèrent en général leurs propres paramètres et permettent à l'utilisateur de changer la taille de la fenêtre par différents procédés. Dans le cas de gnome-terminal sous Debian, tu peux gérer plusieurs profils, chacun ayant des préférences particulières.

Par exemple, gnome-terminal sous Debian permet de spécifier que l'on veut le démarrer sous forme maximisée et en exécutant un programme donné :

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


Dans un terminal, tape
gnome-terminal --help
ou le nom de ton gestionnaire de terminal virtuel suivit de
--help
pour connaître ses options éventuelles de lancement.

Dal
0