1

カスタム コントロールがあります。これは、System.Windows.Forms.Control をサブクラス化するマネージ コードです。

このコントロールの場所に、編集ボックス、選択リスト、コンボ ボックス、ラジオ ボタンなどを追加したいと考えています。これを行う簡単な方法は、これらのクラスのインスタンスを Controls コレクションに追加して、それらが子コントロールになるようにすることです。

それらを子コントロールとして追加すると、次のような微妙な問題が発生する可能性があります。

  • IE 6 メニューでコントロール (コンボ ボックス) を選択

  • コントロールのコンテンツをスクロールするように見えるコントロールにスクロールバーがあります(コンテンツはコントロール自体よりも大きいです)。子コントロールが画面の端に近い場合、その子を半分表示 (つまり、クリップ) したい (つまり、その半分を物理画面の端から離して配置する) ことができますが、真の子コントロールを表示することはできません。親の境界の外側にあります。

  • 他に潜在的な問題はありますか?

IE7 を使用してコンボ ボックスなどを含むhttp://www.tizag.com/htmlT/htmlselect.php (たとえば) を表示し、Spy++ を使用して IE7 をスパイすると、子を持たない単一のウィンドウ/コントロール インスタンス (クラス名は "Internet Explorer_Server") しか表示されません。

これは、IE7 では、コンボ ボックスをレンダリングする機能が IE7 コントロール自体に組み込まれており、IE7 は標準コントロールを子コントロールとして使用しないことを意味していると思います。

質問:

  • 標準コントロールをカスタム コントロールの子として再利用するのと、標準コントロールの機能をカスタム コントロール自体に再実装するのとのどちらがよいでしょうか?
  • いずれかのシナリオに関連して、共有すべき警告 (警告) はありますか?
  • カスタム コントロール内で標準コントロールの機能を再実装したい場合、再利用できる (この機能を実装する) 既存のコードを知っていますか?

そのようなコードが既に存在する場合、それを検索する方法がわかりません (私の検索では、たとえば、オーナー描画コンボ ボックスや標準コンボ ボックスの拡張機能が見つかります)。おそらく、標準コントロールをゼロから再実装する人はほとんどいないでしょうか?


編集

半関連の質問を見つけました: Visual Styles が有効になっている ComboBox のようにコントロールをレンダリングする方法は?

4

1 に答える 1

2

はい、Internet Explorer は、Windows テーマ API を使用してコントロールを描画します。これも、System.Windows.Forms.VisualStyles 名前空間で定義されている型を使用して行うことができます。

IE チームがこれを行ったのは、多数のコントロールが同時に画面上に表示され、それぞれがウィンドウ メッセージを受信するというパフォーマンス上の問題を回避するためです。たとえば、この StackOverflow.com ページを見ると、30 ~ 40 個のリンク ラベル コントロール、10 個程度のボタン、20 個以上のラベルなどが表示されます。

.NET マネージ コードである Zune ソフトウェアもカスタム コントロールを使用することに注意してください。いずれかのコントロールで Spy++ を使用しようとすると、実際の Win32 コントロールではないことがわかります。Zune ソフトウェアで Reflector を使用して、彼らが何をしているかを正確に確認できます。私の記憶が正しければ、彼らは Zune ソフトウェアに含まれているカスタム マネージド UI フレームワークを使用しています。

これらのコントロールをゼロから書き直す限り、やるべきことは山ほどあると思います。それは実際よりも簡単に聞こえます。

于 2009-05-08T04:21:32.670 に答える