Reducing console size

后端 未结 4 1968
孤街浪徒
孤街浪徒 2021-01-06 16:27

I got a problem with changing console size. This is my code:

BOOL setConsole(int x, int y)
{
hStdin = GetStdHandle(STD_INPUT_HANDLE); 
hStdout = GetStdHandle         


        
相关标签:
4条回答
  • 2021-01-06 16:46

    I modified the code provided by 'Software_Designer' on Oct 15' 12 and created a command line utility to set the console size and scroll buffers.

    I compiled it using DEV C++ (http://www.bloodshed.net/devcpp.html).

    An executable is included in https://sourceforge.net/projects/wa2l-wintools/. I hope this helps.

    /*
     * consolesize.cpp - set console size and buffer dimensions
     *
     * [00] 02.07.2016 CWa  Initial Version
     *
     * inspired by: http://stackoverflow.com/questions/12900713/reducing-console-size
     *
     */
    
    #include <iostream>
    #include <windows.h> 
    
    using namespace std;
    
    
    // SetWindow(Width,Height,WidthBuffer,HeightBuffer) -- set console size and buffer dimensions
    //
    void SetWindow(int Width, int Height, int WidthBuffer, int HeightBuffer) { 
        _COORD coord; 
        coord.X = WidthBuffer; 
        coord.Y = HeightBuffer; 
    
        _SMALL_RECT Rect; 
        Rect.Top = 0; 
        Rect.Left = 0; 
        Rect.Bottom = Height - 1; 
        Rect.Right = Width - 1; 
    
        HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE);      // Get Handle 
        SetConsoleScreenBufferSize(Handle, coord);            // Set Buffer Size 
        SetConsoleWindowInfo(Handle, TRUE, &Rect);            // Set Window Size 
    }  // SetWindow
    
    
    
    // main(Width,Height,WidthBuffer,HeightBuffer) -- main
    //
    int main(int argc, char *argv[]) {     
        int width = 80;
        int height = 25;
        int wbuffer = width + 200;
        int hbuffer = height + 1000;
    
        if ( argc == 5 ){
            width = atoi(argv[1]);
            height = atoi(argv[2]);
            wbuffer = atoi(argv[3]);
            hbuffer = atoi(argv[4]);
        } else if ( argc > 1 ) {
            cout << "Usage: " << argv[0] << " [ width height bufferwidth bufferheight ]" << endl << endl;
            cout << "  Where" << endl;
            cout << "    width            console width" << endl;
            cout << "    height           console height" << endl;
            cout << "    bufferwidth      scroll buffer width" << endl;
            cout << "    bufferheight     scroll buffer height" << endl;
            return 4;
        }    
    
        SetWindow(width,height,wbuffer,hbuffer);
        return 0;
    } 
    
    0 讨论(0)
  • 2021-01-06 16:55

    Late to the party ...

    As far as can be devised from MSDN and a few tests, the screen buffer can't be set smaller than the window's extent or the window's extent made bigger than the screen buffer.

    One hack is to shrink the window to a minimal before changing the buffer size :

    static void
    set_console_size(HANDLE screen_buffer, SHORT width, SHORT height)
    {
        assert(screen_buffer != NULL);
        assert(width > 0);
        assert(height > 0);
    
        COORD const size = { width, height };
        BOOL success;
    
        SMALL_RECT const minimal_window = { 0, 0, 1, 1 };
        success = SetConsoleWindowInfo(screen_buffer, TRUE, &minimal_window);
        CHECK(success);
    
        success = SetConsoleScreenBufferSize(screen_buffer, size);
        CHECK(success);
    
        SMALL_RECT const window = { 0, 0, size.X - 1, size.Y - 1 };
        success = SetConsoleWindowInfo(screen_buffer, TRUE, &window);
        CHECK(success);
    }
    
    0 讨论(0)
  • 2021-01-06 16:56

    try this code:

    system("mode 650");  
    
    0 讨论(0)
  • 2021-01-06 17:08

    SetConsoleScreenBufferSize changes the size of the internal buffer of the console. Changing it has no effect on the console windows extent. Call SetConsoleWindowInfo if you need an effect on the visible part of the console (buffer).

    The window buffer cannot be smaller than the internal buffer , and decreasing it will also decrease the internal buffer, but not the other way around.

    If you call SetConsoleScreenBufferSize with illegal value in COORDS (e.g. too little height/width) then you get an error, usually 87 'invalid argument'.

    Try this code:

    #include <iostream>
    #include <windows.h> 
    
    using namespace std;
    
    
    void SetWindow(int Width, int Height) 
    { 
        _COORD coord; 
        coord.X = Width; 
        coord.Y = Height; 
    
        _SMALL_RECT Rect; 
        Rect.Top = 0; 
        Rect.Left = 0; 
        Rect.Bottom = Height - 1; 
        Rect.Right = Width - 1; 
    
        HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE);      // Get Handle 
        SetConsoleScreenBufferSize(Handle, coord);            // Set Buffer Size 
        SetConsoleWindowInfo(Handle, TRUE, &Rect);            // Set Window Size 
    } 
    
    int main(void) 
    {     
        SetWindow(80,40);
        int dx=1,i=5,l=0;
    
         while(l<5)
         {
            i=i+dx;
            if( (i<1) || (i>10)){ dx=-dx; l++;}
    
            SetWindow(10*i,5*i);
            Sleep(100);
    
         }
    
      cout<<" \nPress any key to continue\n";
      cin.ignore();
      cin.get();
      return 0;
    }  
    
    0 讨论(0)
提交回复
热议问题