《Windows 程序设计(第3版)》——第6章 框架中的窗口 6.1 CWnd类的引出

第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类是类库的核心,上面是它的基本框架。以后我们就在这个框架的基础上添加代码,最终实现一个便于用户使用,而又不失灵活性的窗口类。

时间: 2024-09-25 10:25:27

《Windows 程序设计(第3版)》——第6章 框架中的窗口 6.1 CWnd类的引出的相关文章

《Windows 程序设计(第3版)》——导读

前言 许多人在刚开始接触Windows编程时,或从VB开始,或从MFC开始,这使得大家虽然写出了程序,但自己都不知道程序是如何运行的,从而造成写程序"容易"修改难.设计程序"容易"维护难的状况.本书是为Windows程序设计入门的初学者和想从根本上提高自己编程水平的爱好者编写的,试图为他们提供一条由入门到深入.由简单到复杂的编程设计之路. API函数是Windows系统提供给应用程序的编程接口,任何用户应用程序必须运行在API函数之上.直接使用API编程是了解操作系

windows程序设计(第五版)第22章的drum.c中的问题?

问题描述 windows程序设计(第五版)第22章的drum.c中的问题? windows程序设计(第五版)第22章的drum.c中的这段,没弄明白作者的想法, " if (x >= 0 && x < 32 && y >= 0 && y < NUM_PERC) { if (message == WM_LBUTTONDOWN) drum.dwSeqPerc[y] ^= (1 << x) ;//这里不明白,作者为什么

学习方向-小弟最近学了【Windows程序设计(第五版)】但不知道学了有什么作用。

问题描述 小弟最近学了[Windows程序设计(第五版)]但不知道学了有什么作用. 小弟现在大二学生,物联网专业的专科.以后准备从事软件这个行业(具体什么我也不懂,反正即使IT啦),大一时学了C/C++的最最基本的语法,其他什么都不会,就像什么数据结构,算法,操作系统啊什么的都不会,现在都大二了,时间不多了,(专科都是两年半)想自己学点东西,但是不知道该学什么.就像那无头苍蝇,上几天听说了[Windows程序设计(第五版)] 就去图书馆借来看看了(暂时还没钱买,100多呢!),学的还行,但是不知

键盘输入-关于windows程序设计第六章的最后一个范例……

问题描述 关于windows程序设计第六章的最后一个范例-- 在第六章(讲键盘)的里面最后有一个typer程序的代码,我能看懂它们但有些不理解为什么作者要这么做------在此贴上消息处理部分的代码恳请了解API的人帮忙解答一下--这里刚入门现在已经完全昏了 LRESULT CALLBACK WndProc (HWND hwnd UINT message WPARAM wParam LPARAM lParam){ static DWORD dwCharSet = DEFAULT_CHARSET

《Windows 程序设计(第3版)》——6.7 【实例】窗口查看器

6.7 [实例]窗口查看器 本节将用具体实例让你切身体会对象化程序设计方式,从而感受框架程序提供的近乎完美的程序接口. 程序的主要功能是显示鼠标所指向窗口的一些信息,如标题.窗口类名和应用程序名称等.其运行效果如图6.7所示.在主窗口左上角矩形框中按下鼠标,光标将变成图中带十字的黑圆圈形状.按住鼠标左键移动这个黑圆圈,窗口查看器会显示出黑圆圈下窗口的属性信息.例子程序在配套光盘的06WinLooker工程下.最好先运行此程序熟悉一下它的功能. 例子的创建过程是:先创建一个空的Win32 Appl

《Windows 程序设计(第3版)》——6.5 消息处理

6.5 消息处理 6.5.1 使用消息映射宏 Windows统一用WPARAM和LPARAM两个参数来描述消息的附加信息,例如WM_ CREATE消息的LPARAM参数是指向CREATESTRUCT结构的指针,WPARAM参数没有被使用:WM_LBUTTONDOWN消息的WPARAM参数指定了各虚拟键的状态(UINT类型),LPARAM参数指定了鼠标的坐标位置(POINT类型).很明显,消息附加参数的类型并不是完全相同的,如果CWnd类也定义一种统一形式的成员来处理所有的消息,将会丧失消息映射的

《Windows 程序设计(第3版)》——6.3 创建窗口

6.3 创建窗口 6.3.1 窗口函数 Windows为每个窗口都提供了默认的消息处理函数,自定义类的窗口的默认消息处理函数是DefWindowProc,各子窗口控件(见7.1节)的类名是Windows预定义的,其窗口函数自然由Windows提供. 我们的框架也提供了一个通用的消息处理函数AfxWndProc.为了响应窗口消息,必须让Windows把窗口的消息处理函数的地址全设为AfxWndProc,在处理消息时由我们自己决定是否调用默认的消息处理函数.改变窗口消息处理函数地址最简单的办法是使用

《Windows 程序设计(第3版)》——6.2 窗口句柄映射

6.2 窗口句柄映射 6.2.1 向CWnd对象分发消息 一个线程中可能(很可能)有不止一个窗口,因此也会有多个对应的CWnd对象.每个CWnd对象只响应发送给本窗口的消息,那么,如何将线程接受到的消息交给不同的CWnd对象呢?本节就着重解决这个问题. Windows是通过窗口函数将消息发送给应用程序的.窗口函数的第一个参数hWnd指示了接收此消息的窗口,我们只能通过窗口句柄hWnd的值找到对应的CWnd对象的地址.这就要求: (1)只安排一个窗口函数.窗口函数的作用仅仅是找到处理该消息的CWn

《Windows 程序设计(第3版)》——6.4 消息映射

6.4 消息映射 6.4.1 消息映射表直接在窗口函数WndProc中处理消息很烦琐.我们希望能够直接使用类的成员函数响应感兴趣的消息.比如现在有一个CMyWnd类,当处理某个消息的时候,只要在这个类中添加一个对应的成员函数就行了,如图6.4所示. 在CMyWnd类中,OnCreate函数响应的是WM_CREATE消息,即当窗口接收到WM_CREATE消息以后,想让框架程序自动调用OnCreate函数.函数的名称是任意的,这里命名为OnCreate只是为了有意义.OnPaint和OnDestro