このカスタムと自己描画コントロールの MFC サポートについて説明します。動的なサブクラス化も記載されています。所有権、CWndオブジェクトとHWNDの s の上の一般的アドバイスを提示します。
MFC サンプル アプリケーション CTRLTEST ではこれらの機能の多くを示しています。Mfc サンプルのソース コードを参照してください CTRLTESTとオンライン ヘルプ。
オーナー描画コントロールおよびメニュー
Windows は、「所有者描画」コントロールとメニュー サポートを提供します。これらは、コントロールまたはメニューの動作と外観をカスタマイズすることができます、コントロールまたはメニューの親ウィンドウに送信 Windows メッセージです。
MFC は、メッセージ マップ エントリでオーナー描画を直接サポートします。:
これらをCWndをオーバーライドすることができます-派生クラス (通常、ダイアログまたはメイン フレーム ウィンドウ)、オーナー描画動作を実装するには。
このアプローチは、コードを再利用をさせない。2 つの異なるダイアログの 2 つの類似のコントロールがある場合、2 つの場所で、カスタム コントロール動作を実装する必要があります。自己描画コントロールの MFC でサポートされているアーキテクチャがこの問題を解決します。
自己描画コントロールとメニュー
MFC ( CWndのCMenu) の既定の実装は、標準的なオーナー描画メッセージを提供します。この既定の実装は、オーナー描画パラメーターをデコードし、オーナー描画メッセージがコントロールまたはメニューを委任します。描画 (/測定/比較) コード] メニューの [所有者] ウィンドウではなく、コントロールのクラスではこの「自己描画」と呼ばれます。
これは「所有者描画」セマンティクスを使用して、コントロールを表示する再利用可能なコントロール クラスを作成することができます。コントロールは、コントロールの所有者ではないの描画用のコードは、コントロール クラスのです。これは、カスタム コントロール プログラミング、オブジェクト指向のアプローチであります。
CButton:DrawItem(LPDRAWITEMSTRUCT);特価;//このボタンを描画(&N)
CMenu:MeasureItem(LPMEASUREITEMSTRUCT);特価;//このメニュー内の項目のサイズを測定CMenu:DrawItem(LPDRAWITEMSTRUCT);//このメニューの項目を描画(&N)
CListBox:MeasureItem(LPMEASUREITEMSTRUCT);特価;//このリスト ボックスの項目のサイズを測定CListBox:DrawItem(LPDRAWITEMSTRUCT);//このリスト ボックスで項目を描画CListBox:CompareItem(LPCOMPAREITEMSTRUCT);/場合は、このリスト ボックスに 2 つの項目を比較 LBS_SORTCListBox:DeleteItem(LPDELETEITEMSTRUCT);・このリスト ボックスから項目を削除(&N)
CComboBox:MeasureItem(LPMEASUREITEMSTRUCT);特価;//このコンボ ボックスの項目のサイズを測定CComboBox:DrawItem(LPDRAWITEMSTRUCT);//このコンボ ボックスで項目を描画CComboBox:CompareItem(LPCOMPAREITEMSTRUCT);/場合は、このコンボ ボックスに 2 つの項目を比較 CBS_SORTCComboBox:DeleteItem(LPDELETEITEMSTRUCT);・このコンボ ボックスから項目を削除(&N)
オーナー描画の詳細構造 (DRAWITEMSTRUCT、 MEASUREITEMSTRUCT、 COMPAREITEMSTRUCT、およびDELETEITEMSTRUCT)、MFC ドキュメントCWnd::OnDrawItem、 CWnd::OnMeasureItem、 CWnd::OnCompareItem、およびCWnd::OnDeleteItemをそれぞれ参照してください。
自己描画コントロールおよびメニューの使用
自己描画メニューは、 MeasureItem 、 DrawItemメンバー関数をオーバーライドする必要があります。
リスト ボックスやコンボ ボックスの自画像をMeasureItem 、 DrawItemをオーバーライドする必要があります。OWNERDRAWVARIABLE スタイル ダイアログ テンプレートで指定する必要があります (LBS_OWNERDRAWVARIABLEおよびCBS_OWNERDRAWVARIABLEそれぞれ)。OWNERDRAWFIXEDスタイルを自己描画コントロールをリスト ボックスに添付される前に、アイテムの固定の高さが決まりますので、項目の自画像と動作しません。(Win 3.1 メンバー CListBox::SetItemHeight関数し、 CComboBox::SetItemHeightを使用してこの制限を回避を取得できます。
さらに、スイッチングをOWNERDRAWVARIABLEスタイルにNOINTEGRALHEIGHTスタイルに影響することに注意してください。コントロールが計算することができますしないため変数の高さが不可欠なアイテムのサイズ調整、 INTEGRALHEIGHTの既定のスタイルは無視され、コントロールは常にNOINTEGRALHEIGHTです。あなたのアイテムの高さ固定である場合は、描画、整数乗算器の項目のサイズをコントロールのサイズを指定してから一部の項目を防ぐことができます。
リスト ボックスとコンボ ボックスの並べ替えスタイルの自画像を (LBS_SORTとCBS_SORTそれぞれ)、 CompareItemメンバー関数をオーバーライドする必要があります。
リスト ボックスやコンボ ボックスの自画像を通常DeleteItemをオーバーライドできません。リスト ボックスまたはコンボ ボックスのアイテムごとの追加のメモリやその他のリソースが格納されている場合、 DeleteItemをオーバーライドすることができます。
自己描画コントロールおよびメニューの例
MFC の一般的なサンプル CTRLTEST提供 (色) を自己描画メニューと (また色)、自己描画リスト ボックスのサンプル。
自己描画ボタンの最も典型的な例は、ビットマップ ボタン (1、2、または 3 つのビットマップ イメージをさまざまな状態を示す) です。これは、MFC クラスCBitmapButton提供されます。
動的なサブクラス化
サブクラス化とは別のWndProcウィンドウのWndProcを置き換えるのデフォルト (スーパークラス) の機能を古いWndProcを呼び出す Windows 用語です。
これは、C++ クラスの派生 (単語「ベース」と」「超」と「サブ」Windows オブジェクト モデルを使用し派生した「C++ 用語使用) と混同するべきではないです。MFC と Windows のサブクラス化における C++ の派生機能非常に類似している、C++ が動的サブクラス化に類似した機能をサポートしていません。
CWndクラス ( CWndから派生)、C++ オブジェクトと Windows のウィンドウ オブジェクト ( HWNDとも呼ばれます) 間の接続を提供します。
これらの関連する 3 つの一般的な方法します。:
この最後の場合、メンバー関数で行われます:
両方のルーチンはCWndオブジェクトを既存の Windows HWNDを接続します。SubclassWindow HWNDを直接、かかるし、 SubclassDlgItemは、コントロール ID と親ウィンドウ (通常はダイアログ) ヘルパーです。SubclassDlgItemダイアログのコントロールをダイアログ テンプレートから作成する C++ オブジェクトをアタッチするために設計されています。
参照してください、 CTRLTEST例SubclassWindowとSubclassDlgItemを使用する場合の例をいくつかの。
番号順テクニカル ノート|nbsp;カテゴリ別テクニカル ノート(&N)