参考までに、この記事で概説されているウィンドウ スーパークラス メソッドを使用しています。特定の問題はWM_NOTIFY
、スーパークラスのベース コントロールからのメッセージを処理する場合 (つまり、カスタム描画用) に発生します。メッセージを親ウィンドウから反映するか、独自のウィンドウを親として設定する必要があります (CREATESTRUCT 内でWM_(NC)CREATE
ベースに渡されます)。クラス)。スーパークラスが 1 つしかない場合、このメソッドは正常に機能します。スーパークラスをスーパークラス化すると、問題が発生します。現在、3 つの WindowProc が同じ HWND で動作しています。WM_NOTIFY
メッセージ (または上記の親トリックから自分自身に送信される) は、常に最も外側の (最も派生した) WindowProc に移動します。それらが内部スーパークラス向けのメッセージ (基本メッセージは最初のスーパークラスに送られることになっている) なのか、外部スーパークラス向けのメッセージ (内部スーパークラスからのメッセージは外部スーパークラス向け) なのかを知る方法はありません)。これらのメッセージはすべて、同じコントロール ID を持つ同じ HWND から送信されるため、区別できません。継承の各レベルをカプセル化する新しいウィンドウを作成せずにこれを解決する方法はありますか?
テキストの壁について申し訳ありません。説明するのは難しい概念です。これが図です。
単一のスーパークラス:
SuperA::WindowProc() -> Base::WindowProc()---\ ^--------WM_NOTIFY(ベース)--------/
スーパークラスのスーパークラス:
SuperB::WindowProc() -> SuperA::WindowProc() -> Base::WindowProc()---\ ^--------WM_NOTIFY(ベース)--------+-----------------------/ ^--------WM_NOTIFY(A)-----------/
2 番目のケースのWM_NOTIFY
メッセージはすべて同じ HWND とコントロール ID からのものであるため、(Base からの) SuperA 向けのメッセージと (SuperA からの) SuperB 向けのメッセージを区別できません。何か案は?