1. 创建4个按钮

CRect rcCreate(0,0,80,80);

m_btTest1.Create(TEXT("Test1"),WS_CHILD|WS_VISIBLE,rcCreate,this,114);
m_btTest2.Create(TEXT("Test2"),WS_CHILD|WS_VISIBLE,rcCreate,this,112);
m_btTest3.Create(TEXT("Test3"),WS_CHILD|WS_VISIBLE,rcCreate,this,111);
m_btTest4.Create(TEXT("Test4"),WS_CHILD|WS_VISIBLE,rcCreate,this,113);

4个按钮位置是重叠的:先看到的是m_btTest4,但先响应的(点击有效)却是m_btTest1。

这是为什么呢?
原因就在于Create的时候,程序会指定每个控件的ZOrder值,先创建的ZOrder值最小,后面逐渐增大。
而关键点就在于: 绘制时,按照ZOrder值由小到大层层绘制,最后绘制排在最上层的控件(m_btTest4),而响应时先处理ZOrder最小的控件(m_btTest1)。

经测试,绘制和响应顺序跟最后面的参数IDC编号(111~114)无关,此编号只是让按钮的响应能够对号入座。
即点击了m_btTest1的控件,程序就会去执行ID=114的相关代码(可由OnCommand函数来截获消息)。

2. 假如之后添加了SetWindowPos函数,那又会如何呢?

m_btTest2.SetWindowPos(NULL,0,0,80,80,SWP_NOMOVE);
m_btTest3.SetWindowPos(NULL,0,0,80,80,SWP_NOMOVE);

此处要说明一点:SetWindowPos第一个参数传NULL,系统会将此控件ZOrder置顶,即ZOrder值变为最小,响应时最先处理;

所以当执行完m_btTest2.SetWindowPos之后,m_btTest2被放到了窗口顶层,此时ZOrder的顺序(由小到大)变为m_btTest2,m_btTest1,m_btTest3,m_btTest4。

而后m_btTest3又被放到了窗口顶层,而m_btTest2就会自动下移。此时的ZOrder顺序(由小到大)就会变为m_btTest3,m_btTest2,m_btTest1,m_btTest4。
到此为止,绘制时先看到的就是m_btTest4,而先响应的却变成了m_btTest3。

3. 那如果SetWindowPos函数最后一个参数再加上SWP_NOZORDER属性呢?比如将第2步的两行代码改为如下:

m_btTest2.SetWindowPos(NULL,0,0,80,80,SWP_NOMOVE|SWP_NOZORDER);
m_btTest3.SetWindowPos(NULL,0,0,80,80,SWP_NOMOVE);

SWP_NOZORDER,顾名思义,就是不改变ZOrder的顺序。那程序就会按照上一次修改控件ZOrder的代码来处理(绘制和响应顺序都是如此)

结果又变成这样的了(由小到大ZOrder排序):

m_btTest2.SetWindowPos(NULL,0,0,80,80,SWP_NOMOVE|SWP_NOZORDER);

//ZOrder:m_btTest1,m_btTest2,m_btTest3,m_btTest4。

m_btTest3.SetWindowPos(NULL,0,0,80,80,SWP_NOMOVE);

//ZOrder:m_btTest3,m_btTest1,m_btTest2,m_btTest4。

4. 还有一个函数也会影响ZOrder----DeferWindowPos(同时调整多个窗口(同一父窗口),比SetWindowPos效率高些)

此处uFlags含有SWP_NOZORDER,则DeferWindowPos函数不会改变相应控件的ZOrder值,即绘制和响应顺序都不改变。
否则如果不加SWP_NOZORDER属性,则跟SetWindowPos的作用是一样的
const UINT uFlags=SWP_NOACTIVATE|SWP_NOZORDER|SWP_NOCOPYBITS|SWP_NOSIZE;

DeferWindowPos(hDwp,m_btTest1,NULL,0,0,0,0,uFlags|SWP_NOMOVE);
DeferWindowPos(hDwp,m_btTest2,NULL,0,0,0,0,uFlags|SWP_NOMOVE);
DeferWindowPos(hDwp,m_btTest3,NULL,0,0,0,0,uFlags|SWP_NOMOVE);
DeferWindowPos(hDwp,m_btTest4,NULL,0,0,0,0,uFlags|SWP_NOMOVE);

总结:
控件在Create时就指定了ZOrder的顺序,先Create的控件ZOrder值最小(最先响应此控件);

反之,后面Create的控件ZOrder值逐渐增大(绘制时层层叠加,即ZOrder值最大的控件就会画到最上层,从而先被看到)。

而如果调用了SetWindowPos,且第一个参数为NULL,也不指定SWP_NOZORDER属性,则系统会将此控件置顶,此时ZOrder值变为最小,最先响应。

http://blog.csdn.net/icebergsnowfox/article/details/8986065#comments

