2013/07/25

vb.netで自前のコントロールを作る方法

なぜかvb.net使いの人で、PictureBoxを改造してなんでもかんでもやろうとする人が多いような気がする。
PictureBoxはその名の通り、写真等のグラフィックの表示に特化して作られているので、入力や特殊な出力するのはオブジェクト志向の継承のコンセプトから外れるので避けるべきなのでは?





カスタムコントロールを作ろうとするのであれば、まずは下記のキーワードで検索してカスタムコントロール(ユーザーコントロール)についてのMSDN記事を一読することをおすすめします。

「.NET Framework を使用したカスタム Windows フォーム コントロールの開発」

次に、自作のコントロールをリソースエディタで使用するための設定方法を紹介します。
VSを開いて[ツール]の[オプション]を選択して設定ダイアログを表示してください。
「Windowsフォームデザイナ」の[全般]の中に「AutoToolboxPopulate」というオプションがあるので、Trueにしてください。

このオプションは自作コントロールをビルドした時、ツールボックスに追加するために必要な設定です。なぜかこれがデフォルトでONになっていないため、リソースエディタで配置させたいのにソースコード上で生成するしかないという状態になり使い勝手が悪くなります。。

前述したMSDNの記事でもあったように、自作のコントロールを作る場合はSystem.Windows.Forms.Control及びSystem.Windows.Forms.UserControlを継承してから作成するべきです。
MSDNの記事では、UserControlは複合コントロール等の既存のコントロールを配置して制御するために使用することを推奨しています。例えば都道府県・郵便番号・住所等をまとめたコントロールを作る場合に使用します。このUserControlはControlに比べて自前で実装しないといけない箇所が少なくなっています。
ControlはUserControlと比べて自前で実装しないといけない箇所が増えますがその分細かい制御が可能になります。.netが提供していない単体コントロールがなければControlを使用して実装します。
素のウィンドウに近いからと言ってFormクラスを安易に継承しないでください。
Formクラスはコンテナとしての性質を与えられているので、直接Form上でC++のように全てのイベントを処理しようしてもうまくいかない場合があります。例えば、Form上でIMEを使用しようとしてもデフォルトでは利用できず、CanEnableIMEをオーバーライドしてtrueを返すように実装する必要があります。
これはFormクラスが継承元に使用しているSystem.Windows.Forms.ScrollableControl やSystem.Windows.Forms.ContainerControlの実装によるものです。

既存のコントロールの表示をちょっと変えるような場合は、既存のコントロールを継承してOnPaintをオーバーライドして書き換えてください。

0 件のコメント:

コメントを投稿