HANDLE HINSTANCE HWND CWnd CDC

本文深入浅出地介绍了Windows操作系统中的句柄概念,包括句柄的基本原理及其如何帮助开发者定位内存中的对象。文中还详细解释了不同类型的句柄,如HINSTANCE、HWND和HANDLE等的区别与用途。

开始学及基础了,呵呵 不了解 就无法更好的使用。  Windows最基本的这些变量学起。

句柄:   柄,把柄 例如一个锅的手柄,你只要抓住了它,你就可以很好地操作那个锅,不过很明显你只能通过锅的手柄来做一些诸如炒菜之类的事,你不可能是因为抓住了锅的手柄才能去看电视.不能的物体都会至少有一个属于它的"手柄".

句柄是一种指向指针的指针。所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢?
为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。

句柄地址(稳定)→记载着对象在内存中的地址————→对象在内存中的地址(不稳定)→实际对象

本质:WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。

 OK,了解好句柄之后  在继续看 HANDLE HINSTANCE HWND  这些

HINSTANCE是应用程序实例句柄。
  HMODULE与HINSTANCE是完全相同的对象,
  原因是在1 6 位Wi n d o w s 中,HMODULE和HINSTANCE用于标识不同的东西
  HINSTANCE实际是系统将可执行文件的映象加载到进程的地址空间时使用的基本地址空间(引自WINDOWS核心编程4.1.1)
  HINSTANCE 不能理解成进程地址  他是该EXE模块或DLL模块 加载到进程的 地址空间时 使用的首地址。
  也就是该应用程序某部分模块 的句柄, 也就是指向 该模块 在进程地址空间中 的地址指针。

HWND是窗口对象句柄,

HANDLE是任意对象的句柄,

CWnd是MFC中的窗口类。 它是一个类 不能跟句柄混淆。

HDC 设备上下文句柄
    是GDI(图形设备接口)内部保存数据的一种数据结构
    设备描述表(DC:Device Context)的对象的句柄 以它为参数,调用各GDI函数来实现图形或文字的现实如TextOut

MFC
窗口相关的封装到CWnd中  窗口基类CWnd  CWnd它派生于CCmdTarget类是最基本的GUI(图形用户接口)对象
作图相关的封装到CDC中   绘图基类CDC

进程地址空间 没研究明白!挺难理解的一个东西!先这样 带完善!

 

<think>我们已经有用户提出的明确问题:CWndHWND的区别和关系,以及引用的材料。现在需要按照用户的要求,使用中文回答,并遵循特定的格式要求(数学公式格式、引用标识等)。虽然没有数学内容,但结构要清晰。 根据引用材料: [^1]: HWND是句柄,CWnd是MFC窗体类,HWND更底层。 [^2]: CWnd中包含HWND句柄成员m_hWnd。 [^3]: 相互转换:Attach和FromHandle等方法。 [^4]: CWnd类封装了窗口操作,通过窗口句柄操作实际窗口。 [^5]: CWnd对象和Windows窗口的关系:CWnd对象由构造函数和析构函数管理,而Windows窗口由Create和DestroyWindow管理。 回答结构: 1. 分别解释HWNDCWnd的含义(代表什么)。 2. 阐述两者之间的关系(重点)。 3. 如何转换(简要说明)。 4. 总结。 同时,按照用户要求,在最后生成相关问题。 注意:引用标识要自然地添加在引用内容的末尾。 </think>### HWNDCWnd 的含义及关系解析 #### 1. **HWND 的含义** **HWNDHandle to Window)** 是 Windows 操作系统的**核心资源标识符**: - 本质是一个整型值(实际为指针),唯一标识窗口、按钮等 UI 元素[^1][^2]。 - 由操作系统内核直接管理,存储在系统句柄表中。 - 代表**物理窗口资源**,例如: ```cpp HWND hButton = CreateWindow(L"BUTTON", L"确定", WS_VISIBLE, 10, 10, 80, 25, hParent, NULL, hInstance, NULL); ``` 此类操作直接与 Windows API 交互,不涉及面向对象特性[^1][^5]。 #### 2. **CWnd 的含义** **CWnd** 是微软基础类库(MFC)中的**窗口基类**: - 作为所有 MFC 窗口控件(如 `CButton`、`CDialog`)的父类。 - 封装了窗口操作(创建、销毁、消息处理等),提供 200+ 成员函数[^4][^5]。 - 核心成员 `m_hWnd` 存储关联的 HWND,实现面向对象封装: ```cpp CWnd* pBtn = new CButton; pBtn->Create(L"取消", WS_CHILD | WS_VISIBLE, CRect(100,10,180,35), this, IDCANCEL); ``` #### 3. **核心关系** 二者的关系本质是**封装与被封装**: - **存储关系**: CWnd 对象通过成员变量 `m_hWnd` 持有 HWND 句柄[^2][^4]。 $$ \text{CWnd} \xrightarrow{\text{m_hWnd}} \text{HWND} $$ - **生命周期关联**: - CWnd 对象析构时**自动销毁**关联的 HWND(通过 `DestroyWindow()`)[^5]。 - HWND 被销毁后,对应 CWnd 对象的 `m_hWnd` 将置为 `NULL`[^3]。 - **抽象层级**: | **特性** | HWND | CWnd | |----------------|-------------------------------|-------------------------------| | 抽象层级 | 系统级句柄(底层) | 对象封装(高层)[^1][^2] | | 内存管理 | 由 OS 内核管理 | 由应用程序管理 | | 消息处理 | 需手动处理 `WNDPROC` | 通过消息映射自动路由[^5] | #### 4. **转换方法** - **CWndHWND** 直接访问 `m_hWnd` 或使用安全方法 `GetSafeHwnd()`: ```cpp CWnd* pWnd = GetDlgItem(IDC_EDIT); HWND hEdit = pWnd->m_hWnd; // 直接获取 HWND hSafe = pWnd->GetSafeHwnd(); // 安全获取(防空指针) ``` - **HWNDCWnd** 使用 `CWnd::FromHandle()`,但需注意: ```cpp HWND hNotepad = FindWindow(L"Notepad", NULL); CWnd* pTemp = CWnd::FromHandle(hNotepad); // 临时映射对象 pTemp->SetWindowText(L"新标题"); ``` > ️ **重要限制**: > `FromHandle()` 返回的对象指针是临时的,MFC 会定期清理其映射表(`DeleteTempMap()`),不可长期保存[^3][^5]。 #### 5. **设计哲学对比** - **HWND**:体现 **Windows SDK 的面向过程设计**,需手动管理资源: ```cpp HWND hWnd = CreateWindow(...); // 显式创建 // ... 业务逻辑 ... DestroyWindow(hWnd); // 显式销毁 ``` - **CWnd**:体现 **MFC 的面向对象设计**,自动化管理: ```cpp class CMyWnd : public CWnd { virtual ~CMyWnd() { // 析构时自动销毁 m_hWnd } }; ``` 封装了窗口消息处理、资源管理等复杂逻辑[^4][^5]。 > 💡 **总结**: > HWND 是 Windows 系统识别窗口的**身份证**,代表了物理窗口资源; > CWnd 是 MFC 封装窗口操作的**智能管家**,通过 `m_hWnd` 关联底层资源并扩展功能[^1][^2][^4]。 > 二者构成 **"对象-资源" 绑定关系**,共同实现高效窗口管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值