关于MFC资源句柄、ID和对象
一、资源、句柄和ID
资源:
MFC中的资源,如菜单、对话框、图标、工具条、对话框等,是windows创建的,并占用堆内存。windows在创建这些资源时候会给每个资源分配一个句柄,用来标记这些资源,通过API或函数,可以通过句柄访问这些资源。资源的特点是,它存储在堆内存中。所以创建后就不容易被自动销毁。如果要销毁它,就得手动销毁。
句柄:
所有句柄是windows自动给资源分配的一个标识,用于方便进程访问资源,它本质是一个unsigned int,即无符号32未整数。
只要主观上能知道windows可以通过句柄访问到资源就可以了。
往深处讲句柄是一个数据结构(struct),第一项保存着资源的逻辑地址,这个逻辑地址通过一个页表(映射表)映射到资源的实际地址。(这涉及到cpu与内存相互访问的知识,从这里也可以看出句柄和资源是相互关联映射的,可以将句柄看作是指针的指针)
ID:
句柄是OS分配给资源的标识,方便os访问资源,而ID是用户分配给资源的标识,方便用户访问通过函数资源()。
二、对象:
对象是类实例化的产物,os会为对象分配内存,但有局部对象和全局对象,它们的生存期也不一样。
三、资源与对象的关系:
对于窗口,对话框,菜单等资源,它和CWnd、CDialog、CMenu对象不是同一个东西。后者可以操作前者(创建,删除等),而前者是我们实实在在看到的那个界面。
二者要发生关系必须要发生关联。例如CWnd有个成员变量m_hWnd用来保存资源的句柄,这样一个对象就与资源本身发生了关联。
当资源和对象发生联系后,对象析构后,资源也会被销毁。如果不想销毁资源,可以解构二者之间的关系
Attach(HWND)//将资源句柄与对象关联
Detach()//解构句柄与对象的关联
另外当对象本身也可以通过资源的ID加载资源达到关联资源的效果(前提是这些资源模板已经创建):
LoadFrame(ID)//加载主框架
LoadMenu(ID)//创建菜单
LoadToolbar(ID)//创建工具条
CDialog::Create(ID)//创建非模态对话框
当资源还不存在时,也可以创建关联
关于MFC资源句柄、ID和对象的更多相关文章
- MFC中获取各个窗口之间的句柄或者指针对象的方法
MFC在非常多的对话框操作中,我们常常要用到在一个对话框中调用还有一个对话框的函数或变量.能够用例如以下方法来解决. HWND hWnd=::FindWindow(NULL,_T("S ...
- (转)MFC中获得各个类的指针/句柄 ID的总结
http://www.cnblogs.com/ylhome/archive/2009/10/06/1578478.html 一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard ...
- AFX_MANAGE_STATE(AfxGetStaticModuleState())DLL导出函数包含MFC资源
AFX_MANAGE_STATE(AfxGetStaticModuleState()) 先看一个例子: .创建一个动态链接到MFC DLL的规则DLL,其内部包含一个对话框资源.指定该对话框ID如下: ...
- MFC资源冲突解决方法
AFX_MANAGE_STATE(AfxGetStaticModuleState()) 先看一个例子: 1.创建一个动态链接到MFC DLL的规则DLL,其内部包含一个对话框资源.指定该对话框ID ...
- MFC绘图相关GDI工具对象和函数介绍
在利用MFC进行界面编程时,除了需要熟悉各种类型控件的操作外,还会经常遇到图形绘制和显示的问题,比如时频分析界面.图像处理界面等.处理这些软件界面开发问题时,不可避免地需要用到一系列GDI工具对象和相 ...
- Mfc资源消息的响应机制
Mfc消息的响应机制 Mfc中有很多资源,如图标资源,菜单资源,工具栏资源等等:那么,资源是如何进行消息响应和消息映射的呢? 它们的流程是: 某种资源——对应的ID号——消息映射——响应函数的声明与实 ...
- 对比MFC资源文件谈谈WPF布局方式
对比MFC资源文件谈谈WPF布局方式 MFC方式 对于传统的MFC基于UI的应用程序设计通常分两步走,首先是设计UI,使用的是RC文件,然后是代码文件,对RC文件进行操作,如下面Figure 1 的基 ...
- 获取spring的IOC核心容器,并根据id获取对象
public class Client { /** * 获取spring的IOC核心容器,并根据id获取对象 * ApplicationContext的三个常用实现类 * classPathXmlAp ...
- Android 自己主动化測试(3)<monkeyrunner> 依据ID查找对象&touch&type (python)
我在之前的两篇文章中用java来实现过 Android 自己主动化測试(1)怎样安装和卸载一个应用(java).Android 自己主动化測试(2)依据ID查找对象(java). 可是本质上都是用mo ...
随机推荐
- 恢复不小心误覆盖的代码文件 (sublime编辑器)
最新写了一个python脚本,另外在终端上运行一个shell脚本循环记录一些性能.耗时参数.取出记录的数据,使用python pyplot强大的绘图功能来可视化,易用程度仅次于matlab. 本次文件 ...
- 中国版Office 365混合部署功能
中国版Office 365混合部署功能已经正式上线了(原计划6月份推出),虽然支持的类型不如国际版的Office 365全面,但这也标志了该功能与之前相比,已经迈出了重要一步.目前中国版Office ...
- windows db2 添加用户权限
http://www.csharpwin.com/csharpspace/12086r9069.shtml 在windows上DB2数据库安装的时候会创建一个系统管理员 的账户,默认为DB2ADMIN ...
- CentOS 6.4 yum安装LAMP环境
一.制作连外网的yum源文件 1. centOS安装完成时是默认存在的,不需要做任何操作,可以直接使用yum 命令进行操作, 默认是在 /etc/yum.repos.d/目录下的 2. 如果你因为制 ...
- 公告板shader
Shader "Custom/LightPoint" { Properties { _MainTex ("Main Tex", 2D) = "whit ...
- 如何通过Google访问外网
修改host: https://laod.cn/hosts/2017-google-hosts.html google中文: https://www.google.com.hk/ 弄好前两项后,可以再 ...
- jquery 通过属性选择器获取input不为disabled的对象
$("input[id^='input_001']:not(:disabled)").each(function(){ console.log(this); });
- SQL SERVER 2008递归
tab1 表结构: create tab1 ( id int primary key identity(1,1), parentid int not null, name varchar(25) ) ...
- WCF基础之Message类
客户端和服务端的通信都是通过接收和发送的Message实例建立起来的,大多数情况我们通过服务协定.数据协定和消息协定来构造传入和传出消息的. 一般什么时候使用Message类呢?不需要将消息序列化或者 ...
- spring web app的结构
1 入口是web.xml tomcat加载war的时候会去读该入库文件. 2 web.xml中spring mvc的配置 定义servlet到servlet-mapping之间的映射,org.spri ...