はじめまして。
WindowsXP Pro / VC++ 6.0 SP6
ATL 3.0 / WTL 7.5
この環境で下記のようなコードを書くと、BEGIN_MSG_MAP_EX(...) ~ END_MSG_MAP()の
後に書いてあるOnPaintやOnDestroyといったCTestWndのメンバ関数が、クラスビューでは
なぜかグローバルとして表示されてしまうという問題が発生しています。
atlcrack.hの中で定義されているマクロが認識されていないせいだと思うのですが
(問題のコードの上にatlcrack.hの内容を丸ごとペーストすると、OnPaintやOnDestroyが
CTestWndのメンバ関数として正しく表示されるので)
これを正しく表示させる方法はないのでしょうか?
[ツール]→[オプション]→[ディレクトリ]でディレクトリの順番を入れ替えたりして
みましたが変化はありませんでした。
【問題のコード】
class CTestWnd : public CWindowImpl<CTestWnd>
{
BEGIN_MSG_MAP_EX(CTestWnd)
MSG_WM_PAINT(OnPaint)
MSG_WM_DESTROY(OnDestroy)
END_MSG_MAP()
void OnPaint(HDC hdc)
{
// 中身省略
}
void OnDestroy()
{
// 中身省略
}
};
【念のためstdafx.hの内容も載せておきます】
// Change these values to use different versions
#define WINVER 0x0400
//#define _WIN32_WINNT 0x0400
#define _WIN32_IE 0x0400
#define _RICHEDIT_VER 0x0100
#include <atlbase.h>
#include <atlapp.h>
extern CAppModule _Module;
#include <atlwin.h>
#include <atlframe.h>
#include <atlctrls.h>
#include <atldlgs.h>
#include <atlctrlw.h>
#include <atlcrack.h>
VS2005ですが、私もこの現象によりIntellisenseが使えなくなるので不便でしたが
参考になりそうな対処法が下記のサイトにあります。
http://haitaoli.blogspot.com/2005/11/wtl-breaks-vs-2005-intellisense.html
回答ありがとうございます。
教えていただいたサイトの対処法を試してみましたが、VC++ 6.0では
効果がありませんでした。
Googleで「WTL Intellisense」で検索してみたら、同様の問題点を指摘している人が
多くいることがわかったので、もう少し調べてみることにします。
VS2005ですとatlwin.hで
#define END_MSG_MAP() \
の定義をatlcrack.hへコピーして
#define END_MSG_MAP_EX() \
という定義を追加し、BEGIN_MSG_MAP_EXの終わりを
END_MSG_MAPでなくEND_MSG_MAP_EXにすることで
とりあえずIntellisenesが解釈するようになりました
下記のサイトに書いてある方法で上手くいきました。
ありがとうございました。
気まぐれソフトハウス » VC++6.0でWTLを使った時にClassViewがバグる
http://wind-master.dip.jp/soft-info/item/57