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

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

今日の成果(UserControlを継承したコントロールを作る・Keys.Returnが拾えなくてちょっと詰まる の巻)

なんだか最近Perl以外(それも後半ほとんど正規表現くらいしかさわってなかったし)全くさわっていなかったので――。
今日は久しぶりのプログラミングを楽しんでいました。まあ、.NET Compact Frameworkだとまずはチマチマと部品作り・・・という話になったりしてしまうので、ひょっとしたらここはWindowsアプリケーションでも作ってた方がすっきりしたのかもしれませんが(^^ゞ

今日わかったこと

――ずいぶん今更感がありますが、.NET Compact Framework2.0からは.NET Compact FrameworkでもUserControlクラスがサポートされるようになりました。
今まで大して気にしていなかったんですが、このUserControlを継承してコントロールを作り、そのプロジェクトをビルドすると、以後プロジェクト内で、ツールボックスから作成したコントロールをフォームに貼り付けることができるようになるんですね。
いままでわたしは、別プロジェクトでコンポーネントライブラリを作って使う――という使い方しかしていなかったので、こんな使い方ができるとは知りませんでした。
これで結構.NET Compact Frameworkプログラミングも楽になりそう。.NET Compact Frameworkだとオーナードローリストボックスもカスタムボタンも何もないので、全部自作してぺたぺた、せっかくのビジュアルデザイナが役立たずになってしまっていましたからね。

今日詰まったこと

Windows Mobileは携帯のようなインタフェースなのに、携帯っぽいコントロールが何もないわけで・・・。今日はいつもはただのラベル、Enterキーやマウスボタン押下でアクティブになり、編集できるようになるという携帯電話風テキストボックスコントロールを作っていました。UserControlを継承しているのでちゃんとフォーカスも乗せられますし、本当に作りやすいです。
アクティブ時は、内部にあらかじめ用意しておいたテキストボックスにフォーカスを乗せ、そのテキストを直接編集できるようにします。そしてEnterキー押下で元のラベルに戻る――という仕組みにしたかったのですが、ここで詰まりました。
まあ、エミュレータ上でやったことですし、どうも最近Enterキーの動作がおかしいのでうちだけかもしれませんが、どうも.NET Compact Frameworkの単一行テキストボックスでは、Enterを押したときに限り、KeyDownとKeyUpイベントが発生しないらしい。
じゃあどうするのか というと、KeyPressイベントを使います。

private void cTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
  if (e.KeyChar == (char)Keys.Return)
  {
    this.cTextBox.Visible = false;
    this.Focus();
  }
}

こうすると、単一行テキストボックスでもEnter押下が拾えるので、ここで内部テキストボックスを隠してラベル状態のコントロールにフォーカスを戻します。まあ、やってみればどうってことはないのですが、ちょっと引っかかったので一つご参考にということで(^^ゞ

コードスニペットコーナー?

そんなわけで、ひとまず上で書いたMobileTextBoxと、表面にPictureの指定が可能で、OnPaintイベントを持つCustomButtonというコントロールを作成しました。どちらもコードを整理して将来的に配布するかもしれませんが、当分のことどうにかできそうにはありません。
こういうときどうしましょうかねえ、おんぷ村にあげてしまうのも気が引けますし。後一個余ったはてなのサブアカウント使ってコード展示場を作るのもいいですが、結局コピーペーストしなければいけなかったりで面倒だし。
早くも専用のWikiみたいなものが必要になってきてしまいました(^^ゞ先日の(ProgrammingBackground)は消してしまったので復旧にはまた時間がかかるのですが・・・どうしたものでしょうかね。
もしちょうどいいのがあれば、PerlC#構文強調モジュールでも入れて、おんぷ村に展示してしまうのがベストなんでしょうけど(^^ゞ