ページ 11

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

Posted: 2013年9月22日(日) 17:25
by かなたん
マインスイーパーの初級が出来上がったので、中級など別のサイズも作りたいと考えています。
ウィンドウのサイズを取得するに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でプログラム開始時以外にウィンドウサイズを変更させることができるでしょうか?

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

Posted: 2013年9月22日(日) 17:32
by みけCAT
私はMFCのことは知らないので、ライブラリに悪影響があるかもしれないし、不可能かも知れないですが、
もしメインウィンドウのウィンドウハンドルが取得できるのであれば、そのハンドルをhWnd、変更後の幅をcx、変更後の高さをcyとして、

コード:

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

まず、提示されたコード中のthisが指すオブジェクトの型は何ですか?

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

Posted: 2013年9月22日(日) 17:39
by みけCAT
実行結果の画面をみると、どう考えてもMoveWindow関数がウィンドウ内の描画領域の位置に影響を及ぼしているように見えます。
このとき、座標はウィンドウのクライアント領域の左上からの相対座標のようです。
しかし、ググってもMoveWindowが描画領域に影響を与えるという情報は見つかりませんでした。
MoveWindowが作用しているのが、実際は子ウィンドウということは無いでしょうか?

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

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

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

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

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

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