次の方法で共有


管理ウィンドウ プロシージャでコントロールをサブクラス化

[このドキュメントはプレビュー版であり、後のリリースで変更されることがあります。 空白のトピックは、プレースホルダーとして挿入されています。]

.NET Compact Framework コールバック デリゲートを使用してマネージ コードを呼び出すネイティブ コードの機能を提供します。 その対応するネイティブ コントロールからのコールバックを受信するマネージ コントロールをサブクラス化、直接利用できない、.NET Compact Framework 機能を持つコントロールを作成できます。

これは、Windows プログラミングおよびコントロールのサブクラス化に関する知識を開発者向けの高度なトピックです。 サブクラス コントロールをするにを知る方法、マップ先の機能をネイティブ コントロールの内部詳細がマネージ コントロールは拡張子に提供する必要があります。 どの Windows メッセージを監視して、目的の機能を提供する呼び出しにネイティブ Windows Embedded CE 関数を知る必要があります。

このトピックについて、TreeViewButton コントロールをサブクラス化を説明し、コードの例と、アプリケーションを構築するための指示に従ってここで説明します。

方法トピック

使用例

方法 : サブクラスをネイティブのコールバック関数を使用して、ツリー ビュー

TreeView イベントの実装を作成する NodeMouseClick コントロールをサブクラス化します。 .NET Compact Framework 直接サポートしませんこのメソッドの制約が設定されているリソースのサイズを制限する必要があるためです。

方法 : サブクラスをネイティブのコールバック関数を使用したボタン

カラフルなグラデーション塗りつぶしを表示する Button コントロールをサブクラス化します。

このボタンがサブクラス化とコールバックを使用する方法を示すは、主に提供されることに注意ください。 グラデーション塗りつぶしボタンを作成する、簡単な方法、について 方法 : グラデーションの塗りつぶしを表示します。 を参照してください。

両方のこれらのプログラムをサブクラス化、WndProcHooker クラスとネイティブの Win32 構造体のヘルパー クラス、プラットフォーム呼び出し宣言、および WndProc デリゲートします。 コードの一覧、し、方法 : Windows のプロシージャをフックのクラスを使用します。方法 : 使用のプラットフォーム用のヘルパー クラスを呼び出す 参照してください。

WndProcHooker クラス

WndProcHooker クラスでは、そのコントロールの特定の Windows メッセージを受け取ったときにマネージ コードへのコールバックを呼び出すネイティブ コントロール、またはウィンドウにできます。 これは、ネイティブ コントロールのウィンドウ プロシージャ (WndProc) WindowProc コントロールが呼び出されるコールバック メソッドに関連付けられたコントロールのリストかどうかを判断する、ルックアップを実行する、汎用のウィンドウ プロシージャを置き換えることによって実現します。 そうの場合、コントロールはフックと見なされます。

場合は、コントロールはフックすると、WindowProc は、コントロールが特定の Windows メッセージに応答するマップされているかどうかは決定します。 これは、目的の機能を含む、マネージ メソッドを呼び出す WndProcCallback デリゲートで Windows メッセージ、メッセージ マップです。 メッセージ マップがある場合、メッセージ、WndProcCallback デリゲート WindowProc に指定されたメッセージ パラメーターを使用して、コードを呼び出します。

コントロールのフック

HookWndProc メソッドはコントロールのハンドルを汎用のウィンドウ プロシージャ WindowProc で使用するメッセージ マップに関連付けます。 これをコントロールのフックと呼びます。

HookWndProc 方法によって、コントロールが既にフックされているかどうかが決まります。 ない場合は、そのコントロールの HookedProcInformation オブジェクトを作成しています。 このオブジェクトには、コントロールと、メッセージ マップへの参照が含まれます。 コントロールへのハンドルが既に作成されている場合、ウィンドウを元のウィンドウ プロシージャの後で復元ウィンドウへのポインターを作成してフックします。 ハンドルが作成されていない場合は ctrl_HandleCreatedHandleCreated イベントを処理するメソッドによってフックは取得します。

次に、HookWndProc メソッドは 2 つの汎用ディクショナリ コレクションのいずれかの HookedProcInformation オブジェクトを追加します。

  • すべてのフックされたウィンドウ ハンドルのグローバル一覧を含む hwindDict ディクショナリ。 キーは、hwnd です。 ハンドルを持つが作成されたコントロールは、このディクショナリに移動します。 このディクショナリ内のコントロールがマップされたメッセージの WindowProc で評価されます。

  • 作成されていないハンドルを持つコントロールを含む ctlDict ディクショナリ。 ctrl_HandleCreated メソッドが呼び出されると、コントロールは hwndDict ディクショナリに移動されます。

unhooking コントロール

2 つのコントロールを取り外し方法は、UnhookWndProc メソッドのいます。

  • コントロールのメッセージ マップからのメッセージの削除がフックされたウィンドウの hwndDict ディクショナリ内で、コントロールが残ります。 このメソッドは、コントロールの元のウィンドウ プロシージャ HookedProcInformation オブジェクトに保持するポインターを使用しても復元します。

  • フックされたコントロールの hwndDict 辞書からコントロールを削除およびいずれかのハンドルを削除完全 ctrlDict 辞書またはコントロールの破棄に挿入します。 このメソッドは、HookedProcInformation オブジェクトに保存されたハンドルを使用して、コントロールの元のウィンドウ プロシージャも復元します。

