2017-11-13 23 views
0

私はシステムを呼び出す代わりにWinapiを使用してCでウィンドウサイズとバッファを変更できません

の質問を書き直しました。私はWinApiの呼び出しでそれを自分でやろうとします。

私が得る最高のコードはこれです:すべての

void screensizexy(int x, int y)  
{  
SMALL_RECT console_size2;  
console_size2.Right = x;  
console_size2.Bottom = y;  
console_size2.Left = 1;  
console_size2.Top = 1;  
COORD console_size;  
console_size.X = x;  
console_size.Y = y;  
SetConsoleScreenBufferSize(hStdout, console_size);  
SetConsoleWindowInfo(hStdout, TRUE, &console_size2);  
SetConsoleScreenBufferSize(hStdout, console_size);  
SetConsoleWindowInfo(hStdout, TRUE, &console_size2); 
} 

まず、なぜ私は二回SetConsoleScreenBufferSize & SetConsoleWindowInfoを呼び出す必要がありますか?

第2に、「.Left = 0」と「.Top = 0」のままにすると、コードが失敗します。どうして?

オリジナル質問:

私はCコンソールアプリケーションのウィンドウサイズとバッファを変更して問題を抱えています。私は何が間違っているのか理解できません。私は助けが必要です。

Iやったバッファとウィンドウのサイズを変更するには、次の、それはコンソールのうちから呼び出されたときに働いたが、コンソールの内部から呼び出されたときに失敗しました:

hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
COORD console_size; 
console_size.X = 100; 
console_size.Y = 50; 
SetConsoleScreenBufferSize(hStdout, console_size); 
SMALL_RECT console_size2; 
console_size2.Right = 100; 
console_size2.Bottom = 50; 
console_size2.Left = 1; 
console_size2.Top = 1; 
SetConsoleWindowInfo(hStdout, TRUE, &console_size2); 

私は(、スクロールせずにそれを行うことを試みた場合.Leftと.Top = 0になったときに失敗しました。

その後、私は別の方法を試みたが、まだ失敗しました。それは悪化した。

新しいコードでは、このプログラムを(コンソールではなく)ウィンドウから呼び出すと、それも失敗しました。

これは私が大きいが失敗するために何をすべきかです:

HANDLE hStdout, hStdin; 

int main() 
{ 
CONSOLE_SCREEN_BUFFER_INFO csbiInfo; 
hStdin = GetStdHandle(STD_INPUT_HANDLE); 
hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
GetConsoleScreenBufferInfo(hStdout, &csbiInfo); //here I store original stuff 

// here is the beginning of my program that changes console screen buffer and window size 
CONSOLE_SCREEN_BUFFER_INFO console_size; 
GetConsoleScreenBufferInfo(hStdout, &console_size); 
console_size.dwSize.X = 100; 
console_size.dwSize.Y = 50; 
console_size.srWindow.Right = 100; 
console_size.srWindow.Bottom = 50; 
console_size.srWindow.Left = 0; 
console_size.srWindow.Top = 0; 
SetConsoleScreenBufferSize(hStdout, console_size.dwSize); 
SetConsoleWindowInfo(hStdout, TRUE, &console_size.srWindow); 

// I fail here, so i added a code to see what are current values. 

CONSOLE_SCREEN_BUFFER_INFO csbiInfo2; 
HANDLE hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE); 
GetConsoleScreenBufferInfo(hConsoleOut, &csbiInfo2); 
printf("dwCursorPosition.X = %i\n",csbiInfo2.dwCursorPosition.X); 
printf("dwCursorPosition.Y = %i\n",csbiInfo2.dwCursorPosition.Y); 
printf("dwSize.X = %i\n",csbiInfo2.dwSize.X); 
printf("dwSize.Y = %i\n",csbiInfo2.dwSize.Y); 
printf("wAttributes = %i\n", csbiInfo2.wAttributes); 
printf("srWindow = %i\n", csbiInfo2.srWindow); 
printf("srWindow.Top = %i\n", csbiInfo2.srWindow.Top); 
printf("srWindow.Bottom = %i\n", csbiInfo2.srWindow.Bottom); 
printf("srWindow.Left = %i\n", csbiInfo2.srWindow.Left); 
printf("srWindow.Right = %i\n", csbiInfo2.srWindow.Right); 
printf("dwMaximumWindowSize = %i\n", csbiInfo2.dwMaximumWindowSize); 
printf("\n"); 
getch(); 

// Here, my program does its functions. 
// stuff 
// stuf 

// now, at the end, I want to get back to original window size and buffer. 

SetConsoleTextAttribute(hStdout, csbiInfo.wAttributes); // Restore the original text colors. 
SetConsoleScreenBufferSize(hStdout, csbiInfo.dwSize); //restore buffer size 
SetConsoleWindowInfo(hStdout, TRUE, &csbiInfo.srWindow); //restore window size 
return 0; 

}

