在Windows系统里,一个窗口的属性分两个地方存放:一部分放在“窗口类”里头,如上所述的在注册窗口时指定;另一部分放在Windows Object本身,如:窗口的尺寸,窗口的位置(X,Y轴),窗口的Z轴顺序,窗口的状态(ACTIVE,MINIMIZED,MAXMIZED,RESTORED…),和其他窗口的关系(父窗口,子窗口…),窗口是否可以接收键盘或鼠标消息,等等。
   为了表达所有这些窗口的共性,MFC设计了一个窗口基类CWnd。有一点非常重要,那就是CWnd提供了一个标准而通用的MFC窗口过程,MFC下所有的窗口都使用这个窗口过程。至于通用的窗口过程却能为各个窗口实现不同的操作,那就是MFC消息映射机制的奥秘和作用了。这些,将在后面有关章节详细论述。
    CWnd提供了一系列成员函数,或者是对Win32相关函数的封装,或者是CWnd新设计的一些函数。这些函数大致如下。

(1)窗口创建函数
这里主要讨论函数Create和CreateEx。它们封装了Win32窗口创建函数::CreateWindowEx。Create的原型如下:
BOOL CWnd::Create(LPCTSTR lpszClassName,LPCTSTR lpszWindowName, DWORD dwStyle,
const RECT& rect,CWnd* pParentWnd, UINT nID,CCreateContext* pContext)
Create是一个虚拟函数,用来创建子窗口(不能创建桌面窗口和POP UP窗口)。CWnd的基类可以覆盖该函数,例如边框窗口类等覆盖了该函数以实现边框窗口的创建,视类则使用它来创建视窗口。
Create调用了成员函数CreateEx。CWnd::CreateEx的原型如下:
BOOL CWnd::CreateEx(DWORD dwExStyle, LPCTSTR lpszClassName,LPCTSTR lpszWindowName, DWORD dwStyle,
int x, int y, int nWidth, int nHeight,HWND hWndParent, HMENU nIDorHMenu, LPVOID lpParam)
CreateEx有11个参数,它将调用::CreateWindowEx完成窗口的创建,这11个参数对应地传递给::CreateWindowEx。参数指定了窗口扩展风格、“窗口类”、窗口名、窗口大小和位置、父窗口句柄、窗口菜单和窗口创建参数。
在CreateEx函数中还有一个虚函数PreCreateWindow。
窗口创建时发送WM_CREATE消息,消息参数lParam指向一个CreateStruct结构的变量,该结构有11个域,其描述见后面4.4.1节对窗口过程的分析,Windows使用和CreateEx参数一样的内容填充该变量。

(2)窗口创建过程

MFC中窗口创建主要涉及三个重要的函数,分别是CWnd::CreateEx(或者CWnd::Create)、AfxHookWindowCreate、AfxCbtFilterHook函数,首先是大概介绍下MFC的窗口创建过程,当CWnd::CreateEx被调用时,CWnd::CreateEx在调用API函数::CreateWindowEx创建窗口前会通过调用AfxHookWindowCreate安装一个名为_AfxCbtFilterHook的线程钩子,并将需要创建的窗口的CWnd指针保存到线程状态结构中,在API函数::CreateWindowEx真正创建窗口前AfxCbtFilterHook会被调用,AfxCbtFilterHook会执行子类化操作,把要创建的窗口的窗口过程子类化为线程状态结构中的窗口过程(AfxGetModuleState()->m_pfnAfxWndProc),即MFC的标准窗口过程,这样MFC的窗口(CWnd及其派生类)都可以通过消息映射机制接收和响应包括从创建开始的各种各样的消息。

1.CreateEx函数

2.AfxHookWindowCreate
AfxHookWindowCreate主要是Hook窗口的创建过程:主要是给当前现成安装一个名为_AfxCbtFilterHook的线程钩子,并讲需要创建的窗口的CWnd指针保存到线程状态结构

3.AfxCbtFilterHook
AfxCbtFilterHook会执行子类化操作,把要创建的窗口的窗口过程子类化为线程状态结构中的窗口过程 (AfxGetModuleState()->m_pfnAfxWndProc),即MFC的标准窗口过程,这样MFC的窗口(CWnd及其派生类)都可以接收和响应包括从创建开始的各种各样的消息

