您的位置:首页 >> 编程开发 >> Visual C++ >> ATL/COM/ActiveX >> 正文
RSS
 

ATL窗口类源代码学习笔记

http://www.rdxx.com 06年12月24日 14:47 互联网 我要投稿

ATL 窗口类源代码学习笔记


本文是自己学习源代码的总结,在写作过程和察看代码寻找资料的时候,找到了些文章。

可参考:
WTL流程分析-初稿

ATL中的Thunk机制学习



1,CWindow
ATL有一个专门为窗口设计的基础类,可以做全部的窗口操作,这就是CWindow。它实际上就是对HWND操作的一个包装类,对几乎所有以HWND句柄为第一个参数的窗口API的进行了封装,例如:SetWindowText() 和 DestroyWindow()。CWindow类有一个公有成员m_hWnd,使你可以直接对窗口的句柄操作,CWindow还有一个操作符HWND,可以将CWindow对象传递给以HWND为参数的函数。
CWindow是一个普通的C++类。创建一个CWindow对象占用很少的资源,因为只有一个数据成员。

2,CWindowImpl继承树
在ATL类中对窗口过程的实现是CWindowImpl。CWindowImpl 含有所有窗口实现代码,例如:窗口类的注册,窗口的子类化,消息映射以及基本的WindowProc()函数。

我们先追根溯源,看看其继承过程:
一般来说,我们需要定义一个自己的窗口,首先就从CWindowImpl继承而来。

class CMyWnd : public CWindowImpl;

template
class ATL_NO_VTABLE CWindowImpl : public CWindowImplBaseT< TBase, TWinTraits >;

template
class ATL_NO_VTABLE CWindowImplBaseT : public CWindowImplRoot< TBase >;

template
class ATL_NO_VTABLE CWindowImplRoot : public TBase, public CMessageMap;

class ATL_NO_VTABLE CMessageMap
{
public:
virtual BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
LRESULT& lResult, DWORD dwMsgMapID) = 0;
};

2.1,CMessageMap
该类是一个纯虚类,主要目的是提供对windows消息的处理接口。凡是继承自该类的子类,均有处理windows消息的函数了。


2.2,CWindowImplRoot
template
class ATL_NO_VTABLE CWindowImplRoot : public TBase, public CMessageMap;

首先看看TBase,这家伙是什么呢?就是我们在定义自己的窗口类的时候,传入的CWindow
class CMyWnd : public CWindowImpl;
TBase说明了我们自己定义的窗口类的祖先类是什么了。所以我们是不是可以从CWindow继承一个类来,然后将此子类作为类型参数传过去呢?完全可以。有了这个TBase,我们在写程序的时候,可以由自己控制从什么基类继承。

CWindowImplRoot定义了这几个成员,都是公有的。

CWndProcThunk m_thunk;
const _ATL_MSG* m_pCurrentMsg;
DWORD m_dwState;

它的几个成员函数主要是针对m_pCurrentMsg处理的。如:
// Current message
const _ATL_MSG* GetCurrentMessage() const


// "handled" management for cracked handlers
BOOL IsMsgHandled() const
void SetMsgHandled(BOOL bHandled)

还有就是对消息的推进和反射的支持方面。
// Message forwarding and reflection support
LRESULT ForwardNotifications(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
LRESULT ReflectNotifications(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
static BOOL DefaultReflectionHandler(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult);

似乎对 m_dwState,m_thunk没有做什么处理。
关于CWndProcThunk,需要看:
ATL中的Thunk机制学习,
http://dev.csdn.net/develop/article/20/20532.shtm

2.3,CWindowImplBaseT
template
class ATL_NO_VTABLE CWindowImplBaseT : public CWindowImplRoot< TBase >;

看看CControlWinTraits这玩意。
/////////////////////////////////////////////////////////////////////////////
// CWinTraits - Defines various default values for a window

template
class CWinTraits
{
public:
static DWORD GetWndStyle(DWORD dwStyle)
共3页  1 2 3

 
 
标签: 源代码 , 学习笔记 , 窗口类 , ATL , 窗口 , 学习 , 代码 , 打印本文
 
 
  相关资讯
RSS
 
 
 
  热点搜索
 
 
 



Valid XHTML 1.0 Transitional
Copyright ©2005 - 2008 Rdxx.Com,All Rights Reserved
收藏本页
收藏本站