ツリー ビュー コントロールをサブクラス化

サンプル プログラム TreeViewBonus クラス 方法 : サブクラスをネイティブのコールバック関数を使用して、ツリー ビュー、記載は、 TreeView コントロール NodeMouseClick で直接使用可能でない .NET Compact Framework イベントを含めるを拡張します。

NodeMouseClick イベントは、 WndProcHooker クラスによって実行されるように、コントロールのメッセージ マップに、WM_NOTIFY メッセージを追加して取得されます。 マネージ コールバック メソッド WM_Notify_Handler は、Windows メッセージを送信した時点でマウス カーソルの座標を取得するネイティブ GetMessagePos 関数を呼び出します。

ことに注意してくださいこれらの座標 TreeView コントロールに対するされない、画面の表示クライアント領域を基準とします。 TreeViewBonus クラスでは、画面座標をクライアント座標にコントロールの PointToClient メソッドで変換します。 次にこれらのクライアント座標が場合と、TreeViewBonus オブジェクトがクリックされた場所を決定する TVM_HITTEST メッセージと共に送信されます。

TreeViewBonus クラスにはネイティブ コントロールの TVM_HITTEST メッセージを使用するコントロールに相対座標を取得するコードが含まれます。

クリックがツリー ビュー ノードのいずれかで発生した場合、そのノードへのハンドルをネイティブの TVHITTESTINFO 構造が含むです。 最後に、一致するハンドルを検索して、TreeView イベントを発生させる、 FindTreeNodeFromHandle メソッドによって実行される、マネージ NodeMouseClick ノードからの再帰的に走査するがします。 TreeNodeMouseClickEventArgs クラスは、次のデータを示します。

  • クリックされたノード。

  • クリックされたボタン。

  • 1 に設定をクリックの数。

  • クリックが発生した位置の x 座標。

  • クリックが発生した位置の y 座標。

TreeViewBonus クラスは WndProcHooker クラスによって実行されるマネージ ウィンドウ プロシージャにネイティブ ツリー ビュー コントロールの親をフックします。 OnParentChanged イベントに応答してには TreeView に移動した、新しい親などに、 FormPanel から可能性を対応するため、親コントロールをフックしています。

ボタン コントロールをサブクラス化

GradientFilledButton 記載 GradientFill クラスと 方法 : サブクラスをネイティブのコールバック関数を使用したボタンButton コントロールに 2 色間のグラデーションを表示するを拡張します。 このプログラムをサブクラス化を示すための主なものです。 ただし、ボタンに、グラデーションの塗りつぶしを表示する簡単な方法は Controlに従って 方法 : グラデーションの塗りつぶしを表示します。 から派生したカスタム コントロールを作成します。

GradientFilledButton クラスのコンストラクターは、マネージ コールバックに Windows メッセージをマップするには、 WndProcHooker クラスのインスタンスを作成します。 これらのコールバック メソッドは、Windows メッセージに応じて適切な状態と、コントロールの Capture プロパティの状態に、ボタンを描きます。 次の表は、マップされた Windows メッセージとその対応のコールバックです。

Windows メッセージ

マネージ コールバック メソッドと説明

WM_KEYDOWN

WM_KeyDown_Handler - では、Space キーまたは Enter (または操作) のキーが押された場合プッシュされた状態で] 再描画します。

WM_KEYUP

WM_KeyUp_Handler - unpushed 状態で、ボタンを再描画し、押されたキーが、Space キーまたは Enter (操作) 場合、 Click イベントを発生させますキー。

WM_LBUTTONDOWN

WM_LeftButtonDown_Hander - プッシュされた状態で、ボタンを再描画し、コントロールのマウス Capture プロパティ true 設定します。

WM_LBUTTONUP

WM_LButtonUp_Handler - unpushed 状態で、ボタンを再描画をカーソルでは、コントロールのクライアント領域内を放したし、 MouseUp にコントロール/マウス Capture プロパティを設定 false イベントが発生します。

WM_MOUSEMOVE

WM_MouseMove_Handler - は、以前をクリックするし、 Capturetrue が] を再描画します。

WM_PAINT

WM_Paint_Handler - 適切な状態でボタンを再描画します。

これらのマネージ コールバック メソッドの適切な状態で、ボタンを描画するのにには、DrawButton メソッドを使用します。 このメソッドは 2 つのオーバーロードの次の使用例は、使用、ウィンドウを上または Graphics オブジェクトをボタンを描画します。 両方のオーバーロードはブール型 (Boolean) の値] ボタンが押された場合を true を実行します。

GradientFilledButton クラスを使用するプラットフォームを実行するには、 GradientFill クラスは、塗りつぶしにネイティブ コードへの呼び出しを呼び出します。 GradientFill クラスは、開始と終了色を設定して左から右または上から下へと、塗りつぶし方向を指定するプロパティを提供します。

参照

処理手順

方法 : Windows のプロシージャをフックのクラスを使用します。

方法 : 使用のプラットフォーム用のヘルパー クラスを呼び出す

方法 : サブクラスをネイティブのコールバック関数を使用して、ツリー ビュー

方法 : グラデーションの塗りつぶしを表示します。

概念

.NET コンパクトなフレームワーク方法を説明したトピックの検索

その他の技術情報

.NET Compact Framework の相互運用性