Windows对象、句柄与MFC对象

保姆级教程:SAP ABAPer如何为VF01销售发票和MIRO发票校验配置凭证替代(含AC_DOCUMENT BADI完整代码示例) 本文详细解析了SAP ABAP中通过AC_DOCUMENT BADI实现VF01销售发票和MIRO发票校验的凭证替代技术。从技术选型到BADI实施步骤,再到核心逻辑代码示例,为ABAP开发者提供了一套完整的解决方案,帮助应对财务部门复杂的业务需求。 阅读详情

      Windows对象是以句柄来标识的,对应的MFC类就是这些句柄的C++包装。内存中的Windows对象一定有唯一的句柄来标识,但不一定有对应的MFC类对象在内存中。当需要获取Windows对象的对应MFC类对象而内存中又没有此对象时,系统会创建一个临时MFC类对象返回给用户,并在之后某个空闲时刻进行回收。

 
  Windows对象句柄及其对应的MFC类如下表所示:

HWND

CWnd及派生类

HDC

CDC及派生类

HMENU

CMenu

HPENHBRUSHHFONTHBITMAPHPALETTEHRGN

CGdiObject

HIMAGELIST

CImageList

SOCKET

CSocket


  如果你拥有上面的任何一个Windows对象句柄,你可以调用对应类的静态成员函数FromHandle来查找对应的MFC对象(系统为每个线程维护了一个从Windows对象句柄到MFC对象的映射,一个持久的map和一个临时的map);如果你拥有上面的MFC对象,你也可以通过MFC类的公有成员变量来获取对应的Windows对象句柄。
 
  例如,给定一个HWND类型的句柄hWnd,可以通过

CWnd::FromHandle(hWnd)

来获得CWnd对象的指针。如果hWnd没有对应的CWnd对象,则系统会产生一个临时CWnd对象与hWnd关联,并返回该对象的指针。在获得CWnd对象后,你可以通过CWnd的公有成员m_hWnd获得窗口对象的句柄。
 
  如果在调用FromHandle时产生临时MFC对象,句柄和MFC对象之间的映射被保存在系统的临时map中。默认情况下,CWinThread::OnIdle自动为那些支持临时句柄映射的MFC类调用DeleteTempMap函数。在DeleteTempMap函数中,这些临时对象将被取消与句柄的关联,然后被销毁。
 
  如果你拥有一个Windows对象句柄,那么你可以创建一个对应的MFC对象,然后把该MFC对象与该Windows对象句柄进行关联。此时,该MFC对象与Windows对象相互建立起映射关系。
 
  例如,对于如下代码:

CWnd  myWnd;

myWnd.Attach(hWnd);

将建立起hWnd到myWnd的映射。此后,你调用CWnd::FromHandle(hWnd)将返回myWnd对象的指针。如果myWnd对象被销毁,它的析构函数将自动通过调用DestroyWindow来销毁该hWnd所指Windows对象。如果该行为不是所期望的,则需要在myWnd销毁之前调用Detach成员函数解除两者之间的关联(映射),如 myWnd.Detach()。
 
  所有临时MFC对象和持久(permanent)MFC对象都是以线程为单位进行维护管理的。也就是说,一个线程不能够访问另一个线程的MFC包装类对象,不管它是临时的还是持久的。
 
  为了在不同的线程间传递这些Windows对象,总是应该通过HANDLE类型传递。从一个线程向另一个线程传递MFC包装对象将可能引起不可预料的结果。
 
  由于MFC包装类对象是以线程为单位进行管理的,因此,在程序中的不同线程中可能有多个MFC对象与同一个句柄对应。
 
  存在的疑问:如果同一线程中有多个MFC对象Attach同一句柄,那么对该句柄调用FromHandle将返回哪个MFC对象呢?未定义行为?
Python+Vue计算机毕业设计风电场监控系统的设计实现7bd6i(程序+LW+源码+部署) Python3.7.7+Django+Mysql5.7+pip list+HBuilderX(Vscode也行)+Vue+Pychram社区版。2. 前端:vue+css+javascript+jQuery+easyUI+highcharts。2.IDE环境:Python和Python 社区版都可以。Django + Vue +Python+Mysql 等等组成,B/S模式等等。该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。1. 后端:Python、Vue、Django、Mysql。 阅读详情

相关推荐

《深入浅出MFC》高清第二版(书签)_深入浅出MFC_c++mfc_

《深入浅出MFC》分为四大篇。第一篇提出学习MFC程序设计之前的必要基础,包括Windows程序的基本观念以及C++的高阶议题。

FromHandle 详解

FromHandle给出一个window对象句柄,返回一个相应对象的指针 如:CBrush::FromHandle static CBrush* PASCAL FromHandle( HBRUSH hBrush ); CFont::FromHandle static CFont* PASCAL FromHandle( HFONT hFont ); 转载于:https://www.cnbl...

weixin_34319111的博客 711

人工智能导论课件.ppt

源码下载地址: https://pan.quark.cn/s/840e548d4de6 Artificial_Intelligence 人工智能导论 | 人工智能基础 课件PPT 《人工智能导论》 http://m.cmpedu.com/books/book/5601171.htm 《人工智能导论:模型算法》 http://xuanshu.hep.com.cn/front/book/findBookDetails?bookId=5e232671b0b2bda7c523c390 慕课: https://www.icourse163.org/course/ZJU-1003377027?tid=1465500455

解析 MFC 中的 FromHandle

MFCWindows API 进行了封装,在很多方面都会提供便利。用 FromHandle 返回零时对象的指针,就可以调用各种类的方法。临时对象会在 OnIdle 中销毁。这里对 FromHandle 的实现原理从源码上进行解析。// // 1 // CWnd* PASCAL CWnd::FromHandle(HWND hWnd) {

