🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

COM

COM(Component Object Model)はMicrosoftによるコンポーネントテクノロジーであり、 ソフトウェアの再利用を目的とした技術を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

4228閲覧

ウインドウサイズをプログラム側で変更したい。GetLastError()関数で 87 パラメータが違いますというエラーが帰ってくる理由とは?

退会済みユーザー

退会済みユーザー

総合スコア0

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

COM

COM(Component Object Model)はMicrosoftによるコンポーネントテクノロジーであり、 ソフトウェアの再利用を目的とした技術を指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/12/23 06:04

編集2020/12/24 00:12

提示コードの///部ですがこのどうすればプログラムでコンソール画面のウインドウサイスを変更できるのでしょうか?どうやっても変更されません。SetWindowPos関数で変更するはずなのですが画面サイズが変更されません。これは一体どうすればいいのでしょうか?
GetLastErro関数でエラーコードを調べましたが87 [パラメータが間違えています]と表示されます。

公式リファレンス: https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowpos

cpp

1// コンストラクタ 2ScreenBuffer::ScreenBuffer() 3{ 4 mText = new Debug_Log("ScreenBuffer.txt"); 5 6 7 //描画開始座標 8 mDraw_start.X = 0; 9 mDraw_start.Y = 0; 10 11 //描画範囲 12 mDraw_size.X = MAX_WIDTH; 13 mDraw_size.Y = MAX_HEIGHT; 14 15 //ウインドウサイズ 16 mRect.Left = (SHORT)0; 17 mRect.Top = (SHORT)0; 18 mRect.Right = (SHORT)MAX_WIDTH; 19 mRect.Bottom = (SHORT)MAX_HEIGHT; 20 21 // バッファーを作成 22 mHandle = CreateConsoleScreenBuffer(GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CONSOLE_TEXTMODE_BUFFER, NULL); 23 24 SetConsoleActiveScreenBuffer(mHandle); //有効にする 25 26 if (mHandle == INVALID_HANDLE_VALUE) 27 { 28 29 } 30 31 // 画面バッファサイス変更 32 if (SetConsoleScreenBufferSize(mHandle, mDraw_size) == 0) 33 { 34 35 } 36 37 // 画面サイズ変更 38 if (SetConsoleWindowInfo(mHandle, TRUE, &mRect) != 0) 39 { 40 41 } 42 43///////////////////////////////////////////////////////////////////////////////////////// 44 HWND h = 0; 45 SetWindowPos(h, HWND_TOPMOST, 0, 0, 100,100, SWP_DRAWFRAME); 46 //SetWindowPos(h, HWND_TOPMOST,0,0,MAX_WIDTH,MAX_HEIGHT,SWP_DRAWFRAME); 47///////////////////////////////////////////////////////////////////////////////////////// 48 49} 50

hpp

1 2// ウインドウサイズ 3#define MAX_WIDTH ((int)16 * 10) 4#define MAX_HEIGHT ((int)9 * 10) 5 6/*################################################ 7* 文字を描画するクラス 8################################################*/ 9 10class ScreenBuffer 11{ 12public: 13 14 ScreenBuffer(); //コンストラクタ 15 ~ScreenBuffer(); //デストラクタ 16 17 void GenerateOutput(); //描画する 18 19 void Draw(int H, int W, const char* format, ...); //バッファーに書き込み 20 void DrawLoop(int H, int W,int speed, const char* format, ...); //バッファーに書き込み 足しなくった文字はループする 21 void CursorPosition(int x,int y); //カールの座標を設定 22 void DrawAA(int H, int W, const char* format, ...); //アスキーアート一文字を書く 23 24 25 26 27 HANDLE getHandle(); 28 29private: 30 31 32 CHAR_INFO mScreenBuffer[MAX_HEIGHT][MAX_WIDTH]; //画面バッファ 33 HANDLE mHandle; //ハンドル 34 35 COORD mDraw_start; //描画開始位置 36 COORD mDraw_size; //画面のサイズ 37 _SMALL_RECT mRect; //画面の描画範囲 38 39 /* 格納できる文字数をカウント */ 40 int mNowBuffer_width[MAX_HEIGHT]; //横 41 int mNowBuffer_height = 0; //縦 42 43 Debug_Log *mText; //デバッグ用テキスト出力 44 45 46 47 48}; 49#endif;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

文字数単位でコンソールウインドウのサイズを指定したいのであればSetConsoleWindowInfo

C++

1SMALL_RECT consoleSize = { 0, 0, MAX_WIDTH-1, MAX_HEIGHT-1 }; 2SetConsoleWindowInfo( mHandle, TRUE, &consoleSize);

提示コードの///部ですがこのどうすればプログラムでコンソール画面のウインドウサイスを変更できるのでしょうか?どうやっても変更されません。SetWindowPos関数で変更するみたいなのですがどうすればいいのでしょうか?

上記を書いてから気づきましたが、あなたの貼ったコードでも///の上の部分でSetConsoleWindowInfo()を呼んでいるようですが…
(追記)dodox86さんのコメントの通り、右下の座標は-1しないといけませんね。


コンソールスクリーンバッファサイズ以下でも、表示領域内に収まらないような大きなサイズを指定した場合エラー(GetLastError() 0x57:The parameter is incorrect.)が返るようです。
提示されたコード内には定義が見当たりませんが、MAX_WIDTH-1MAX_HEIGHT-1にしても変化しない場合は表示領域内に収まらないサイズなのでしょう。
以下のようにGetConsoleScreenBufferInfo()で実際に設定可能な最大ウインドウサイズを取得して設定してみてください。

C++

