C++ 缩小控制台尺寸

C++ 缩小控制台尺寸,c++,winapi,console-application,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("Get

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

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;
}
当我试着放大控制台时,它工作得非常好。当一个参数小于前一个参数时,不会发生任何情况。怎么了

@编辑:在一些测试之后,我注意到,如果我一次更改一个参数,则可以调整大小(减少)。示例(假设控制台为100x100)


为什么

SetConsoleScreenBufferSize
更改控制台内部缓冲区的大小。 更改它对控制台窗口范围没有影响。 如果需要对控制台的可见部分(缓冲区)产生影响,请调用
SetConsoleWindowInfo

窗口缓冲区不能小于内部缓冲区,减小它也会减小内部缓冲区, 但不是相反

如果在COORDS中使用非法值调用
SetConsoleScreenBufferSize
(例如,高度/宽度太小),则会得到一个 错误,通常是
87'无效参数。

请尝试以下代码:

#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;
}  
system("mode 650");  
#包括
#包括
使用名称空间std;
void SetWindow(整数宽度、整数高度)
{ 
_合作社;
坐标X=宽度;
坐标Y=高度;
_小直;
矩形顶部=0;
矩形左=0;
垂直底部=高度-1;
右直=宽度-1;
HANDLE HANDLE=GetStdHandle(STD_OUTPUT_HANDLE);//获取句柄
SetConsoleScreenBufferSize(句柄、坐标);//设置缓冲区大小
SetConsoleWindowInfo(句柄、TRUE和Rect);//设置窗口大小
} 
内部主(空)
{     
设置窗口(80,40);
int dx=1,i=5,l=0;
而(l请尝试以下代码:

#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;
}  
system("mode 650");  

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

< >我使用DEV C++().< /P>编译它。 中包含一个可执行文件。我希望这对您有所帮助

/*
 * 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;
} 
/*
*consolesize.cpp-设置控制台大小和缓冲区尺寸
*
*[00]2016年7月2日CWa初始版本
*
*灵感来自:http://stackoverflow.com/questions/12900713/reducing-console-size
*
*/
#包括
#包括
使用名称空间std;
//SetWindow(宽度、高度、宽度缓冲区、高度缓冲区)--设置控制台大小和缓冲区尺寸
//
void SetWindow(int-Width、int-Height、int-WidthBuffer、int-HeightBuffer){
_合作社;
坐标X=宽度缓冲区;
坐标Y=高度缓冲区;
_小直;
矩形顶部=0;
矩形左=0;
垂直底部=高度-1;
右直=宽度-1;
HANDLE HANDLE=GetStdHandle(STD_OUTPUT_HANDLE);//获取句柄
SetConsoleScreenBufferSize(句柄、坐标);//设置缓冲区大小
SetConsoleWindowInfo(句柄、TRUE和Rect);//设置窗口大小
}//设置窗口
//主(宽度、高度、宽度缓冲区、高度缓冲区)--主
//
intmain(intargc,char*argv[]){
整数宽度=80;
整数高度=25;
int wbuffer=宽度+200;
int hbuffer=高度+1000;
如果(argc==5){
宽度=atoi(argv[1]);
高度=atoi(argv[2]);
wbuffer=atoi(argv[3]);
hbuffer=atoi(argv[4]);
}否则如果(argc>1){
参加聚会不能迟到

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

提示:检查这些操作是否失败,如果失败,请检查GetLastError()对于错误代码。一切正常,没有出现错误。嗯,这是错误的方法。你不能使它变大。窗口不能大于缓冲区,它将失败,出现错误87。你是否使用GetLargestConsoleWindowSize检查了你的坐标?或者你可以在
SetConsoleScreenBuff之前调用
SetConsoleWindowInfo
erSize
。在使用
SetWindow()
函数时,我得到一个错误,即
STD\u输出\u句柄
未定义。