窗口句柄、窗口类对象的关系

2024-06-11 21:38
文章标签 关系 对象 句柄 窗口

本文主要是介绍窗口句柄、窗口类对象的关系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

HWND hwnd;//窗口句柄

CWnd wnd;//窗口类对象

窗口类对象中有一个成员是窗口句柄。

 

 窗口句柄,提供了窗口的一个标识,类似于指针的概念,每一个窗口都对应了一个窗口句柄作为其标识,通过句柄可以方便的从内存中索引到资源。窗口类的对象则是对应窗口类的一个实例化,在MFC程序中,通过子类对象访问类的函数时就不需要提供窗口句柄作为资源标识。

举例说明:

SDK编程中创建一个窗口首先要定义一个窗口句柄,然后调用API函数创建并显示窗口,此时需要向函数传递窗口句柄,具体如下:
HWND hwnd;

hwnd=::CreateWindowEx();

::ShowWindow(hwnd,SW_SHOW);

::UpdateWindow(hwnd);

利用MFC开发程序时,在CWnd类中定义了一个类型为句柄的成员变量HWND m_hWnd, 类中有函数

HWND CreateWindowEx(DWORD dwExStyle,      // extended window styleLPCTSTR lpClassName,  // registered class nameLPCTSTR lpWindowName, // window nameDWORD dwStyle,        // window styleint x,                // horizontal position of windowint y,                // vertical position of windowint nWidth,           // window widthint nHeight,          // window heightHWND hWndParent,      // handle to parent or owner windowHMENU hMenu,          // menu handle or child identifierHINSTANCE hInstance,  // handle to application instanceLPVOID lpParam        // window-creation data
);
利用MFC开发程序时,在CWnd类中定义了一个类型为句柄的成员变量HWND m_hWnd, 类中有函数其返回值为一个句柄,在函数体内部利用API函数CreateWindowEx来完成窗口的创建。将其返回值保存到m_hWnd中,在实例化一个对象CWnd wnd;

wnd.CreatEx(...);

wnd.ShowWindow(SW_SHOW);

wnd.UpdateWindow();

可见利用对象创建窗口不需要向函数传递窗口句柄资源。因为在CWnd中定义了一个成员变量m_hWnd,由它保存了这个窗口句柄,调用CreateWindowEx时把句柄保存到CWnd类中,

所以再次调用ShowWindow中就不用传递句柄。

 

这里需要声明一点此处的wnd对象并不是窗口,将窗口关闭的时候这个对象并没有销毁,仅仅是将句柄设置为NULL,对象和窗口生存周期之间没有必然联系,对象和窗口唯一联系的纽带是在类的内部有一个窗口句柄的成员变量,保存了相关窗口的句柄,所以当对象销毁的时候这个窗口是要销毁的。一般的说在执行到右大括号之前对象都是没有被销毁的,而此时若调用DestroyWindow则是销毁窗口

常用转换如下

指针->句柄:hWnd = pWnd->GetSafeHwnd();

ID->句柄:hWnd = ::GetDlgItem(hParentWnd, ID);

句柄->指针:pWnd = CWnd::FromHandle(hWnd);

ID->指针:pWnd = Cwnd::GetDlgItem();

指针->ID:ID = GetWindowLong(pWnd->GetSafeHwnd(), GWL_ID);

句柄->ID:ID = GetWindowLong(hWnd, GWL_ID);


 

这篇关于窗口句柄、窗口类对象的关系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1052344

相关文章

SpringBoot实现导出复杂对象到Excel文件

《SpringBoot实现导出复杂对象到Excel文件》这篇文章主要为大家详细介绍了如何使用Hutool和EasyExcel两种方式来实现在SpringBoot项目中导出复杂对象到Excel文件,需要... 在Spring Boot项目中导出复杂对象到Excel文件,可以利用Hutool或EasyExcel

Springboot控制反转与Bean对象的方法

《Springboot控制反转与Bean对象的方法》文章介绍了SpringBoot中的控制反转(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依赖关系,它详细讲解了Bean的注册过程,包括... 目录1 控制反转1.1 什么是控制反转1.2 SpringBoot中的控制反转2 Ioc容器对Bea

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为

python安装whl包并解决依赖关系的实现

《python安装whl包并解决依赖关系的实现》本文主要介绍了python安装whl包并解决依赖关系的实现,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、什么是whl文件?二、我们为什么需要使用whl文件来安装python库?三、我们应该去哪儿下

Java中对象的创建和销毁过程详析

《Java中对象的创建和销毁过程详析》:本文主要介绍Java中对象的创建和销毁过程,对象的创建过程包括类加载检查、内存分配、初始化零值内存、设置对象头和执行init方法,对象的销毁过程由垃圾回收机... 目录前言对象的创建过程1. 类加载检查2China编程. 分配内存3. 初始化零值4. 设置对象头5. 执行

MYSQL关联关系查询方式

《MYSQL关联关系查询方式》文章详细介绍了MySQL中如何使用内连接和左外连接进行表的关联查询,并展示了如何选择列和使用别名,文章还提供了一些关于查询优化的建议,并鼓励读者参考和支持脚本之家... 目录mysql关联关系查询关联关系查询这个查询做了以下几件事MySQL自关联查询总结MYSQL关联关系查询

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象