关于MFC资源句柄、ID和对象

时间:2021-08-12 05:04:56

一、资源、句柄和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)//创建非模态对话框

当资源还不存在时,也可以创建关联