当前位置: 首页 > news >正文

ID、句柄、指针、对象互相转换

/*********************************************************************************************************************
*   发布日期:
*   更新日期:2017-11-15 09:56:27
*   进度:
*   作者:骆天
*   备注:
*********************************************************************************************************************/

一、概述

HINSTANCE是应用程序实例句柄
HWND是窗口对象句柄
HANDLE是任意对象的句柄
CWnd是MFC中的窗口类。

一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,无论是多文档还是单文档,都存在指针获取和操作问题。
下面这节内容主要是一般的框架,然后再讲多线程中的指针使用。使用到的类需要包含响应的头文件。首先一般获得本类(视,文档,对话框都支持)实例指针 this,用this的目的,主要可以通过类中的函数向其他类或者函数中发指针,以便于在非本类中操作和使用本类中的功能。 这其中的关键在于理解m_pMainWnd AfxGetApp()AfxGetMainWnd() 的意义!

二、文档/视图中的操作

1)在View中获得Doc指针
CYouSDIDoc *pDoc=GetDocument(); //一个视只能有一个文档

2) 在App中获得MainFrame指针
CWinApp 中的 m_pMainWnd变量就是MainFrame的指针,也可以: CMainFrame *pMain =(CMainFrame *)AfxGetMainWnd();

3) 在View中获得MainFrame指针
CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;

4) 获得View(已建立)指针
CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;
CyouView *pView=(CyouView *)pMain->GetActiveView();

5) 获得当前文档指针
CDocument * pCurrentDoc =(CFrameWnd *)m_pMainWnd->GetActiveDocument();

6) 获得状态栏与工具栏指针
CStatusBar * pStatusBar=(CStatusBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);
CToolBar * pToolBar=(CtoolBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);

7) 如果框架中加入工具栏和状态栏变量还可以这样
(CMainFrame *)GetParent()->m_wndToolBar;
(CMainFrame *)GetParent()->m_wndStatusBar;

8) 在Mainframe获得菜单指针
CMenu *pMenu=m_pMainWnd->GetMenu();

9) 在任何类中获得应用程序类

三、句柄、ID、指针三者之间的转换

句柄用于与别的程序进行沟通,指针用于自身。

VC编程中窗口ID,句柄,指针三者相互转换的函数

ID->句柄————hWnd = ::GetDlgItem(hParentWnd,ID);
ID->指针————CWnd::GetDlgItem();

句柄->ID————ID = GetWindowLong(hWnd,GWL_ID);
句柄->指针————CWnd *pWnd=CWnd::FromHandle(hWnd);


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


指针->句柄————hWnd=cWnd.GetSafeHandle() ;
指针->句柄————pWnd->m_hWnd;


以下是实例
HWND hwndMain = CreateWindow( "GenericAppClass", //建了一个窗口,就有句柄了
"Super Video",
WS_POPUP,
0,
0,
500,
500,
NULL,
NULL,
hInstance,
NULL
);
CWnd* Wnd=new CWnd;
Wnd->Attach(hwndMain);   //Wnd就是你通过句柄hwndMain得到的指针

hwndMain=Wnd->Detach();    //通过指针求句柄


CWnd *mywnd=new CWnd;
mywnd->Create(_T("STATIC"), "", WS_CHILD | WS_VISIBLE,CRect(0, 0, 400, 400), this, 1234);
mywnd->m_hWnd;      //对象里的m_hWnd成员数据中就是这个窗口的句柄


由ID获得指针

CWnd*p=GetDlgItem(ID,parent);  //parent为父窗口

由指针获得ID

int ID=p->GetDlgCtrlID();//指向当前控件的指针p去获取所指向控件的ID号

由指针获得句柄

p->m_hWnd

 

转载于:https://www.cnblogs.com/tinaluo/p/7362342.html

相关文章:

  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • sql 查出一张表中重复的所有记录数据
  • Spinner使用二
  • 用jquery写循环播放div的相关笔记 珍贵的总结 -1
  • 【Python】raw转义字符
  • 【OpenStack】OpenStack系列4之Glance详解
  • 事件委托的小应用
  • WP_Query的使用方法
  • docker容器互联 分离部署PHP 和 nginx(端口映射方式)
  • mongoose post方法总结and疑点
  • 算法导论笔记——第十二~十四章 数据结构(二)树
  • 招Java工程师一名
  • React Native商城项目实战10 - 个人中心中间内容设置
  • shell中的并且、和、或者
  • 时间控件-pikaday.js
  • Google 是如何开发 Web 框架的
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • Github访问慢解决办法
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • MySQL数据库运维之数据恢复
  • Sass Day-01
  • Theano - 导数
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 机器学习中为什么要做归一化normalization
  • 理清楚Vue的结构
  • 力扣(LeetCode)22
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 小李飞刀:SQL题目刷起来!
  • 一天一个设计模式之JS实现——适配器模式
  • ​ArcGIS Pro 如何批量删除字段
  • ​一些不规范的GTID使用场景
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (¥1011)-(一千零一拾一元整)输出
  • (1)(1.11) SiK Radio v2(一)
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (六)软件测试分工
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .net 简单实现MD5
  • .NET6实现破解Modbus poll点表配置文件
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • .NET运行机制
  • @Autowired注解的实现原理
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [AIGC codze] Kafka 的 rebalance 机制
  • [Android View] 可绘制形状 (Shape Xml)
  • [Android]使用Android打包Unity工程
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作