MFC プログラム実行途中でウィンドウサイズを変更したい。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
かなたん
記事: 50
登録日時: 11年前
連絡を取る:

MFC プログラム実行途中でウィンドウサイズを変更したい。

#1

投稿記事 by かなたん » 10年前

マインスイーパーの初級が出来上がったので、中級など別のサイズも作りたいと考えています。
ウィンドウのサイズを取得するにMoveWindow関数を使えばできるとあるので使ってみました。
元のウィンドウのサイズは200×230+枠などのサイズです。
テストでハイスコアダイアログを閉じた後に以下のようにして画面サイズを変更するようにしてみました。

コード:

CRect wrect;
this->GetWindowRect(&wrect);
this->MoveWindow( wrect.left, wrect.top, 400, 460, TRUE );
すると、なぜかウィンドウのサイズは変わらなかったもののウィンドウ内の画面が移動してしまいました。
[album]709[/album]
そこで、以下のようにwrectの部分を0,0固定にしてみました。

コード:

CRect wrect;
this->GetWindowRect(&wrect);
this->MoveWindow( 0, 0, 400, 460, TRUE );
すると、ウィンドウ内の画面が移動することはなくなりました。
[album]710[/album]
サイトの説明や持っているライブラリ本の説明を見ても第1・第2引数は新しい左上の座標であり、サイトの使用例を見ても相対位置であるようには思いませんでした。
ですが、実際に使ってみて相対位置なのでは?と思いました。
そこで、次は以下のように画面サイズを大きくするのではなく小さくするように変更してみました。

コード:

CRect wrect;
this->GetWindowRect(&wrect);
this->MoveWindow( 0, 0, 100, 115, TRUE );
すると、ウィンドウサイズは相変わらず変わらなかったものの、画面の途中に枠が出るようになりました。
[album]711[/album]
本にはMoveWindowについて「CWndの位置とサイズを変更します。」とあり、CWindについてみてみると、「このクラスはWindowsのウィンドウではなくWindows内部のデータ構造とメッセージマップを保持したオブジェクトです。」とありました。
MoveWindowというのは画面内の描画可能範囲の位置やサイズを変更させるためのものなんですね。
では、どうやったらVisual Studio 2008でMFCのSDIでプログラム開始時以外にウィンドウサイズを変更させることができるでしょうか?
わからないことも、ブログに書いているうちにひらめくこともある。
本当に行き詰ったら、考え直すのも1つの手かな。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: MFC プログラム実行途中でウィンドウサイズを変更したい。

#2

投稿記事 by みけCAT » 10年前

私はMFCのことは知らないので、ライブラリに悪影響があるかもしれないし、不可能かも知れないですが、
もしメインウィンドウのウィンドウハンドルが取得できるのであれば、そのハンドルをhWnd、変更後の幅をcx、変更後の高さをcyとして、

コード:

SetWindowPos(hWnd,NULL,0,0,cx,cy,SWP_NOMOVE | SWP_NOZORDER);
でできるかもしれません。

まず、提示されたコード中のthisが指すオブジェクトの型は何ですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: MFC プログラム実行途中でウィンドウサイズを変更したい。

#3

投稿記事 by みけCAT » 10年前

実行結果の画面をみると、どう考えてもMoveWindow関数がウィンドウ内の描画領域の位置に影響を及ぼしているように見えます。
このとき、座標はウィンドウのクライアント領域の左上からの相対座標のようです。
しかし、ググってもMoveWindowが描画領域に影響を与えるという情報は見つかりませんでした。
MoveWindowが作用しているのが、実際は子ウィンドウということは無いでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: MFC プログラム実行途中でウィンドウサイズを変更したい。

#4

投稿記事 by へにっくす » 10年前

MFCで作成しているとのことですが、まずダイアログベース、SDI、MDIどれで作成していますか?
ダイアログベースであればそのメインのダイアログ一つだけなので、単純にMoveWindowを呼べばそのメインダイアログのウィンドウサイズを変えられますが、SDI、MDIの場合は、見かけはウィンドウ一つでも、ウィンドウハンドルは複数作られているので気をつけてください。
まずどこでMoveWindowを呼んでますか?CViewの派生で呼んでいるのであれば、メインウィンドウのサイズを変えられないのは当たり前ですよ。
起動時にウィンドウサイズを指定する場合のサポート情報がありましたのでとりあえず。
[MSVC] MFCでプログラムの起動時の Window サイズを指定するには
written by へにっくす

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: MFC プログラム実行途中でウィンドウサイズを変更したい。

#5

投稿記事 by ISLe » 10年前

MFCを使わなくなって久しいのでうろ覚えですが。
AfxGetMainWnd()で、ダイアログベース,SDI,MDIに関係なくメインウィンドウへのポインタ(CWnd*)を取得できたかと。

かなたん
記事: 50
登録日時: 11年前
連絡を取る:

Re: MFC プログラム実行途中でウィンドウサイズを変更したい。

#6

投稿記事 by かなたん » 10年前

みけCATさんの回答やサイトにもあったSetWindowPosを試してみましたが、それでも挙動は変わりませんでした。
でも、へにっくすさんの回答を読んでなぜうまくいかないのかが分かりました。
このプログラムはMFCのSDIで作っていて、参考にしたサイトは何で作っていてどこに記述しているのかわかりませんが、このプログラムではマインスイーパー.cppのメッセージハンドラのところに書いていました。
初めはthisは省略してもいいだろうと書かず、うまくいかなかったのでthisを書き足してみてもうまくいかずで質問させてもらうことにしたのですが、そのthisが指しているであろうCマインスイーパーViewがCViewの派生なのが原因なんですね。
thisの部分をISLeさんの回答にあったAfxGetMainWnd()に書き換えてみたところうまくいきました。
みなさんありがとうございました。
わからないことも、ブログに書いているうちにひらめくこともある。
本当に行き詰ったら、考え直すのも1つの手かな。

閉鎖

“C言語何でも質問掲示板” へ戻る