【问题标题】:Reducing console size减小控制台尺寸
【发布时间】:2012-10-05 17:27:24
【问题描述】:

我在更改控制台大小时遇到​​问题。这是我的代码:

BOOL setConsole(int x, int y)
{
hStdin = GetStdHandle(STD_INPUT_HANDLE); 
hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
if (hStdin == INVALID_HANDLE_VALUE || 
    hStdout == INVALID_HANDLE_VALUE) 
{
    MessageBox(NULL, TEXT("GetStdHandle"),
        TEXT("Console Error"), MB_OK);
    return false;
}


SMALL_RECT windowSize = {0, 0, x-1, y-1};

// Change the console window size:
SetConsoleWindowInfo(hStdout, TRUE, &windowSize);

COORD c = { x, y};

//Change the internal buffer size:
SetConsoleScreenBufferSize(hStdout, c);


SetConsoleDisplayMode(hStdout,CONSOLE_FULLSCREEN_MODE, &c);

return true;
}

当我尝试放大控制台时,它工作得非常好。当一个参数小于前一个参数时,什么也不会发生。怎么了?

@edit:经过一些测试,我注意到,如果我一次更改一个参数,则可以调整大小(缩小)。示例(假设控制台为 100x100)

 setConsole(90,90); //dosen't work.
 setConsole(90,100);
 setConsole(90,90); // works perfectly

为什么?!

【问题讨论】:

  • 提示:检查这些操作是否失败,如果失败,请检查 GetLastError() 以获取错误代码。
  • 一切正常,没有出现错误。
  • 嗯,这是错误的方法。你不能让它变大。窗口不能大于缓冲区,它将失败并返回错误 87。
  • 您是否使用 GetLargestConsoleWindowSize 检查了您的坐标?

标签: c++ winapi console-application


【解决方案1】:

SetConsoleScreenBufferSize 更改控制台内部缓冲区的大小。 更改它对控制台窗口范围没有影响。 如果您需要对控制台的可见部分(缓冲区)进行效果,请致电 SetConsoleWindowInfo。

窗口缓冲区不能小于内部缓冲区,减小它也会减小内部缓冲区, 但反之则不然。

如果您调用 SetConsoleScreenBufferSize 时在 COORDS 中有非法值(例如,高度/宽度太小),那么您会得到一个 错误,一般是87 'invalid argument'.

试试这个代码:

#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;
}  

【讨论】:

  • 或者你可以打电话给SetConsoleWindowInfo 之前 SetConsoleScreenBufferSize。
  • 在使用 SetWindow() 函数时,我收到 STD_OUTPUT_HANDLE 未定义的错误。
【解决方案2】:

试试这个代码:

system("mode 650");  

【讨论】:

    【解决方案3】:

    我在 2012 年 10 月 15 日修改了“Software_Designer”提供的代码,并创建了一个命令行实用程序来设置控制台大小和滚动缓冲区。

    我使用 DEV C++ (http://www.bloodshed.net/devcpp.html) 编译它。

    一个可执行文件包含在https://sourceforge.net/projects/wa2l-wintools/ 中。我希望这会有所帮助。

    /*
     * 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;
    } 
    

    【讨论】:

      【解决方案4】:

      聚会迟到了……

      根据 MSDN 和一些测试可以设计,屏幕缓冲区不能设置为小于窗口的范围或窗口的范围大于屏幕缓冲区。

      一个技巧是在更改缓冲区大小之前将窗口缩小到最小:

      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);
      }
      

      【讨论】:

        猜你喜欢
        • 2021-11-25
        • 2018-01-30
        • 2012-04-22
        • 2015-01-27
        • 2020-01-24
        • 2011-12-26
        • 1970-01-01
        • 2011-08-08
        • 1970-01-01
        相关资源
        最近更新 更多