• 关于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)//创建非模态对话框

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

  • 相关阅读:
    如何理解redo和undo的作用
    自建NAS如何使用大于2TB的硬盘(从分区开始)
    Oracle 了解 DDL 操作与 REDO 的关系
    oracle 控制文件的重建
    Oracle 表空间的日常维护与管理
    解决debian 9 重启nameserver失效问题
    Vmware复制完好的linux目录后网卡操作
    RHEL6.X设置163yum源
    【转载】Eclipse快捷键大全
    【转】Java:String、StringBuffer和StringBuilder的区别
  • 原文地址:https://www.cnblogs.com/zhuluqing/p/8805594.html
Copyright © 2020-2023  润新知