トップページ > 過去ログ > 記事閲覧
ウィンドウの最大化
名前:よこたん(sogoh) 日時: 2011/02/19 20:18

 拙作のソフトは640x480のクライアント領域サイズでウィンドウ モードで動作させているのですが、このサイズに加えて、最大化 ができないものかと試行錯誤しています。  最大化した場合には、クライアント領域のサイズをタスクバー を除くディスプレイのサイズと同程度に広げて、表示するグラフィ ックの解像度もクライアント領域と同じサイズにしたいのです。  試してみたのは下記のコードです。 // 初期設定 SetGraphMode( 640, 480, 16 ) ; DxLib_Init() ; // 最大化を有効に HWND hMainWnd = GetMainWindowHandle(); LONG lStyle; lStyle = GetWindowLong( hMainWnd, GWL_STYLE ); lStyle |= WS_MAXIMIZEBOX; lStyle = SetWindowLong( hMainWnd, GWL_STYLE, lStyle ); SetWindowPos( hMainWnd, NULL, 0, 0, 0, 0, (SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_FRAMECHANGED) );  これだと、ウィンドウは最大化されるのですが、元のウィンドウ サイズの外側には描画されません。  次に試してみたのは、最大化したタイミングでSetGraphMode() を再度呼び出すことです。 // 最大化検知後(SystemParametersInfo()で取得した値を使用) SetGraphMode( 1600, 860, 16 ) ;  これだと、描画は大丈夫そうなのですが、最大化された状態では なく通常サイズのウィンドウの扱いになり、タイトルバーのボタン が最大化された状態ではなくなってしまいます。  初期設定でディスプレイサイズのウインドウを作ってから、無理 やり640x480のウィンドウにリサイズできないものかと下記のコード を試しましたが、ウィンドウのサイズを変えることができませんで した。初めから最大の解像度でDXライブラリのグラフィックモード を初期化しておけば、最大の領域に描画を行ってくれて、ウィンド ウのサイズを小さくすれば、そこで描画が切り取られるかなと思っ たのですが、ちょっと甘かったですね。 // 初期設定 SetGraphMode( 1600, 860, 16 ) ; DxLib_Init() ; // 最大化を有効に HWND hMainWnd = GetMainWindowHandle(); LONG lStyle; lStyle = GetWindowLong( hMainWnd, GWL_STYLE ); lStyle |= WS_MAXIMIZEBOX; lStyle = SetWindowLong( hMainWnd, GWL_STYLE, lStyle ); SetWindowPos( hMainWnd, NULL, 0, 0, 1600, 480, (SWP_NOMOVE|SWP_NOZORDER|SWP_FRAMECHANGED) ); SetWindowPos( hMainWnd, NULL, 0, 0, 640, 480, (SWP_NOMOVE|SWP_NOZORDER|SWP_FRAMECHANGED) );  最大化を有効にすることは諦めて、画面サイズ切り替えボタンを クライアント領域の中に作成して、640x480とディスプレイいっぱい のサイズとを切り替えるようにしようかと考え始めていますが、最 大化ボタンをうまく使えるような方法がありましたら教えていただ けないでしょうか?  よろしくお願いします。

Page: 1 |

Re: ウィンドウの最大化 ( No.1 )
名前:いっち 日時:2011/02/19 21:26

SetWindowSize や SetWindowSizeChangeEnableFlag あたりを使うと出来そうな感じですが、 管理人さんによると「DXライブラリはウインドウの大きさを自由に変更できるタイプのソフトには向いていません」 (://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=1777) とのことですので、「画面サイズ切り替えボタン」を用意して SetGraphMode してしまったほうが良いかもしれません。
Re: ウィンドウの最大化 ( No.2 )
名前:よこたん(sogoh) 日時:2011/02/19 23:14

いっちさん、  コメントありがとうございます。  SetWindowSizeChangeEnableFlag()って第2引数があったんですね。  ちょっと試してみたら、できそうな雰囲気は確認できました。2D の描画は問題なさそうです。3Dモデルデータがまったく描画されな くなりましたが、アプリ側の処理の問題かどうかはまだ切り分けで きていません。  この方法が使えると、画像データの読み直しをしなくてもいいの で処理が簡単になります。  現在、画面サイズ切り替えボタン+SetGraphModeのパターンの実 装に着手しており、3Dモデルデータの描画も、ひとまずこちらのパ ターンでの動作を確認してから、最大化に挑戦したいと思います。
Re: ウィンドウの最大化 ( No.3 )
名前:よこたん(sogoh)/補足 日時:2011/02/20 00:08

 3Dモードのモデルデータが描画されないのは、描画位置と拡大率が狂いまくっているからと判明しました。640x480のサイズで2Dと3Dの描画を重ねていたので、補正すればなんとかなりそうです。
Re: ウィンドウの最大化 ( No.4 )
名前:よこたん(sogoh)/補足の2 日時:2011/02/20 10:36

想定外の使い方かもしれませんが、現状、このような引数で使う ことにしました。 SetWindowSizeChangeEnableFlag(FALSE,FALSE) ; 最大化は行なうがウィンドウサイズの自由な変更は許可しません。 いくらでも小さくできるのはちょっと困るので...。 これで、クライアント領域に画面をフィットさせない指定を有効に しつつ、常に全画面領域に描画する状態で、ウインドウサイズだけ 640x480か、画面いっぱいかを相互に切り替えることができるように なりました。 あとは、3Dのモデルデータ表示座標の補正ができれば完成です。
Re: ウィンドウの最大化 ( No.5 )
名前:よこたん(sogoh)/(解決) 日時:2011/02/20 20:27

 3Dモデルデータの位置と大きさの補正も無事完了しました。640×480のサイズ を前提とした処理だったので、SetGraphMode()で設定したものと同じ値を使用す るようにすると、ばっちり合いました。 // SetGraphMode()で設定した全画面時の高さを指定 SetupCamera_Ortho(( float )m_GraphicPixelSize.y ) ; // SetGraphModeで設定した全画面時の幅の半分(画面中央)をカメラポジションに設定 VECTOR CameraPosition = VGet( ( float )m_GraphicPixelSize.x/2, 600.0f, -1039.2f ) ; float VRotate = 3.14f / 6.0f ; SetCameraPositionAndAngle( CameraPosition, VRotate, 0.0f, 0.0f ) ;  これで、全画面処理の対応ができました。感謝します。

Page: 1 |