1. 安装WTL into VS 2008
我是VS2008+SP1
1, 下载WTL80,然后解压缩。
2, 将setup80.js复制为setup90.js,编辑setup90.js,将"8.0"全部替换为"9.0"后保存。
3, 运行,c:\>wscript setup90.js,会看到安装成功的MessageBox。
4, 打末VS2008,选择Tools->Options->Projects and Solutions->VC++ Directories,在include中将c:\wtl80\include加入。
----
现在就可以建立WTL的工程了~
2. ATL::CString和WTL::CString的冲突问题
#define _WTL_NO_CSTRING
定义这个宏,可以解决冲突,典型的处理办法,就是在stdafx.h里面定义。
3. RegisterWindowMessage(L"TaskbarCreated");
当explorer重启后,托盘区的Tray可以在这个消息响应中Show出来。
4. MESSAGE_HANDLER(WM_PAINT, OnPaint)... 和 MSG_WM_PAINT(OnPaint) 没多大区别
记住,它们的参数都是不可用的,要自己创建 CPaintDC dc(*this);
5. WTL中new Window如何delete?
重载OnFinalMessage,在
void CXXXWnd::OnFinalMessage(HWND)
{
delete this;
}如果是一个FrameWindow,加了OnDestroy消息映射,那么bHandled要设置为TRUE。
6. 使用ATL Thunk
typedef void (*PFUNC)(void*);
class MyClass
{
public:
CStdCallThunk _thunk;
const char* _name;
MyClass(const char* name) :_name(name) {}
~MyClass() {}
static void Function(void* pVoid)
{
MyClass* pThis = (MyClass*)pVoid;
pThis->Print();
}
void Print()
{
cout<<"Hello Thunk " <<this->_name <<endl;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
MyClass mc1("Mike");
MyClass mc2("Lucy");
mc1._thunk.Init((DWORD_PTR)&MyClass::Function, &mc1);
mc2._thunk.Init((DWORD_PTR)&MyClass::Function, &mc2);
PFUNC p1 = (PFUNC)mc1._thunk.GetCodeAddress();
PFUNC p2 = (PFUNC)mc2._thunk.GetCodeAddress();
p2((void*)0); // Ladies first
p1((void*)0);
return 0;
}CDynamicStdCallThunk是在X86和AMD平台上面的定义,最后被typedef成CStdCallThunk,而最终使用的是_stdcallthunk,而ATL提供了多种平台的_stdcallthunk实现,有MIPS的,有ARM的。。。而且我只看得懂X86的。
VS200*以前的ATL实现,是栈对象实现,现在都是堆对象了。如果你确定你的代码只在X86上面跑,你确实可以直接用_stdcallthunk。
代码这样改改即可:
class MyClass
{
public:
_stdcallthunk _thunk;
const char* _name;
... ...
PFUNC p1 = (PFUNC)&mc1._thunk;
PFUNC p2 = (PFUNC)&mc2._thunk;
7. vista系统的毛玻璃效果