拙作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ではこの方法は通用しないようです。
現状の実装が動くことも歓迎なのですが、左上の矩形領域をクリッ
プして表示座標を補正するという現状の実装がいいとも思えません。
後からマップの回転なども追加しているのですが、クリップを考慮
した座標計算がややこしいこと極まりないというジレンマに陥って
います。
目的は、最大化したときに、通常サイズの表示と縮尺を同じにし
たいというだけですので、通常表示と最大化表示の際のグラフィッ
ク領域の設定がほぼ瞬時に切り替えられれば、そのほうがベターで
す。なにかいい方法はないでしょうか?
この問題が解決すると、最新のライブラリを使用することができ
るので、別スレッドで質問した多重起動の問題が解決します。
よろしくお願いします。