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