独木专栏 1万+

FromHandle

我来给你说说FromHandle是如何工作的吧,希望能加深你的理解。    例如,你的程序中必然对你的主窗口Attach(这是由Framework完成的),这样的话,假如你又得到了你程序的主窗口句柄hwndMain,你如果再调用FromHandle(hwndMain),它返回的将是你的App中的m_pMainWnd,原因就是FromHandle会维持一个内部的列表,纪录每个hwndCWnd的

xxxwrq的专栏 1298

[学习笔记]MFC 中的CDC类

[学习笔记]MFC 中的CDC类 CDC类定义的是设备上下文对象的类。 CDC对象提供处理显示器或打印机等设备上下文的成员函数,以及处理窗口客户区对应的显示上下文的成员。 通过CDC对象的成员函数进行所有的绘图。 类对设备上下文操作提供了成员函数,处理绘图工具。安全型图形设备接口(GDI)对象收集,以及处理颜色和调色板。 它还为获取和设置绘图属性、映射,处理视点、窗口扩展、转换

congzhao27的专栏 2314

深入浅出MFC - Windows对象句柄MFC对象

http://blog.sina.com.cn/s/blog_493309600100cqhy.html   Windows对象是以句柄来标识的,对应的MFC类就是这些句柄的C++包装。内存中的Windows对象一定有唯一的句柄来标识,但不一定有对应的MFC对象在内存中。当需要获取Windows对象的对应MFC对象而内存中又没有此对象时,系统会创建一个临时MFC对象返回给用

netanimals的专栏 946

WINDOWSMFC对象句柄、ID之间的区别

WINDOWSMFC对象句柄、ID之间的区别

miy_autumn的专栏 885

关于句柄的一些知识

控制(control)、字体(font)、资源(resource),包括图标(icon),光标 (cursor),字符串(string)等、GDI对象(GDI object),包括位图(bitmap),画刷(brush),元文件(metafile),调色板(palette),画笔(pen),区域 (region),以及设备描述表(device context)。 ...

weixin_33863087的博客 231

不同的句柄类型,其指向的保存信息的内存块中的内容组织方式也会有所不同。可以认为Windows对象就是一个句柄,该句柄指向一个Windows操作系统对象。读者见到的各种窗口和图标多数是Windows

tach()的全部功能,建立一个Windows操作系统的窗口对象,并将句柄自动保存在MFC窗口对。本节将介绍MFC对象Windows对象的联系,以最典型的窗口类(CWnd)为例,介绍。MFC封装了Windows的几乎所有的API函数,所以上面的API函数,可以用CWnd的成员。MFC的窗口对象wnd是C++类的实例,即CWnd类或其派生类的实例,是由CWnd类或其派。MFC对象是C++对象,而且是特指封装了Windows对象的C++对象,不是任意的C++2.4 MFC对象Windows 对象的关系。

Popcorn_zyh的博客 311

mfc获取子窗口句柄_VC|Window Object句柄MFC Object指针的相互关系和转换

MFC中最重要的封装是对Win32 API的封装,因此,理解Windows Object和MFC Object (C++对象,一个C++类的实例)之间的关系是理解MFC的关键之一。所谓Windows Object(Windows对象)是Win32下用句柄表示的Windows操作系统对象;所谓MFC Object (MFC对象)是C++对象,是一个C++类的实例,这里MFC Object是有特定含义...

weixin_39992462的博客 243

FromHandle函数

一 FromHandle()   MFC 实际上是对内核对象HANDLE(如CDC的m_hDC,CWnd的m_hWnd)封装了这个句柄有关的所有操作,一个类生成一个新对象的时候这个句柄是无效的,要获得这个句柄,可以有两个方法,一个是Create来创建,另一个就是用Attach来一个已有的句柄建立关联,实际上也就是给类的句柄成员变量赋值。 而有些时候这个句柄不是由我们创建,但是我们要对它的封装类进行操作,(mfc框架)必需创建对应的封装类包装它。 MFC 中对各种包含内核对象的封装类都有FromHan.

顺其自然~专栏 1791

CWnd类临时对象会在主线程OnIdle时被DeleteTempMap函数清除掉。

CWnd类临时对象会在主线程OnIdle时被DeleteTempMap函数清除掉。  为什么我使用Sleep函数后改变了我的CWnd指针对象的m_pCtrlSite的值 悬赏分:30 - 提问时间2008-4-30 15:22 问题为何被关闭我想使用线程控制我的按钮的摆动,可是当我使用sleep函数后,我的CWnd *pWnd的m_pCtrlSize值被改变,使得程序无法继续,请问

skyremember的专栏 1588

INSTANCE/HWND/CWnd/HANDLE区别

HINSTANCE是应用程序实例句柄, HWND是窗口对象句柄, HANDLE是任意对象句柄, CWnd是MFC中的窗口类。   MSDN里面对于HINSTANCE的解释是"handle   to   an   instance"   就是说是一个instance的句柄。而对instance的解释是"An   object   for   which   memor

长乐未央 1253

转:CWnd的函数,以后可以在这儿找了!

CWnd CObject └CCmdTarget └CWnd CWnd类提供了微软基础类库中所有窗口类的基本功能。CWnd对象Windows的窗口不同,但是两者有紧密联系。CWnd对象是由CWnd的构造函数和析构函数创建或销毁的。另一方面,Windows的窗口是Windows的一种内部数据结构,它是由CWnd的Create成员函数创建的,...

weixin_30569033的博客 947
上一篇: 共享内存与线程局部存储
下一篇: GUI程序也能使用控制台窗口
banward
博客等级 码龄18年 4粉丝 7原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值