MFC控件的绘制与响应顺序——ZOrder相关推荐

  1. MFC程序调用Windwos CMD命令打印图片 MFC 控件显示层次调整,即(叠放次序)和绘制遮挡置于底层顶层灰色

    MFC打印 打电话 ShellExecute 从您的计划中 print 操作 (特好用) ShellExecute(NULL,"print","c:\\test.png& ...

  2. MFC控件使用说明书

    VC++控件工具箱: 2 按钮(Button):用来接收用户的命令,应用程序在接收到用户命令后,通常需要进行一些后台工作.按钮可以响应单击或双击动作,在按钮接收到鼠标动作后,向其父窗口发送相应的控件通 ...

  3. 使用 SAP UI5 Smart Chart 控件轻松绘制十数种不同类型的专业图表试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 本专栏计划的文章数在 300 篇左右,到 2022年11月19日为止,目前已经更新了 149 篇,专栏完成度为 49.6%. 作者简介 Jerry ...

  4. MFC控件编程之复选框单选框分组框

    MFC控件编程之复选框单选框分组框 一丶分组框 分组框 英文叫做 GroubBox 添加了分组框主要就是分组.好看.不重点介绍 二丶单选框 英文: Raido Button 单选框需要注意的事项 1. ...

  5. VC控件自绘制三步曲

    实现自定义绘制的三步曲 既然您已经了解了绘制控件可用的各种选项(包括使用自定义绘制的好处),那么,让我们来看看实现一个自定义绘制控件需要的三个主要步骤. 执行一个 NM_CUSTOMDRAW 消息处理 ...

  6. 面向过程中模拟出面向对象,用c语言模拟出MFC控件,消息循环,“设计用户界面”

    大家好,今天给大家分享"怎样用c模拟出MFC控件 简单模拟出消息循环,按钮控件",面向过程中模拟出面向对象. 编程思路 首先用绘图库EasyX绘制窗口,窗口中绘制按钮,把按钮对象化 ...

  7. VS2010中如何实现自定义MFC控件

    本文简要讲解在VS2010中怎样实现自定义MFC控件的知识,以下是分步骤说明. 一.自定义一个空白控件  1.先创建一个MFC工程 NEW Project-->MFC-->MFC Appl ...

  8. MFC控件编程之组合框跟列表框

    MFC控件编程之组合框跟列表框 一丶简介 如果要使用组合框跟列表框.那么就要知道.组合框列表框是最核心的东西就是索引. 索引是从0开始的. 二丶组合框列表框常用的方法 AddString(字符串) 添 ...

  9. qt整个窗口上绘制矩形与在窗口的子控件上绘制矩形

    引言 创建一个基于QDialog的项目,自动生成ui文件,此时再添加新文件,创建一个基于QWidget的ui类,此类具有自定义标题栏,让该自定义类显示在窗口Dialog上,一开始具有红色的边框线,且四 ...

最新文章

  1. 浏览器是怎样工作的:渲染引擎,HTML解析
  2. 程序员请不要问“在吗?”
  3. linux c编程项目实例,Linux c编程实例_例子
  4. 从Web借鉴UI设计
  5. 构造方法注入和设值注入有什么区别?
  6. loj #6278. 数列分块入门 2
  7. java 获取路径_java 获取当前类的路径
  8. 表弟励志做程序员了,除了霸王我还能给他什么?
  9. Linux Linux程序练习九
  10. 基于任务的异步模式(TAP)
  11. exchange加mysql_Exchange 事务和Exchange 数据库回顾
  12. 大喇叭疫情防控广播解决方案
  13. Fastboot驱动及安装
  14. 万年历单片机c语言程序,51单片机c语言电子万年历完整程序.pdf
  15. 房产中介管理系统网站完整源码
  16. ElasticSearch 中文同义词实现
  17. 计算机桌面的图片要点开才可以看,在桌面上的图片文件都不显示具体图片了 只能打开这个图片才能看到是哪张图片 请问怎么处理?...
  18. Windows XP默认用户自动登录
  19. 小程序or网页前端CSS选择器
  20. python读书笔记—读写文件

热门文章

  1. 生僻字(通信工程版)
  2. 你以为没有CAD的前辈们画不出复杂的图纸?
  3. 机房运维很枯燥?来看看中国银行数据中心基础设施可视化运维管理
  4. docker run -it 如何退出_Docker学习笔记(4)容器的基本命令 1 - 你个小秃头
  5. 探讨计算机房的防火安全
  6. Python编程语言学习:for循环中常用方法经验技巧(利用enumerate函数对列表实现自带索引等)之详细攻略
  7. ML之相似度计算:图像数据、字符串数据等计算相似度常用的十种方法简介、代码实现
  8. MyBatis学习 之 二、SQL语句映射文件(1)resultMap
  9. poj1201Intervals(差分约束)
  10. Robot Framework 自动化框架 - 定制自己的library