其实对于windows下的编程 无非是 创建窗口 和 消息循环。就这两个地方 你搞清楚了 就ok了。
在WTL的实现中,它的消息映射宏写的比较简单,如果你的窗口类(包括控件)里面
写下来DECLARE_WND_SUPERCLASS(_T(“XXX"), CListViewCtrl::GetWndClassName())类似的语句的话
其实就是 定义了一个窗口信息,一个定义窗口信息的宏,如果你不写这一句 也没事,父类 你所继承的
CWindowImpl类 这个类 也有这个宏,这个是WTL库自己写的。
当你create 窗口之前, 一定会去注册窗口 从而指定回调的,WTL用的是这句话T::GetWndClassInfo().Register(&m_pfnSuperWindowProc);
这句话 T代表你的窗口 或者空间类,一看就知道是注册窗口, 在WTL中 注册窗口指定的回调函数是
StartWindowProc 这个函数最终会执行 WindowProc函数的 ProcessWindowMessage; 这个地方的细节 涉及到
thunk技术。这个的具体实现 可以看 atlwin.h的
“
template <class TBase, class TWinTraits>
LRESULT CALLBACK CWindowImplBaseT< TBase, TWinTraits >::StartWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
”
这里面可以查到 具体实现。
这个ProcessWindowMessage 函数正是 你的窗口(控件)类的 消息映射宏, 就是个switch语句
跟win32 那个原始程序的switch 语句差别不大。 可以说一样滴。
于是创建窗口 ,显示窗口基本上就是这个套路了, 让控件得以显示 ,无非就是通过DDX去绑定,这个时候 控件是拖上去的, 还一种就是你去直接create。 如果是DDX的 实际上调用的是 Subclasswindow,这个函数说白了就是给控件一个窗口过程函数而已。
大道不过三两行,说穿不值一文钱。 WTL的源码比MFC的要简洁一些。 虽然UI封装的少,但是没有大碍,如果WTL用时间长了 你会觉得 比MFC更舒服,实际上MFC提供的文档视图结构 基本上 大部分人 都没用到,很多做界面开发的 更本不需要这个。