標準コントロールからのコントロールの派生
他の CWnd の派生クラスと同様に、既存のコントロール クラスから新しいクラスを派生させることにより、コントロールの動作を変更できます。
派生コントロール クラスを作成するには
既存のコントロール クラスからクラスを派生させ、オプションで
Createメンバー関数をオーバーライドして、基底クラスのCreate関数に必要な引数を提供します。特定の Windows メッセージに応答してコントロールの動作を変更するためのメッセージ ハンドラー メンバー関数とメッセージ マップ エントリを提供します。 「関数へのメッセージの割り当て」を参照してください。
コントロールの機能を拡張するための新しいメンバー関数を提供します (省略可能)。
ダイアログ ボックスで派生コントロールを使用するには、追加の作業が必要です。 ダイアログ ボックス内のコントロールの種類と位置は、通常、ダイアログ テンプレート リソースで指定されます。 派生コントロール クラスを作成した場合、これをダイアログ テンプレートで指定することはできません。それは、作成した派生クラスがリソース コンパイラに認識されないためです。
派生コントロールをダイアログ ボックスに配置するには
派生ダイアログ クラスの宣言に、派生コントロール クラスのオブジェクトを埋め込みます。
ダイアログ クラス
OnInitDialogのメンバー関数をオーバーライドして、派生コントロールのSubclassDlgItemメンバー関数を呼び出します。
ダイアログ テンプレートから作成されたコントロールは、SubclassDlgItem によって "動的にサブクラス化" されます。 コントロールが動的にサブクラス化されている場合は、Windows にフックし、独自のアプリケーション内で一部のメッセージを処理してから、残りのメッセージを Windows に渡します。 詳細については、"MFC のリファレンス" のクラス CWnd の SubclassDlgItem メンバー関数を参照してください。 次の例は、SubclassDlgItem を呼び出す OnInitDialog のオーバーライドを記述する方法を示しています。
BOOL CSubDialog::OnInitDialog()
{
CDialog::OnInitDialog();
m_wndMyBtn.SubclassDlgItem(IDC_MYBTN, this);
return TRUE;
}
派生コントロールはダイアログ クラスに埋め込まれているため、ダイアログ ボックスが作成されると作成され、ダイアログ ボックスが破棄されると破棄されます。 このコードを「手動でコントロールを追加する方法」の例と比較してください。