dポイントプレゼントキャンペーン実施中!

初めて投稿します。
C#でカスタムコンポーネント(ユーザコントロール、Windowsフォームコントロールライブラリと呼ばれる?)を作りたいと考えています。

実際に作りたいのは、ツールボックス内のダイアログカテゴリー内にあるような、ダイアログのコントロールを作りたいです。このダイアログ関係のコントロールは、コンテナ上にドロップすると、コンテナ上にオブジェクトが配置されるのではなく、エリアの下にコントロール名が表示されますが、このようなダイアログコントロールを作りたいと思っています。

イメージが伝わるか分かりませんが、通常ユーザコントロールを生成すると、以下のようにスケルトンが作られますが、
public partial class UserControl1 : UserControl
これを
public partial class UserControl1 : Form
のようにして、Formクラスのコントロールを作りたいのですが、作り方がわからず困っています。
いろいろ調べたのですが、この手のダイアログコントロール?に関する情報が見当たらないので、もしご存知の方がいらっしゃったら、書籍でも、URLでも良いので情報ください。
よろしくお願いします。

「C#のカスタムコンポーネント」の質問画像

A 回答 (3件)

はじめは、質問の意味が分かりませんでした。

が、他の回答者の方の意見
なども参考にして理解できました。

「Formベースのクラスをコントロールとしてツールボックスに登録する」

こんな発想をしたことが無かったので、楽しみながら実験ができました。

●手順

1.「クラスライブラリ」プロジェクトを作成します。

2.参照設定に必要なアセンブリを追加します。

3.ウィザードで作成されたクラスを削除します。

4.追加で、Windowsフォームを作成します

  一般的なフォームと同様、必要なデザイン、ロジックを記述します。


●ツールボックスに追加する方法

 4項の状態では、ツールボックスにアイコンは表示されません。
 強制的に追加してもエラーが返ってきます。

 Formから継承した場合、ツールボックスに表示するためには、
 3つの属性を定義することで表示されました。
 [Designer("")]
 [DesignTimeVisible(true)]
 [ToolboxItem(true)]


 以下のコードで実験済み


 [Designer("")]
 [DesignTimeVisible(true)]
 [ToolboxItem(true)]
 public partial class TestDialog : Form
 {
  public TestDialog()
  {
   InitializeComponent();
  }
 }

 属性の使い方については、MSDNを参照してください。[Designer("")]の
 引数を空白にしています。本来の使い方ではありません。


●ツールボックスにあるダイアログは、CommonDialogを継承しています。
 コモン Win32 ダイアログ ボックスを表示するための抽象基本クラスです。

 public partial class UserDialog : CommonDialog
 {
  public UserDialog()
  {
   InitializeComponent();
  }

  protected override bool RunDialog(IntPtr hwndOwner)
  {
   ;
  }

  public override void Reset()
  {
   ;
  }
 }

 この場合は、属性は不要です。このままコンパイルすると、UserDialogが
 ツールボックスに表示されます。

 この違いについてはよくわかりません。

 なお、MSDNには、CommonDialogのサンプルコードの記述もなく、難易度も
 高そうなのでお奨めできません。

●因みにカスタム コントロール化は以下の方法があります。

1.皆さんが書いている UserControlです。一番簡単な方法で、Formと同じ
  操作でデザインができます。

2.サブクラス化とも呼ばれる、標準コントロールを継承してカスタマイズ
  する方法です。オーナー描画を行うことにより、独自のデザインに変更
  することが主な目的です。

3.Controlクラスを継承して独自のコントロールを作成する方法です。

なお、これらは何れもFormに貼り付けるコントロールです。

詳しくは
サンプルで学ぶ「カスタム コントロール 入門、基礎、作り方」

参考URL:http://school.topposystem.co.jp/PR/COURSE_CONTRO …
    • good
    • 0
この回答へのお礼

まさしく目指していたのはこれです!
ありがとうございました。

属性
 [Designer("")]
 [DesignTimeVisible(true)]
 [ToolboxItem(true)]
を追加するのが肝のようです。
これらの属性については、まだ理解できていないので、これから勉強してゆこうと思います。

お礼日時:2010/03/02 00:39

Formクラスは、ダイアログなどのウィンドウそのもののベースクラスです。

ダイアログコントロールを作成するなら、ベースクラスはUserControlクラス、またはControlクラスになるはずです。

そもそもFormクラスのコントロールって何でしょう?フォーム上に配置するコントロールのことでしょうか??それならUserControlクラスをベースクラスにする方法になりますが・・・

この回答への補足

回答ありがとうございます。
上手く伝えられずすみません。

画像を添付しました。この画像は、FontDialogの例ですが、このようなXxxxDialogのようなものを作りたいのです。
例えば、自前の汎用的なダイアログを作っておき、そのダイアログをツールボックスからドラッグ&ドロップで利用できるようにしたいと考えています。
もし、情報をお持ちでしたらよろしくお願いいたします。

補足日時:2010/01/29 00:17
    • good
    • 0

ちょっとよくわかりませんが


ダイアログのコントロールを作りたいということは
ユーザコントロールクラスにフォームを作るんですよね(違ったらすいません)
そのフォームは、public partial class UserControl1 : Formですけど。。。
ユーザコントロールとしてのクラスとFormのクラス、他もろもろのクラスを
作成して1つのdllでそいつをツールに登録する感じですよね?
まったく素っ頓狂な回答(じゃないですね汗)で
申し訳ありません。

この回答への補足

返信が遅くなりすみません。説明がうまくできず申し訳ありません。
画像を添付しました。認識合っていると思います。

添付画像は、標準コントロールのFontDialogを貼り付けた場合です。
この手のXxxxxxDialogを自分で作成して、ツールボックスに登録して再利用したいのですがそのやり方を知りたいと思っています。
もし、hako-gtrさんが何か情報をお持ちでしたらよろしくお願いします。

ちなみに、
public partial class UserControl1 : Form
を実施すると、アイテムを選択したときに、「ツールボックスに含めることができるコンポーネントは何もありません」と怒られてしまいます。
もしかしたら作り方が悪いのでしょうか?

補足日時:2010/01/29 00:07
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!