1// 画面サイズ変更 2CONSOLE_SCREEN_BUFFER_INFO screenBufferInfo; 3if (GetConsoleScreenBufferInfo(mHandle, &screenBufferInfo)) 4{ 5 SMALL_RECT consoleSize = { 0, 0, screenBufferInfo.dwMaximumWindowSize.X - 1, screenBufferInfo.dwMaximumWindowSize.Y - 1 }; 6 SetConsoleWindowInfo( mHandle, TRUE, &consoleSize); 7}

投稿2020/12/23 07:33

編集2020/12/24 05:59
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/12/23 07:54

呼んでもサイズが変更されないのですw
episteme

2020/12/23 07:58

エラーとか返ってきてないのですか?
SHOMI

2020/12/23 08:10 編集

コンソールスクリーンバッファサイズ以上にはできませんが確認しましたか? Remarks The function fails if the specified window rectangle extends beyond the boundaries of the console screen buffer.
退会済みユーザー

退会済みユーザー

2020/12/23 08:10

同じMAX_WIDTH MAX_HEIGTH にしてるのバッファーと画面サイズは同じはずなのですが...
dodox86

2020/12/23 08:17

BottomとRightは -1 しなければいけないのでは。 mRect.Right = MAX_WIDTH - 1; mRect.Bottom = MAX_HEIGHT - 1; 同Remarks > The Bottom and Right members (or the calculated bottom and right coordinates) cannot be greater than (screen buffer height – 1) and (screen buffer width – 1),
dodox86

2020/12/23 08:22

質問文からは分かりませんが、既にコメントいただいているようにエラーが起きていたのか。起きていたらGetLastErrorの値は何を示していたのか、それともエラーは起きてないのだけど、依然としてウィンドウサイズが変わらなかったのか。状況が分かりません。
SHOMI

2020/12/23 08:30

大きなサイズを指定して試したところ、リサイズ後のコンソールウインドウがモニタ表示領域内に収まらないとエラーが返るようですね
SHOMI

2020/12/23 08:48 編集

過去の質問もそうですが、コンパイルして確認のできる最小限のコードを貼ってください。
退会済みユーザー

退会済みユーザー

2020/12/24 00:09

ヘッダー部のコードを載せました。質問ですが GetLastErro関数により87 パラメータが間違えていますと表示されるのですがこれなぜでしょうか?
episteme

2020/12/24 00:21

↑ [回答]に明記されてますが。
退会済みユーザー

退会済みユーザー

2020/12/24 00:27

いえ。縦横300。300にしても同じエラーコードが帰ってくるため理由がわかりませんw
Zuishin

2020/12/24 00:58 編集

300 が何の数字か知りませんが、回答に書かれているようにしたらどうでしょうか。 > コンソールスクリーンバッファサイズ以下でも、表示領域内に収まらないような大きなサイズを指定した場合エラー(GetLastError() 0x57:The parameter is incorrect.)が返るようです。 > 提示されたコード内には定義が見当たりませんが、MAX_WIDTH-1とMAX_HEIGHT-1にしても変化しない場合は表示領域内に収まらないサイズなのでしょう。 > 実際に設定可能な最大ウインドウサイズを取得して設定してみてください。 ピクセルではなく文字数なので、300 は大きな数だと思います。 > 文字数単位でコンソールウインドウのサイズを指定したいのであればSetConsoleWindowInfo
episteme

2020/12/24 01:00 編集

なにそれ...回答ロクに読んでないってこと? それとも回答から使えそうなとこ切り取って残り捨ててる?
退会済みユーザー

退会済みユーザー

2020/12/24 01:05

試しに100,100とかにしましたが画面サイズが変わりません。どうすればいいのでしょうか? 10,10でもだめでした。
Zuishin

2020/12/24 01:07

じゃあなぜベストアンサーにしたのかと。
退会済みユーザー

退会済みユーザー

2020/12/24 01:09

MAX_WIDTH、MAX_HEIGHTを100,100にしてみましたがやはり同じくウインドウサイズが変わりません、どいすればいいのでしょうか?
episteme

2020/12/24 01:23 編集

SetConsoleWindowInfo が失敗するって言ってます? 質問には SetWindowPos が失敗するとありますが、どっち? # 質問ヘタクソ。言葉が足りない。
退会済みユーザー

退会済みユーザー

2020/12/24 01:42 編集

この人は過去に注意された事も繰り返すし、公式のAPIリファレンスもURL貼るだけで内容をロクに読んでなさそうなので、正直言うだけ無駄です。過去の質問を見ても単なるケアレスミスや調査不足程度のものが殆どで、デバッグを他人に丸投げしているだけで、まるで成長が見られません。
episteme

2020/12/24 01:54

「初心者の質問」 は歓迎するが、「質問の初心者」 はいいかげん卒業してくれんかな...
Zuishin

2020/12/24 03:26 編集

MAX_WIDTH と MAX_HEIGHT はバッファサイズとコンソールサイズの両方を表しているので、これをどれだけ小さくしてもそれだけじゃ意味ないですね。
SHOMI

2020/12/24 04:01 編集

>MAX_WIDTH、MAX_HEIGHTを100,100にしてみましたがやはり同じくウインドウサイズが変わりません dodox86さんのコメントの通り、SetConsoleWindowInfo()に指定する右下の座標はバッファサイズから-1しなけらばならず、さらにGetConsoleScreenBufferInfo()が返すdwMaximumWindowSizeより小さくないと駄目ですがちゃんと指定していますか?
SHOMI

2020/12/24 04:11 編集

MAX_WIDTH-1、MAX_HEIGHT-1とはMAX_WIDTH、MAX_HEIGHT自体の値を変えるのではなく、SetConsoleScreenBufferSize()に渡した値から1減らした値をSetConsoleWindowInfo()に指定するという意味ですよ
退会済みユーザー

退会済みユーザー

2020/12/24 05:10

なるほど、できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問