さて、昨日の続き。
やっぱり、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 の実装を見直してくれると助かるんだけど。
ロッタは検索したかもー。
さてここへ宣言したいです。