(3)窗口销毁函数
例如:
DestroyWindow函数 销毁窗口
PostNcDestroy( ),销毁窗口后调用,虚拟函数

(4)用于设定、获取、改变窗口属性的函数,例如:
SetWindowText(CString tiltle) 设置窗口标题
GetWindowText() 得到窗口标题
SetIcon(HICON hIcon, BOOL bBigIcon);设置窗口像标
GetIcon( BOOL bBigIcon ) ;得到窗口像标
GetDlgItem( int nID);得到窗口类指定ID的控制子窗口
GetDC(); 得到窗口的设备上下文
SetMenu(CMenu *pMenu); 设置窗口菜单
GetMenu();得到窗口菜单

(5)用于完成窗口动作的函数

用于更新窗口,滚动窗口,等等。一部分成员函数设计成或可重载(Overloaded)函数,或虚拟(Overridden)函数,或MFC消息处理函数。这些函数或者实现了一部分功能,或者仅仅是一个空函数。如:

* 有关消息发送的函数:
SendMessage( UINT message,WPARAM wParam = 0, LPARAM lParam = 0 ); 给窗口发送发送消息,立即调用方式
PostMessage(( UINT message,WPARAM wParam = 0, LPARAM lParam = 0 );给窗口发送消息,放进消息队列

* 有关改变窗口状态的函数
MoveWindow( LPCRECT lpRect, BOOL bRepaint = TRUE );移动窗口到指定位置
ShowWindow(BOOL );显示窗口,使之可见或不可见

* 实现MFC消息处理机制的函数:
virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam ); 窗口过程,虚拟函数
virtual BOOL OnCommand( WPARAM wParam, LPARAM lParam );处理命令消息
OnNotify               处理通知消息
DefWindowProc          消息的缺省处理
OnChildNotify          消息反射处理

* 消息处理函数:
OnCreate( LPCREATESTRUCT lpCreateStruct );MFC窗口消息处理函数,窗口创建时由MFC框架调用
OnClose();MFC窗口消息处理函数,窗口创建时由MFC框架调用

* 其他功能的函数
CWnd的导出类是类型更具体、功能更完善的窗口类,它们继承了CWnd的属性和方法,并提供了新的成员函数(消息处理函数、虚拟函数、等等)。

1. 在MFC下创建一个窗口对象

MFC下创建一个窗口对象分两步,首先创建MFC窗口对象,然后创建对应的Windows窗口。在内存使用上,MFC窗口对象可以在栈或者堆(使用new创建)中创建。具体表述如下:
* 创建MFC窗口对象。通过定义一个CWnd或其派生类的实例变量或者动态创建一个MFC窗口的实例,前者在栈空间创建一个MFC窗口对象,后者在堆空间创建一个MFC窗口对象。
* 调用相应的窗口创建函数,创建Windows窗口对象。

例如:在前面提到的AppWizard产生的源码中,有CMainFrame(派生于CMDIFrame(SDI)或者CMDIFrameWnd(MDI))类。它有两个成员变量定义如下:
CToolBar m_wndToolBar;
CStatusBar m_wndStatusBar;
当创建CMainFrame类对象时,上面两个MFC Object也被构造。
CMainFrame还有一个成员函数
OnCreate(LPCREATESTRUCT lpCreateStruct),
它的实现包含如下一段代码,调用CToolBar和CStatusBar的成员函数Create来创建上述两个MFC对象对应的工具栏HWND窗口和状态栏HWND窗口.

