私はシステムを呼び出す代わりに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;
}
...それは働きます!しかし、私はどのように、そしてなぜそれを知りません。 – NewBee3
私は分かりませんが、 'SetConsoleWindowInfo'は* SetConsoleScreenBufferSizeより前に呼び出されるべきであると示唆しているか、大きさの矛盾(失敗の理由)によるものかもしれません。画面のサイズは1ベースですが、バッファの長方形の座標は0ベースである必要があります。この2つの関数からの戻り値と、あなたの利益となるエラー状態をマニュアルページに示すように調べてください。 –
単一のAPI呼び出しごとにエラーをチェックするのを無視します。私たちが推測するのではなく、エラーチェックをしてみませんか? – IInspectable