3

コンソール サイズの変更で問題が発生しました。これは私のコードです:

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

コンソールを拡大しようとすると、問題なく動作します。1 つのパラメーターが前のパラメーターよりも小さい場合、何も起こりません。なにが問題ですか?

@edit: いくつかのテストの後、一度に 1 つのパラメーターを変更するとサイズ変更 (縮小) が可能であることに気付きました。例 (コンソールが 100x100 であると仮定)

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

どうして?!

4

4 に答える 4

6

SetConsoleScreenBufferSizeコンソールの内部バッファのサイズを変更します。これを変更しても、コンソールウィンドウの範囲には影響しません。SetConsoleWindowInfoコンソール(バッファ)の表示部分に効果が必要な場合は、を呼び出します。

ウィンドウバッファを内部バッファより小さくすることはできません。ウィンドウバッファを小さくすると、内部バッファも小さくなりますが、その逆はできません。

SetConsoleScreenBufferSizeCOORDSで不正な値(たとえば、高さ/幅が小さすぎる)で呼び出すと、エラーが発生します。通常は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;
}  
于 2012-10-15T18:33:53.253 に答える
1

パーティーに遅れて...

MSDN といくつかのテストから考案できる限り、画面バッファーをウィンドウの範囲より小さく設定したり、ウィンドウの範囲を画面バッファーより大きくしたりすることはできません。

1 つのハックは、バッファー サイズを変更する前にウィンドウを最小限に縮小することです。

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);
}
于 2016-11-16T14:19:08.733 に答える
0

12 年 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;
} 
于 2016-07-02T00:12:23.953 に答える