本节书摘来自异步社区《Windows 程序设计(第3版)》一书中的第6章,第6.1节,作者:王艳平 , 张铮著,更多章节内容可以访问云栖社区“异步社区”公众号查看
第6章 框架中的窗口
前面讲述了类库框架管理应用程序的基本方式,以及它的执行顺序。本章将继续介绍如何在框架程序执行的过程中创建窗口和响应线程内发送给窗口的消息。
消息处理是Win32应用程序的灵魂,也是本章重点讨论的话题。本章最终要设计一个能够实现消息映射的基本构架。
6.1 CWnd类的引出
在类的体系结构中,框架程序提供了CWnd类来封装窗口的HWND句柄,即使用CWnd类来管理窗口的对象,这包括窗口的创建和销毁、窗口的一般行为和窗口所接受的消息。
为了使其他的类也有处理消息的机会,我们可以再封装一个类CCmdTarget作为消息处理的终点,也就是说所有从这个类派生的类都可以具有处理消息的能力。它和CWnd类都在_AFXWIN.H文件中,应该在定义CWinThread类之前定义它们。下面是这两个类的最基本成员。
class CCmdTarget : public CObject // 这个类的实现代码在CMDTARG.CPP文件中
{ // 请创建此文件,并添加上这样的代码:
DECLARE_DYNCREATE(CCmdTarget); // IMPLEMENT_DYNCREATE(CCmdTarget, CObject)
public: // CCmdTarget::CCmdTarget() { }
CCmdTarget();
};
class CWnd : public CCmdTarget
{
DECLARE_DYNCREATE(CWnd)
public:
CWnd();
virtual ~CWnd();
HWND m_hWnd;
operator HWND() const { return m_hWnd; }
HWND GetSafeHwnd() { return this == NULL ? NULL : m_hWnd; }
};
CWnd类的实现代码在WINCORE.CPP文件中,如下所示。
#include "_afxwin.h"
#include "winhand_.h"
CWnd::CWnd()
{
m_hWnd = NULL;
}
CWnd::~CWnd()
{
if(m_hWnd != NULL)
{
::DestroyWindow(m_hWnd);
}
}
IMPLEMENT_DYNCREATE(CWnd, CCmdTarget)
CWnd类是类库的核心,上面是它的基本框架。以后我们就在这个框架的基础上添加代码,最终实现一个便于用户使用,而又不失灵活性的窗口类。