减小控制台尺寸

Kre*_*ver 3 c++ winapi console-application

我在改变控制台尺寸方面遇到了问题.这是我的代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试放大控制台时,它工作得非常好.当一个参数小于前一个参数时,没有任何反应.怎么了?

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

 setConsole(90,90); //dosen't work.
 setConsole(90,100);
 setConsole(90,90); // works perfectly
Run Code Online (Sandbox Code Playgroud)

为什么?!

Sof*_*ner 6

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;
}  
Run Code Online (Sandbox Code Playgroud)