MFC架构之CWnd类相关推荐

  1. MFC架构之CWinThread类

    我们知道,Windows以事件驱动方式工作,每个WIN32应用程序都至少包含一个消息队列和一个消息泵.消息队列建立在操作系统提供的内存保留区中,消息泵不断搜寻消息队列,将取得的消息分发给应用程序的各个 ...

  2. MFC——CWnd类

    整理一下自己对于CWnd类的笔记. CWnd类的子类分为四种:Frame(框架).Dialog(对话框).View(视图).Control(控件) 函数 1.virtual BOOL Create(L ...

  3. MFC中的CAsyncSocket类实现网络通信

    近年来,利用Internet进行网际间通讯,在WWW浏 览.FTP.Gopher这些常规服务,以及在网络电话.多媒体会议等这些对实时性要求严格 的应用中成为研究的热点,而且已经是必需的了.Window ...

  4. CWnd类与Windows窗口的关系-3、CWnd类如何封装Windows窗口

    现在,可以比较深入地对CWnd类的封装机制进行剖析了. 在建立窗口句柄映射方面,CWnd使用了一个未公开的类CHandleMap进行管理.使用CWnd及派生类创建窗口时,建立了句柄映射,在窗口销毁时删 ...

  5. MFC知识点和常用类控件的使用

    一:消息 1.什么是消息? 消息是驱动windows系统运行的基础.从计算机的角度来看,消息就是一个整数. (1)一个无符号整数,是消息值: (2)消息附带的WPARAM和LPARAM类型的参数: ( ...

  6. MFC:总结篇 CDialog 类

    一.简介 CDialog 类是CWnd 类的子类 转载于:https://www.cnblogs.com/k5bg/p/11214226.html

  7. MFC中的CString类使用方法指南

    MFC中的CString类使用方法指南 原文出处:codeproject:CString Management [禾路:这是一篇比较老的资料了,但是对于MFC的程序设计很有帮助.我们在MFC中使用字符 ...

  8. 业务中台管理系统、业务中台架构、接口类服务、模型类服务、界面类服务、组件类服务、服务架构、中后台、服务审核、AI服务、位置服务、行业场景服务、企业中台、接口配置、模型配置、数据处理、结构化数据、数据源

    业务中台管理系统.业务中台架构.接口类服务.模型类服务.界面类服务.组件类服务.服务架构.中后台.服务审核.AI服务.位置服务.行业场景服务.企业中台.接口配置.模型配置.数据处理.结构化数据.数据源 ...

  9. MFC 教程【3_CObject类】

    CObject类 CObject是大多数MFC类的根类或基类.CObject类有很多有用的特性:对运行时类信息的支持,对动态创建的支持,对串行化的支持,对象诊断输出,等等.MFC从CObject派生出 ...

最新文章

  1. android jni jstring 转 char*
  2. 【NOIP2010】【P1317】乌龟棋
  3. 在CXF API和拦截器中添加Gzip压缩
  4. Spark学习(一) -- Spark安装及简介
  5. 云漫圈 | 容器技术docker应用场景解析
  6. generator 1【矩阵快速幂】
  7. 你知道线程池是如何退出程序的吗?
  8. windows 8.1 IE11 和 windows 10 Edge IE11 FlashPlayer 的安装与卸载
  9. sql server 流程控制
  10. 最常用的5个Python第三方库,你知道几个?第三个97%的程序员都在用!
  11. 关于latex第四级标题问题
  12. 【Java从0到架构师】学习记录
  13. essay--网络常用省略语大全(ZT)
  14. Android进程保活、拉活方案
  15. Excel如何一键删除重复行?Leo老师告诉你
  16. 【python】Flask之session使用
  17. 互联网早报 | 2月2日 星期二 | 小米之家完成江苏河南县级全覆盖;知乎正式启动首部科幻剧;盼达用车宣布暂停运营...
  18. 室友利用一把王者的时间就学会了【C语言结构体内存对齐】
  19. 首都师范 博弈论 6 5 1有限次的重复博弈
  20. css实现电子数字字体

热门文章

  1. Android 双击退出和单击回到桌面
  2. linux “<“ 会引发血案
  3. 一篇让你弄明白C语言指针传参和数组传参~
  4. oracle 11g duplicate database基于备份复制数据库(二)
  5. python中-是什么意思
  6. Python爬NBA球员数据
  7. Zero-Reference Deep Curve Estimation for Low-Light Image Enhancement
  8. 计算机作业我家乡的变化英语作文,我的变化英语作文3篇
  9. 如何写好软件项目的工作计划(一)
  10. 将Python代码打包成Windows 10的可执行文件