MFC控件的绘制与响应顺序——ZOrder
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相关推荐
- MFC程序调用Windwos CMD命令打印图片 MFC 控件显示层次调整,即(叠放次序)和绘制遮挡置于底层顶层灰色
MFC打印 打电话 ShellExecute 从您的计划中 print 操作 (特好用) ShellExecute(NULL,"print","c:\\test.png& ...
- MFC控件使用说明书
VC++控件工具箱: 2 按钮(Button):用来接收用户的命令,应用程序在接收到用户命令后,通常需要进行一些后台工作.按钮可以响应单击或双击动作,在按钮接收到鼠标动作后,向其父窗口发送相应的控件通 ...
- 使用 SAP UI5 Smart Chart 控件轻松绘制十数种不同类型的专业图表试读版
一套适合 SAP UI5 初学者循序渐进的学习教程 本专栏计划的文章数在 300 篇左右,到 2022年11月19日为止,目前已经更新了 149 篇,专栏完成度为 49.6%. 作者简介 Jerry ...
- MFC控件编程之复选框单选框分组框
MFC控件编程之复选框单选框分组框 一丶分组框 分组框 英文叫做 GroubBox 添加了分组框主要就是分组.好看.不重点介绍 二丶单选框 英文: Raido Button 单选框需要注意的事项 1. ...
- VC控件自绘制三步曲
实现自定义绘制的三步曲 既然您已经了解了绘制控件可用的各种选项(包括使用自定义绘制的好处),那么,让我们来看看实现一个自定义绘制控件需要的三个主要步骤. 执行一个 NM_CUSTOMDRAW 消息处理 ...
- 面向过程中模拟出面向对象,用c语言模拟出MFC控件,消息循环,“设计用户界面”
大家好,今天给大家分享"怎样用c模拟出MFC控件 简单模拟出消息循环,按钮控件",面向过程中模拟出面向对象. 编程思路 首先用绘图库EasyX绘制窗口,窗口中绘制按钮,把按钮对象化 ...
- VS2010中如何实现自定义MFC控件
本文简要讲解在VS2010中怎样实现自定义MFC控件的知识,以下是分步骤说明. 一.自定义一个空白控件 1.先创建一个MFC工程 NEW Project-->MFC-->MFC Appl ...
- MFC控件编程之组合框跟列表框
MFC控件编程之组合框跟列表框 一丶简介 如果要使用组合框跟列表框.那么就要知道.组合框列表框是最核心的东西就是索引. 索引是从0开始的. 二丶组合框列表框常用的方法 AddString(字符串) 添 ...
- qt整个窗口上绘制矩形与在窗口的子控件上绘制矩形
引言 创建一个基于QDialog的项目,自动生成ui文件,此时再添加新文件,创建一个基于QWidget的ui类,此类具有自定义标题栏,让该自定义类显示在窗口Dialog上,一开始具有红色的边框线,且四 ...
最新文章
- 浏览器是怎样工作的:渲染引擎,HTML解析
- 程序员请不要问“在吗?”
- linux c编程项目实例,Linux c编程实例_例子
- 从Web借鉴UI设计
- 构造方法注入和设值注入有什么区别?
- loj #6278. 数列分块入门 2
- java 获取路径_java 获取当前类的路径
- 表弟励志做程序员了,除了霸王我还能给他什么?
- Linux Linux程序练习九
- 基于任务的异步模式(TAP)
- exchange加mysql_Exchange 事务和Exchange 数据库回顾
- 大喇叭疫情防控广播解决方案
- Fastboot驱动及安装
- 万年历单片机c语言程序,51单片机c语言电子万年历完整程序.pdf
- 房产中介管理系统网站完整源码
- ElasticSearch 中文同义词实现
- 计算机桌面的图片要点开才可以看,在桌面上的图片文件都不显示具体图片了 只能打开这个图片才能看到是哪张图片 请问怎么处理?...
- Windows XP默认用户自动登录
- 小程序or网页前端CSS选择器
- python读书笔记—读写文件
热门文章
- 生僻字(通信工程版)
- 你以为没有CAD的前辈们画不出复杂的图纸?
- 机房运维很枯燥?来看看中国银行数据中心基础设施可视化运维管理
- docker run -it 如何退出_Docker学习笔记(4)容器的基本命令 1 - 你个小秃头
- 探讨计算机房的防火安全
- Python编程语言学习:for循环中常用方法经验技巧(利用enumerate函数对列表实现自带索引等)之详细攻略
- ML之相似度计算:图像数据、字符串数据等计算相似度常用的十种方法简介、代码实现
- MyBatis学习 之 二、SQL语句映射文件(1)resultMap
- poj1201Intervals(差分约束)
- Robot Framework 自动化框架 - 定制自己的library