|
|||||
|
|||||
|
|||||||
ATLにはチェインという仕組みがあります。これは、メッセージマップを別のメッセージマップへ繋ぐ仕組みです。
なぜこのような仕組みが必要なのかを以下のプログラム片を例に説明します。
上記のプログラム片は、ウィンドウを終了するハンドラだけを持った基底クラス( CBaseWindow)
と、そのクラスから派生したクラス(CMessageWindow)の定義です。
派生クラスでは、左マウスボタンを押した時に "Hello!" というメッセージボックスを
表示するようにしています。ここで、派生クラスである CMessageWindowクラスからウィンドウを作成し表示したとしても、
このウィンドウは終了できません。
(ウィンドウは消えますがプロセスが残ったままです。)
つまり、このウィンドウへWM_DESTROYメッセージが送られても、
自動的に基底クラスへは送られず、基底クラスのOnDestroy()は呼び出されないのです。この問題を解決するのがチェインという仕組みです。つまり、派生クラスのメッセージマップと 基底クラスのメッセージマップを繋ぎ、派生クラスでメッセージハンドラが見つからない場合は 基底クラスのメッセージマップを検索するように変更するのです。これは、基底クラスへのチェインと 呼ばれます。基底クラスへのチェインを実現するためには、派生クラスのメッセージマップに CHAIN_MSG_MAPマクロを追加します。
このように、ATLでは、派生クラスに該当するメッセージハンドラが無いとき、 メッセージが自動的に基底クラスへ送られることはありません。 これは、ATLのアーキテクチャが多重継承を基盤にしているからです。 多重継承では基底クラスが複数存在するため、どの基底クラスのメッセージマップに メッセージを送るかを、チェインによって明示的に指定しなければならないのです。 ATLは CHAIN_MSG_MAP()を含め、次のようなチェインマクロを用意しています。
|
|||||||