+0

...それは働きます!しかし、私はどのように、そしてなぜそれを知りません。 – NewBee3

+0

私は分かりませんが、 'SetConsoleWindowInfo'は* SetConsoleScreenBufferSizeより前に呼び出されるべきであると示唆しているか、大きさの矛盾(失敗の理由)によるものかもしれません。画面のサイズは1ベースですが、バッファの長方形の座標は0ベースである必要があります。この2つの関数からの戻り値と、あなたの利益となるエラー状態をマニュアルページに示すように調べてください。 –

+0

単一のAPI呼び出しごとにエラーをチェックするのを無視します。私たちが推測するのではなく、エラーチェックをしてみませんか? – IInspectable

答えて

1

私はこの問題を考え出し:バッファは、ウィンドウサイズよりも小さくすることはできません。バッファを先に変更すると、古いウィンドウサイズよりも小さくなります。ウィンドウを最初に変更すると、古いバッファサイズよりも大きくなることはありません。

私はSetConsoleScreenBufferSize、SetConsoleWindowInfo、SetConsoleScreenBufferSize、SetConsoleWindowInfoのように、ちょうど2倍にそれを行う場合
void newbufwinxy(int x, int y) 
{ 
SMALL_RECT console_size2; 
console_size2.Right = x; 
console_size2.Bottom = y; 
console_size2.Left = 1; 
console_size2.Top = 1; 
COORD console_size; 
console_size.X = x; 
console_size.Y = y; 
CONSOLE_SCREEN_BUFFER_INFO screencsbi; 
hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &screencsbi); 
//if new buffer is larger than old buffer size or at least window, go ahead 
if (console_size.X >= screencsbi.dwSize.X && (console_size.Y >= screencsbi.dwSize.Y||console_size.Y >= screencsbi.srWindow.Bottom-1)) 
{ 
    SetConsoleScreenBufferSize(hStdout, console_size); 
    SetConsoleWindowInfo(hStdout, TRUE, &console_size2); 
} 
//if new window is larger in widght but smaller in height, do a temporary shrink 
else if (console_size2.Right >= screencsbi.srWindow.Right-1 && console_size2.Bottom <= screencsbi.srWindow.Bottom-1) 
{ 
    console_size2.Right = 20; //temporarily shrink window width... 
    SetConsoleWindowInfo(hStdout, TRUE, &console_size2); 
    SetConsoleScreenBufferSize(hStdout, console_size); 
    console_size2.Right = x; 
    SetConsoleWindowInfo(hStdout, TRUE, &console_size2); 
} 
//if new buffer is smaller than old window, change window first 
else if (console_size.X <= screencsbi.dwSize.X && !(console_size2.Bottom >= screencsbi.dwSize.Y)) 
{ 
    SetConsoleWindowInfo(hStdout, TRUE, &console_size2); 
    SetConsoleScreenBufferSize(hStdout, console_size); 
} 
else 
{ 
    printf("\nold _values_ >> new _values_ \n"); 
    printf("dwSize.X = %i >> ",screencsbi.dwSize.X); 
    printf("dwSize.X = %i\n",console_size.X); 
    printf("dwSize.Y = %i >> ",screencsbi.dwSize.Y); 
    printf("dwSize.Y = %i\n",console_size.Y); 
    printf("srWindow.Bottom = %i >> ", screencsbi.srWindow.Bottom); 
    printf("srWindow.Bottom = %i\n", console_size2.Bottom); 
    printf("srWindow.Right = %i >> ", screencsbi.srWindow.Right); 
    printf("srWindow.Right = %i\n", console_size2.Right); 
    printf("SetConsoleWindowInfo, SetConsoleScreenBufferSize\n"); 
    printf("Error. Cannot recognise console windows or buffer size!\n"); 
    printf("\nProgram encountered errors and shall exit now."); 
    printf("\nPress any key to continue..."); 
    getch(); 
    ExitProcess(1); 
} 
} 
関連する問題