意地でもBEGIN_MSG_MAPを使う方法

さて、昨日の続き。
やっぱり、VisualStudioのクラスビューとかインテリセンス機能が使えないのは辛い。
ヘッダからCPPの関数宣言位置に移動するのに検索使ってるし(–;
なわけで、色々な方法を考えた挙げ句、こうなりました


AtlCrackSupport.h を作って、中身を

/*!
* @file
* @brief atlcrack.h ファイルサポート
* @author Mikihiro Hayashi
* @date 2005/12/28
*/
// BEGIN_MSG_MAP_EX または ATL7.0 以上で使用できるようになった
// WTLのMSG_WM_CREATEなど atlcrack.h に宣言されているマクロを
// ALT_MSG_MAP(x) でも使用しようとすると、CWindowImplRoot の
// SetMsgHandled および IsMsgHandled の実装が厳密過ぎて実行時に
// NULL参照でエラーが発生する。
// この部分だけなら、BEGIN_MSG_MAP_EXを使うようにすれば解決できる
// が、VisualStudioのクラスビューやオブジェクトブラウザにクラスが
// 表示されなくなってしまうという問題が別に発生(=インテリセンスが機能しない)
// するため、SetMsgHandledとIsMsgHandledだけを宣言するマクロ
//
// 簡単な例(このままではコンパイルできません)
// class CMainWnd :
//   public CWindowImpl
// {
//   DECLARE_CRACKED_MSG_MAP_HANDLER
//
//   BEGIN_MSG_MAP(CMainWnd)
//   ALT_MSG_MAP(1)
//     MSG_WM_LBUTTONDOWN(ALT1_OnLButtonDown)
//   END_MSG_MAP()
// }
BOOL m_bMsgHandled; \
/* "handled" management for cracked handlers */ \
BOOL IsMsgHandled() const \
{ \
return m_bMsgHandled; \
} \
void SetMsgHandled(BOOL bHandled) \
{ \
m_bMsgHandled = bHandled; \
}


とする。
で、これを CContainedWindowT を使いかつ ALT_MSG_MAP を使うヘッダファイルにインクルードしてBEGIN_MSG_MAPの前にDECLARE_CRACKED_MSG_MAP_HANDLERを宣言する。

class CMainWnd : public CWindow
{
~省略~
DECLARE_CRACKED_MSG_MAP_HANDLER
BEGIN_MSG_MAP(CMainWnd)
ALT_MSG_MAP(1)
MSG_WM_LBUTTON(ALT1_OnLButtonDown)
END_MSG_MAP()
~省略~
}


こんな感じで使える。
DECLARE_CRACKED_MSG_MAP_HANDLER マクロで、クラス内に SetMsgHandled と IsMsgHandled 関数を宣言してる。
1つのインクルードと1行の追加でインテリセンスが使えるようになるから、まずまずかな。
本当は CWindowImplRoot の実装を見直してくれると助かるんだけど。

「意地でもBEGIN_MSG_MAPを使う方法」への1件のフィードバック

  1. ロッタは検索したかもー。
    さてここへ宣言したいです。

コメントを残す

メールアドレスが公開されることはありません。