Windows Mobile アプリケーション開発のムダ知識 [Part 3]

なぜか連載になってしまったこのシリーズ、3 回目の記事です。

今回は、僕が結構苦しんだある問題について書いてみます。

結構悩めるところなので、同じような問題で苦しんでいる方は、参考にしてみてください。

まあ、こういうところがプログラミングの面白さであったりもするわけですが。

 

3. 画面いっぱいに textBox とかを表示したいとき...

image228 

用途によっては、こんな感じで画面いっぱいに textBox を表示させたいときもあるでしょう。

例えば、エディタ的なものを作りたい場合。

しかし、Windows Mobile は、普通の Windows と違って、縦画面・横画面の問題があります。

例えば、縦画面でテキストボックスを画面いっぱいに Visual Studio 上で配置した場合、縦画面のまま実行した場合は問題なく実行されますが・・・。

 

image230

当たり前ですが、横にすると、このようにはみ出します。

もちろん、逆も同じで、横画面で画面いっぱいに配置した場合は、縦画面にした時にはみ出します。

また、Advanced/W-ZERO3[es] など画面サイズが特殊なものだと、これまた Visual Sutido 上では横画面で画面いっぱいに textBox を配置したとしても、右側が余ってしまうのです。

 

では、どうすればいいのか?

普通に考えた場合、Form1 のサイズが変更されたら textBox のサイズも変更する・・・という処理を考えてみることでしょう。

もちろん、これは Form1 の Resize イベントで簡単に設定できます。

private void Form1_Resize(object sender, EventArgs e)
{
    textBox1.Size = this.Size;
}

こんなコードを書くだけで、うまくいきそうな気がします。

Load イベントも必要じゃないかと思うかもしれませんが、Form1 がロードされた時にも Resize イベントが発生しているようなので、不要みたいです。

実行してみましょう。

 

image233

textBox がロードされた時に Form1 に合わせてちゃんと Resize されるかどうか確認するために、わざと小さく配置してみます。

もし、僕の思い通りに実行されているとすれば、ロードされた時や縦横回転させた時に、画面サイズに合わせて、画面いっぱいに textBox が表示されるはずです。

 

image235

ロードされた状態。

おお、ちゃんと画面いっぱいに textBox が表示されてるじゃないか。

 

image237 

回転してみる。

あれれ?textBox が、ちょっとだけはみ出しちゃってるよ。

おかげで、スクロールバーが登場しちゃってます。

確かに、縦横のサイズは変更されているのだけど、これは気になる。

 

image239

縦に戻してみる。

あれれ?やっぱりはみ出しちゃってるよ・・・。

なんで?

 

というわけで、僕の思った通りには動いてくれなかったようです。

が、サイズを変更させる所にブレークポイントを設定して、Form1 や textBox のプロパティを確認しながら実行してみました・・・。

なんと、それだとうまくいくのです。

これは、あれか、よくあるゆっくり実行させてあげるとうまくいくタイプの、意味不明な。

不可解かもしれませんが、結構いろんなプログラムを作っていると、ブレークポイントを設定してトレースしながらだとうまくいくのに、ブレークポイントなしだとうまくいかないってことがよくあるんですよ。

そういう場合のバグのほとんどは、Timer とかで無理やり少しの間休ませてあげるとうまくいきます。

今回も、Resize する前に少しだけ休んでみましょう。

 

Timer を追加して、次のようにコードを変更します

private void Form1_Resize(object sender, EventArgs e)
{
    timer1.Enabled = true;
}

private void timer1_Tick(object sender, EventArgs e)
{
    timer1.Enabled = false;
    textBox1.Size = this.Size;
}

Timer1 の interval は、Default の 100 のままです。

どんな感じになるかというと、もし Form1 のサイズが変わったよ~ってことを受け取ったら、100ms 休んだ後に Form1 のサイズに合わせて textBox1 のサイズを変更してあげます。

マジックです、見ててください。

 

image241

image243 

このように、無事成功したわけで。

これで、画面を回転されても、どんなサイズのディスプレイを搭載した端末であろうと、textBox のサイズを Form いっぱいに表示させることが可能になりました。

動作も、100ms (0.1秒) 程度しか待たせてないので、もたつきもほとんどありません。

なんで、Timer で待たせてあげると、ちゃんと動くかは理解不能ですが、きっとそういう "仕様" なのだ。と思っておいた方が精神衛生上すっきりします。

(たぶん、画面を回転させる処理が、内部的にはすごい複雑になってて、Form1 のサイズがいきなり縦から横に替るわけじゃないんだろうなぁ。すなわち何回か変なサイズに変更されたあと、正常なサイズに変更されるのかな?とか。100ms 経過して落ち着いた後に変更してあげると、正常なサイズが取得できるのではないかと。Resize イベントは一番最初にサイズが変更された時に呼び出されるから、変なサイズを取得してしまってこんなことになるのかなと。僕の予想はそんな感じです。)

もしかしたら、同じことをもっと簡単、単純にできる方法があるかもしれませんが、知っているなら良かったらコメントから教えてください。

今回は、これで終わりにします。

トラックバック(0)

このブログ記事を参照しているブログ一覧: Windows Mobile アプリケーション開発のムダ知識 [Part 3]

このブログ記事に対するトラックバックURL: http://techno-st.net/mt/mt-tb.cgi/608

コメントする

2008年11月

      1
2345678
9101112131415
16171819202122
23242526272829
30      

Random Entries

日替わりらしい。
仕様上ページ別に変わるらしい。
Random な感じらしい。

アーカイブ

  • 月別アーカイブ:
  • カテゴリーアーカイブ:

Ads

このブログ記事について

このページは、technoが2008年6月20日 05:12に書いたブログ記事です。

ひとつ前のブログ記事は「Windows Mobile アプリケーション開発のムダ知識 [Part 2]」です。

次のブログ記事は「セキュリティ&プログラミングキャンプ2008 に応募してみます。」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

 

- 実験中 -

mgfxjey49@techno-st.net

xq58grpua@techno-st.net

m0ss9eatc(at)techno-st.net

y75vdonfa@techno-st.net

edvvb6cx9@techno-st.net

Mail Address