ClientSizeに大きすぎる値を設定すると
どうしてこう妙な壁にぶち当たってばかりなのか。粗探ししたいわけじゃないのにー。
FormsのFormクラスにはSizeプロパティとClientSizeプロパティがあります。どちらも設定可能です。
ある日、こんなコードを書いていました。
this.ClientSize = Madoka.Size; renderTarget.Resize(this.ClientSize);
Direct2Dの話になるのですが、WindowRenderTargetはターゲットウィンドウをResizeで指定したサイズだと思い込んで描画します。なので実際のClientSizeと違ったり、まして比率が間違っていると非常に気持ち悪いことになります。
気持ち悪いことになりました。
このときMadoka.Sizeは(1536,1536)でしたが、もし無理な値ならClientSize設定した時点で補正され、次の取得では補正後の値が取れると考えていたのです。
でClientSize設定後の値がこちら。
Size {Width = 1542 Height = 1100} height: 1100 Height: 1100 IsEmpty: false Width: 1542 width: 1542 ClientSize {Width = 1536 Height = 1536} height: 1536 Height: 1536 IsEmpty: false Width: 1536 width: 1536
Sizeは補正されていますが、ClientSizeは設定値のままです。
リファレンスソースを読むとset_ClientSizeの動きはこのようになっています。
- Sizeプロパティに設定
- AdjustWindowRectExでウィンドウサイズに変換
- SetWindowPosを呼び出す
- WM_WINDOWPOSCHANGEDが同期的に呼ばれる
- (実際に設定された値)をClientSizeのキャッシュにセット
- SetWindowPosを呼び出す
- (set_ClientSizeに渡された値)をClientSizeのキャッシュにセット
せっかく補正後の値をもらってるのに元の値で上書きしていた、と。
どこかに投げた方がいいんですかね・・・