CWnd与HWND的区别与联系(相互转换)完全解析

2024-04-20 11:38

本文主要是介绍CWnd与HWND的区别与联系(相互转换)完全解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

区别

           首先,从这两个单词的第一个字母即可知道两者之间的差别。熟悉MFC的人都知道在MFC中,类基本上都是以C开头的,这是一种规则约定,目的就是让人一看就知道它是一个类!

          因此,CWnd第一个字母C指的是class的意思,即CWnd是一个类;HWND第一个字母H指的是handle的意思,即HWND是一个句柄


CWnd:是MFC类库中所有窗口类的基类。MFC将所有窗口的通用操作都封装到CWnd类中,如MoveWindow、ShowWindow;同时,它也封装了窗口句柄,即m_hWnd成员。

HWND:即Windows窗口句柄,是Windows系统中对所有窗口的一种唯一标识

聪明的读者可以发现,CWnd其实就是MFC中的一个类名;而HWND是Windows中窗体句柄的类型,一个类似于指针地址的数字型对象。


联系(相互转换)


1、由HWND得到CWnd:

 方法一:通过CWnd的Attach()函数来获取

	CWnd wnd;HWND hWnd;wnd.Attach(hWnd);
            CWnd的Attach()函数的作用基本上就是包一个句柄附加到一个MFC的对象上,即将CWnd对象的HWND成员指向这个窗口句柄hWnd。


方法二:HWND可以通过CWnd的静态函数:CWnd::FromHandle()或CWnd::FromHandlePermanent(),由句柄实例化一个CWnd对象出来。

如果用FromHandle(),返回值是一个临时CWnd对象,并且我们确保返回值为非空,也就是hWnd是有效的。(函数声明如下:)

static CWnd*   CWnd::FromHandle(HWND   hWnd) ;


如果用FromHandlePermanent(),返回值是一个 永久对象,只有在返回的CWnd在类表里已经存在,则返回值为非空。(函数声明如下:)

static CWnd*   CWnd::FromHandlePermanent(HWND   hWnd)  ;

2、由CWnd获取HWnd:

       

         方法一:从CWnd获取HWnd就容易多了,因为它的一个成员变量m_hWnd就是所对应窗口的句柄。

            wnd->m_hWnd

        方法二:也可以通过成员函数CWnd::GetSafeHwnd()来获得该窗口对象的HWND窗口句柄。





这篇关于CWnd与HWND的区别与联系(相互转换)完全解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

go 指针接收者和值接收者的区别小结

《go指针接收者和值接收者的区别小结》在Go语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下... 目录go 指针接收者和值接收者的区别易错点辨析go 指针接收者和值接收者的区别指针接收者和值接收者的

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t