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

ID、句柄、指针、对象互相转换的更多相关文章

  1. MFC中获取各个窗口之间的句柄或者指针对象的方法

    MFC在非常多的对话框操作中,我们常常要用到在一个对话框中调用还有一个对话框的函数或变量.能够用例如以下方法来解决.    HWND hWnd=::FindWindow(NULL,_T("S ...

  2. C++中将对象this转换成unsigned char指针

    示例程序 // ---CodeBlob.h--- #ifndef CODEBLOB_H_ #define CODEBLOB_H_ class CodeBlob { private: const cha ...

  3. MFC获取各个窗体(体)之间的指针(对象)

    MFC在非常多的对话框操作中,我们常常要用到在一个对话框中调用还有一个对话框的函数或变量.能够用例如以下方法来解决.    HWND hWnd=::FindWindow(NULL,_T("S ...

  4. jQuery介绍 DOM对象和jQuery对象的转换与区别

    jQuery介绍 DOM对象和jQuery对象的转换与区别 jQuery介绍      jQuery: http://jquery.com/      write less, do more.   j ...

  5. DOM 对象和jQuery对象的转换

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. C#中对象,字符串,dataTable、DataReader、DataSet,对象集合转换成Json字符串方法。

    C#中对象,字符串,dataTable.DataReader.DataSet,对象集合转换成Json字符串方法. public class ConvertJson { #region 私有方法 /// ...

  7. jQuery对象与dom对象的转换

    一直以来对于通过jQuery方式获取的对象使不能直接使用JavaScript的一些方法的,开始的时候不理解,现在此案知道,原来jQuery获得的对象并不和我们平时使用getElementById获得的 ...

  8. 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

    [源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, con ...

  9. 如何将PHP对象数组转换成普通数组

    /** * 对象数组转为普通数组 * * AJAX提交到后台的JSON字串经decode解码后为一个对象数组, * 为此必须转为普通数组后才能进行后续处理, * 此函数支持多维数组处理. * * @p ...

随机推荐

  1. VS2015中C#版本6.0的新特性

    [z]http://www.cnblogs.com/xszjk/articles/6417173.html [z]https://www.cnblogs.com/qixu/p/6047229.html ...

  2. Vue 快速原型开发

    快速原型开发 注意: 是:serve 而不是 server 通过使用 vue serve 和 vue build 命令对单个 *.vue 文件进行快速原型开发,不过这需要先额外安装一个全局的扩展 go ...

  3. Oracle性能优化2- 依据场景选择技术

    1.索引的坏处 索引可以加快查询效率,但是使用不当,会造成插入性能很低 drop table test1 purge; drop table test2 purge; drop table test3 ...

  4. 27.MySQL备份与恢复

    27.备份与恢复27.1 备份/恢复策略考虑因素:备份表的存储引擎(事务性or非事务性):全备份or增量备份用复制做异地备份定期备份,考虑恢复时间确保mysql打开log-bin,有了BINLOG,M ...

  5. js generator

    generator(生成器)是ES6标准引入的新的数据类型.一个generator看上去像一个函数,但可以返回多次. generator跟函数很像,定义如下: function* foo(x) { y ...

  6. 自适应手机网站meta name代码

    <meta name="viewport" content="width=device-width,initial-scale=1.0">   co ...

  7. iOS.Library.Architecture

    在用file查看library的architechture时有以下输出: $ file WebPWebP: Mach-O universal binary with 3 architecturesWe ...

  8. “Interrupted by header callback: Server reports Content-Length”如何解决

    mock初始化时的错误信息如下: Downloading Packages: [SKIPPED] systemd--.fc25.x86_64.rpm: Already downloaded [SKIP ...

  9. 会话和http请求

    一次HTTP请求和响应的过程 域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> ...

  10. 利用PHP脚本辅助MySQL数据库管理3-删除重复表索引

    <?php $dbi = new DbMysql; $dbi->dbh = 'mysql://root:mysql@127.0.0.1/coffeetest'; $map = array( ...