WEB开发网
开发学院软件开发VC ATL的GUI程序设计(4)ATL的窗口类 阅读

ATL的GUI程序设计(4)ATL的窗口类

 2006-04-11 22:54:24 来源:WEB开发网   
核心提示: CWindow类的内容我就不列出了,因为它同样十分冗长,ATL的GUI程序设计(4)ATL的窗口类(4),大家可以参看atlwin.h的相关内容,在这里我仅对其中的几个地方进行解说:它只有一个非static的成员变量,如果你参阅了atlwin.h中它们的定义,你就会发现其实它们会组成一个P

CWindow类的内容我就不列出了,因为它同样十分冗长,大家可以参看atlwin.h的相关内容。在这里我仅对其中的几个地方进行解说:

  • 它只有一个非static的成员变量,也就是窗口的句柄m_hWnd。这样做的好处是使得CWindow类的对象占用最小的资源,同时给程序员提供最大的自由度。与MFC的CWnd类相比,CWindow的优点体现得尤为明显。CWnd之中还存在着一些MFC Framework要用到的东西,比如RTTI信息等等。此外,MFC内部还会为每个窗口句柄维护一个相对应的CWnd对象,形成一个对象链,这样程序员可以通过GetDlgItem获取CWnd类的指针,但是这同时也为系统增加了很多额外的负担。
  • CWindow提供了对operator=操作符的重载,这样程序员可以直接将一个HWND赋给一个CWindow对象。
  • CWindow::Attach/CWindow::Detach提供了CWindow对象与HWND的绑定/解除绑定功能。
  • CWindow提供了对operator HWND类型转换操作符的重载,这样在用到HWND类型变量的时候,可以直接使用CWindow对象来代替。

有了CWindow类之后,如果你需要对窗口进行更多的操作,就可以对其进行继承,例如CButton、CListBox、CEdit等等。这样一来,代码的复用性就大大提高了。

窗口事件响应的封装

窗口事件响应的封装,也就是这个类如何对窗口消息进行分流。你应该还记得,CHelloATLWnd类是通过BEGIN_MSG_MAP、END_MSG_MAP和MESSAGE_HANDLER宏实现的。如果你参阅了atlwin.h中它们的定义,你就会发现其实它们会组成一个ProcessWindowMessage函数。是的,CMessageMap就是由这个函数组成的:

/////////////////////////////////////////////////////////////////////////////
// CMessageMap - abstract class that provides an interface for message maps
class ATL_NO_VTABLE CMessageMap
{
public:
  virtual BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
    LRESULT& lResult, DWORD dwMsgMapID) = 0;
};

上一页  1 2 3 4 5 6 7 8  下一页

Tags:ATL GUI 程序设计

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