Fenstergröße der cmd-Konsole in C Programm ändern



  • Hi,

    da ich normalerweise nur µC mit C programmiere und nun aber doch mal was mit Textausgabe in der Konsole usw. machen muss. Würde ich gerne das cmd-Konsolenfenster von der Größe her anpassen können (in C-Programm), sowohl Buffersize/als auch die wirkliche sichtbare Fenstergröße.

    Es fällt mir einwenig schwer zu erkennen was ich machen kann und was nicht, gerade was mischen von c und c++ code angeht. Ist das eigentlich unten c++ code? Woran erkenne ich das eigentlich? Habe bis jetzt immer nur in C programmiert.

    Was ich schon habe und was geht ist das ändern der Buffersize, siehe code. Wäre nett, wenn mir jemand da ein Codebeispiel mit Erläuterungen zur Verfügung stellt.

    Es soll scrollbar bleiben.

    #include <windows.h>
     ...
    COORD c;
    c.X=120; // 120 Zeichen/Zeile
    c.Y=1000; // 1000 Zeilen
    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE),c);
    

    Danke schonmal!

    MfG.
    EviloKnievel



  • void SetWindowExt(int x, int y, int yMulti = 1)
    {
        SMALL_RECT sr_window = {0, 0, x - 1, y - 1};
        COORD      extension;
        CONSOLE_SCREEN_BUFFER_INFO csbi;
    
        GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
    
        extension.X = max(x, csbi.dwMaximumWindowSize.X);
        extension.Y = max(y, csbi.dwMaximumWindowSize.Y);
    
        SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), extension);
        SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), TRUE, &sr_window);
    
        extension.X = x;
        extension.Y = y * yMulti;
        SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), extension);
    }
    

    ... ist C++ wegen des Default-Parameters yMulti.



  • Dank dir Belli, aber kannst du mir noch mal ein paar Fragen beantworten:

    1. Welche Bibiotheken müssen eingebunden sein?

    2. Ist das dann im C-Programm ganz normal einzubinden?
    heißt für mich

    #include...
    
    /*Funktionsprototyp*/
    void SetWindowExt(int x, int y, int yMulti = 1);
    
    int main
    {
    /*Funnktionsaufruf*/
        SetWindowExt(100, 25, int yMulti = 1); /*Verstehe nicht was der Default-Parameter macht?*/
    ...
    return(0)
    }
    
    /*Funktion*/
    void SetWindowExt(int x, int y, int yMulti = 1)
    {
        SMALL_RECT sr_window = {0, 0, x - 1, y - 1};
    .... 
        SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), extension);
    }
    

    3.Angaben in Zeichen nehm ich an nicht in Pixeln?

    Gruß
    EK



  • 1. windows.h
    2. C++ nicht C (wie gesagt, wegen des default-Parameters - wenn Du den rausnimmst, kannst Du es auch mit einem C-Compiler laufen lassen)

    Der Parameter yMulti bestimmt, wie groß Dein Screenbuffer ist. Angenommen, Du willst 40 Spalten * 20 Zeilen, dann sorgt yMulti == 1 dafür, dass der Buffer genau so groß ist, wie Dein sichtbares Fenster --> kein Scrollbalken zum hoch/runterscrollen. Ein größerer Wert erstellt Dir einen größeren Screenbuffer --> 20 Zeilen sichtbar, aber 40 Zeilen im Buffer --> Scrollbalken.

    3. Ja.

    Wenn Du die Funktion in ein C++ - Programm einbindest, könnte es Probleme mit dem Makro 'max' geben, weil in der Standardbibliothek ein gleichnamiges Funktionstemplate existiert. In dem Fall kannst Du die Windows-Makros 'deaktivieren', indem Du vor dem Header windows.h das Makro NOMINMAX definierst.



  • Jo dank dir nochmal, alles klappt! 👍


Anmelden zum Antworten