トップページ > 過去ログ > 記事閲覧
通常サイズと最大化時に同一縮尺で表示する
名前:よこたん(sogoh) 日時: 2012/03/31 14:29

 拙作SG箱庭鉄道では、最大化したときに、通常サイズの表示と縮 尺を同じにして、より広い範囲のマップが表示されるようにしてい ます。  DXライブラリ3.04dでは意図通りに動いていたのですが、3.07dに 差し替えてみたところ、640×480のウィンドウに1600×860(1900× 900のデスクトップのワークエリア)の領域が表示されているように 見えます。 問題となる事象: ttp://sgsoftware.blog.fc2.com/blog-entry-1057.html 元々の実装の考え方(座標補正): ttp://sgsoftware.blog.fc2.com/blog-entry-740.html  初期化時のコードは下記のとおりです。 ChangeWindowMode( TRUE ) ; // Windowモードで起動する // ウインドウのサイズを自由に変更出来ないけど // クライアント領域に画面をフィットさせない SetWindowSizeChangeEnableFlag( FALSE, FALSE ) ; // ディスプレイサイズでグラフィック領域を設定 RECT rcDisp ; SystemParametersInfo( SPI_GETWORKAREA, NULL, &rcDisp, NULL); int x = rcDisp.right - rcDisp.left ; int y =rcDisp.bottom - rcDisp.top ; SetGraphMode( x, y, 16 ) ; // ウィンドウサイズを通常表示サイズに設定 SetWindowSize( 640, 480 ) ; // ウインドウがアクティブではない状態でも処理を続行する SetAlwaysRunFlag( TRUE ) ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 }  通常サイズと最大化の切り替えには、Dxライブラリの関数を使用 しておらず、ウィンドウサイズの変更を検知して、描画領域の座標 の補正を行なっています。  SetWindowSizeChangeEnableFlag()の第2引数が、そもそも第1引 数がFALSEであるときにFALSE指定されることは想定されていないの に、今まではたまたまうまく動いていたということかもしれません。  当初、ChangeWindowMode()の使用も考えたのですが、サイズ変更 毎にすべてのグラフィックデータを読み直さないといけないのは処 理時間がかかるので避けたほうがいいかなと思い、断念しました。  代替手段として、あらかじめ、デスクトップのワークエリアのサ イズのグラフィック領域を設定して、通常サイズの表示では、表示 エリアをクリップしてしまおうという考えで今までうまくいってい たのですが、3.07dではこの方法は通用しないようです。  現状の実装が動くことも歓迎なのですが、左上の矩形領域をクリッ プして表示座標を補正するという現状の実装がいいとも思えません。 後からマップの回転なども追加しているのですが、クリップを考慮 した座標計算がややこしいこと極まりないというジレンマに陥って います。  目的は、最大化したときに、通常サイズの表示と縮尺を同じにし たいというだけですので、通常表示と最大化表示の際のグラフィッ ク領域の設定がほぼ瞬時に切り替えられれば、そのほうがベターで す。なにかいい方法はないでしょうか?  この問題が解決すると、最新のライブラリを使用することができ るので、別スレッドで質問した多重起動の問題が解決します。  よろしくお願いします。

Page: 1 |

Re: 通常サイズと最大化時に同一縮尺で表示する ( No.1 )
名前:いっち 日時:2012/03/31 21:21

ウィンドウサイズとバッファサイズが異なるときにフィットさせるかどうかの選択は出来る必要があると思うので、 SetWindowSizeChangeEnableFlag の動作を以前と同様にして頂くのが良いような気がします。 別の手段としてはスクリーンと同サイズのバックバッファをもう1枚用意して、 うまいこと描画されるように調整するぐらいしか思いつきません。 DxLib_Init の後でも SetGraphDisplayArea が使用できれば根本的な解決になりそうですが、無理なようです。 > ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=past&no=1830
Re: 通常サイズと最大化時に同一縮尺で表示する ( No.2 )
名前:よこたん(sogoh) 日時:2012/03/31 22:05

いっちさん、コメントありがとうございます。 管理人様、  SetWindowSizeChangeEnableFlag()の動作を3.04dと同じく、ウイ ンドウのサイズを自由に変更出来ないけどクライアント領域に画面 をフィットさせないという(FALSE,FALSE)指定を有効にするような 仕様に戻していただけないでしょうか?  ご検討、よろしくお願いします。
Re: 通常サイズと最大化時に同一縮尺で表示する ( No.3 )
名前:管理人 日時:2012/04/01 06:45

すみません、3.05aの頃に加えた「同じ設定のフラグだったら無視する」コードにバグがありました orz ( 現バージョンでもウインドウの処理的には FALSE, FALSE に対応していました ) 修正版をアップしましたので、よろしければお試しください m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
Re: 通常サイズと最大化時に同一縮尺で表示する ( No.4 )
名前:よこたん(sogoh)/解決済 日時:2012/04/02 10:18

管理人様、  3.07eでの動作を確認しました。 ご対応、ありがとうございました。

Page: 1 |