2017-11-07 13 views
1

私は、クラスBのクラスの階層を持ち、DBから派生したクラスです。クラス階層に基づくメッセージマップのIDを抽象化

保護されたメンバーm_treeIDがあります。これは、内部の各ツリーのIDです。

私は上の代わりに

ON_NOTIFY(NM_CLICK, TREE_A, OnNMClickTree) 
ON_NOTIFY(NM_CLICK, TREE_B, OnNMClickTree) 

を行うために、各Dのために行くの

ON_NOTIFY(NM_CLICK, m_treeID, OnNMClickTree) 

のようなメッセージマップを埋めるために、基本クラスにしたい...と。

それは可能ですか?

+1

あなたが達成したいことと、それが多型に関係する方法ははっきりしていません。子クラスの場合と同様に、基本クラスは通知を処理するかどうかを決定できます。子孫は、ハンドラの基本クラス実装をオーバーライドし、必要に応じて基本実装も呼び出すことができます。さらに、保護されたメンバm_treeIDは、ベースと子孫の両方で使用できます。多型はいずれの場合にも達成される。そして、ON_NOTIFY()マクロの2番目のパラメータは、コントロールを識別し、それがどのように動作するのか、なぜこれを変更するのですか? –

+0

@ ConstantineGeorgiou:それぞれのツリーのIDを個別に持つn行の代わりに、 'ON_NOTIFY(NM_CLICK、m_treeID、OnNMClickTree)'を1行書きたいので、処理がすべてのツリーで同じであれば、ベースクラスにハンドラメソッドを持たせることができます。 – sergiol

+0

@IInspectable? – sergiol

答えて

1

私があなたを正しく理解している場合は、ON_NOTIFY_RANGEを見ましたか?

あなたがコントロールのセットに対して同じWM_NOTIFYメッセージを処理する必要がある場合は、むしろON_NOTIFYよりON_NOTIFY_RANGEを使用することができます。たとえば、特定の通知メッセージに対して同じアクションを実行するボタンのセットがあるとします。

ON_NOTIFY_RANGEを使用する場合、範囲の開始および終了の子識別子を指定することによって、通知メッセージを処理する子識別子の連続範囲を指定します。

ClassWizardは処理しません。ON_NOTIFY_RANGE;それを使用するには、メッセージマップを自分で編集する必要があります。

これは記事での使用方法を説明しています。 TREE_ATREE_Bなどが順番に付けられている限り、すべてのメッセージハンドラを持つことができます。

+0

いいえ、あなたは理解していませんでした。私は 'ON_NOTIFY_RANGE'を知っていますが、それは連続した範囲を扱う役割しか果たしません。クラスメンバフィールドで識別されたIDを使用して**多態性**に基づいてアイテムを処理したいと思います。 – sergiol

+1

ああ、私は不思議でした。私は知らない。あなたはそれを試しましたか? –

+0

はい、私はエラーが発生しました。m_treeIDがメッセージマップ仕様の範囲内に入ると範囲外になるからです! – sergiol

関連する問題