WEB开发网
开发学院软件开发VC MFC程序员的WTL指南(2)ATL 界面类 阅读

MFC程序员的WTL指南(2)ATL 界面类

 2006-07-22 22:03:51 来源:WEB开发网   
核心提示: 一个基本的带有消息映射链的类通常是模板类,将派生类的类名作为模板的参数,MFC程序员的WTL指南(2)ATL 界面类(10),这样它就可以访问派生类中的成员,比如m_hWnd(CWindow类中的HWND成员),因为所有需要响应消息的类只需使用BEGIN_MSG_MAP宏就足够了,所以你可

一个基本的带有消息映射链的类通常是模板类,将派生类的类名作为模板的参数,这样它就可以访问派生类中的成员,比如m_hWnd(CWindow类中的HWND成员)。让我们来看一个嵌入类的例子,这个嵌入类通过响应WM_ERASEBKGND消息来画窗口的背景。

template <class T, COLORREF t_crBrushColor>
class CPaintBkgnd : public CMessageMap
{
public:
  CPaintBkgnd() { m_hbrBkgnd = CreateSolidBrush(t_crBrushColor); }
  ~CPaintBkgnd() { DeleteObject ( m_hbrBkgnd ); }
  BEGIN_MSG_MAP(CPaintBkgnd)
    MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd)
  END_MSG_MAP()
  LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
  {
    T*  pT = static_cast<T*>(this);
    HDC dc = (HDC) wParam;
    RECT rcClient;
    pT->GetClientRect ( &rcClient );
    FillRect ( dc, &rcClient, m_hbrBkgnd );
    return 1;  // we painted the background
  }
protected:
  HBRUSH m_hbrBkgnd;
};

让我们来研究一下这个新类。首先,CPaintBkgnd有两个模板参数:使用CPaintBkgnd的派生类的名字和用来画窗口背景的颜色。(t_ 前缀通常用来作为模板类的模板参数的前缀)CPaintBkgnd也是从CMessageMap派生的,这并不是必须的,因为所有需要响应消息的类只需使用BEGIN_MSG_MAP宏就足够了,所以你可能看到其他的一些嵌入类的例子代码,它们并不是从该基类派生的。

上一页  5 6 7 8 9 10 

Tags:MFC 程序员 WTL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接