博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ID、句柄、指针、对象互相转换
阅读量:6509 次
发布时间:2019-06-24

本文共 2436 字,大约阅读时间需要 8 分钟。

/*********************************************************************************************************************

*   发布日期:
*   更新日期: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

你可能感兴趣的文章
我的友情链接
查看>>
解决使用PHP无法下载大文件的问题
查看>>
zabbix3.2监控vmware的esxi
查看>>
CSS文本超出省略
查看>>
函数ZwQuerySystemInformation小结
查看>>
无障碍门禁
查看>>
许我向你看
查看>>
[Ajax]服务器推技术 - 反向AJAX - (服务端原理)
查看>>
nodejs事件编程详解
查看>>
React-Native入门指南(一)——环境配置 & Hello World
查看>>
Mac下IDEA开发环境的Tomcat远程调试
查看>>
微信三方登录相关(Swift)
查看>>
Eclipse常用快捷键
查看>>
Android 图形系统概述
查看>>
Android:ViewTreeObserver类
查看>>
怎样xp系统访问win7系统共享文件夹
查看>>
ONVIF客户端搜索设备获取rtsp地址开发笔记(精华篇)
查看>>
git简易教程
查看>>
Java Web开发自学笔记二:新建一个java web 工程
查看>>
Java编码过滤器
查看>>