高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

アプリケーション起動中画面回転

この間書いていたTDiaryを開発中。
.NET Compact Frameworkのアプリケーションを起動中画面回転を行うと、フォームのResizeイベントが発生します。
いくらDockやAnchorプロパティがあったとしても、フォームコントロールの配置によっては、コントロールの配置を調整する必要があります。
ここでの処理にも寄るのかとは思いますが、フォームがWindows Mobileのタイトルバーにめり込んでしまい、コントロールが正常に表示されなくなることがあるという問題が発生しました。
原因を追ってみると、どうも、Windows Mobileのフォームリサイズ処理は

画面回転→Resizeイベント→画面のクライアントサイズ変更(Screen.PrimaryScreen.WorkingArea変更)→Resizeイベント

という流れで動いているようで。で、場合によっては画面のクライアントサイズ変更によるフォームのサイズ再設定が発生せず(?)、フォームがタイトルバーを無視したサイズになってしまうようです。
これが困ったことにブレークポイントを入れると発生しない問題のようで。Thread.Sleepによるウェイトを挟むことでとりあえず正常にフォームサイズは設定されるようにはなりましたが*1・・・ 何となく負けた気分ですね。
特にCompact Frameworkの一般的な問題だという話は聞いていないので、Resizeイベントに書いている処理の内容や、乗せているフォームコントロールの組み合わせで起こっている問題であると思いますが(TabControl, DateTimePicker, Controlを継承した独自コントロールの三つ)。なんだろうなあ・・・。
もとはといえば、TabControlにDockしか指定できないから(Anchorを指定するとDockがNoneになってしまうから)いちいち自分でコードを書かなければいけなくなるんですけどねえ。DelphiみたいにDockもAnchorも同時に指定できれば良いんですけどね、どうしてこんな実装になったのやら。

*1:そこである程度処理が止まれば正常動作するようなので