原文转自 https://blog.csdn.net/jearmy/article/details/47030011

1.MFC窗口的句柄和指针的转换

(1) 一般窗口对象都会有一个其对应的句柄变量,所以我们可以取此对象的m_hWnd属性来得到句柄。

(2)使用GetSafeHwnd函数取得程序所在窗口类的句柄

(3)使用FromHandle函数来通过句柄得到其想要的指针

其他的一些方法:

GetActiveWindow 取当前活动窗口句柄

AfxGetMainWnd   取主窗口句柄

GetForegroundWindow 取前台窗口句柄

FindWindow寻找参数指定的窗口

EnumWindow枚举窗口

2. 上下文无关设备的句柄和指针的转换

(1)this->m_hDC

(2)CDC::GetSafeHdc

(3)可以使用FromHandle函数来通过句柄得到其想要的指针

3.Gdi对象的句柄和指针的转换

(1)this->m_hObject

(2)CGdiObject::GetSafeHandle

(3)可以使用FromHandle函数来通过句柄得到其想要的指针

4.窗口、控件的指针和句柄的相互转化

(1)指针转化为句柄

在MFC应用程序中首先要获得窗口的指针,然后将其转化为句柄

CWnd* pWnd;

HANDLE hWnd = pWnd->GetSafeHwnd();

(2)句柄转化为指针

在MFC应用程序中首先获得对话框控件的句柄,然后获得其指针

HANDLE hWnd;

GetDlgItem(IDC_xxx,&hWnd);

CWnd * pWnd = FromHandle(hWnd);

获得程序窗口指针的办法

(1)获得主框架窗口指针(任何时候都可以用,只要是MFC程序中)

CWnd* pWnd = AfxGetMainWnd();

(2)获得对话框中控件指针

CWnd* pWnd = GetDlgItem(IDC_xxx);

(3)获得对话框中某控件的句柄

HANDLE GetDlgItem(m_hDLG,m_nID_DlgItem);

(4)获得GDI对象的句柄

HANDLE m_hGDIObj = m_pGDIObj->GetSafeHanle();

假如父窗口类名称为CFatherDlg,那么在子窗口中可以调用GetParent获取父窗口对象指针,如 CFatherDlg* pFather = (CFatherDlg*)GetParent(); 这样就能够用pFather调用所有父类的公开方法和类成员变量了 这个代码只针对对话框应用,文档应用没用过

其实这个最好的方法还是传指针 GetParent()  ;  获取到父指针后再进行一下强制转换
在这里,你要明白指针都是32位的,只是因为C++是强类型的语言,所以不转换编译不通过 因此进行强制转换可以骗过编译器 虽然转换了,但是因为不管什么指针都是32位,所以并没有损失数据
比如在CMyView中获取CFrameWnd的指针可以这样 CFrameWnd *pFrameWnd = ((CFrameWnd *)GetParent());

5、在父类中定义了一个变量 com,子类模式对话框,里面有一个tab控件,tab控件上的一页上有个button,我想单机button,调用父类的com。使用GetParent(),有问题,没有获取到com的状态,获取的代码如下:
CSetZeroDlg *parent = (CSetZeroDlg *)GetParent();
CCalibrationDlg *pparent = (CCalibrationDlg *)parent->GetParent();
请问怎么解决?

获取一个类的变量,在该类被实例化后,只要获取该类的对象或对象指针后通过对象或对象指针即可访问,这是一般的方法,根本就不用管他是父类还是子类。你想访问父类中定义了一个变量 com变量,那么只要获取父类对象即可。GetParent函数是获取该窗口的父窗口对象的窗口类指针,
而不是获取父类对象窗口指针。不要把类的父子关系与窗口的父子关系混淆了。

MFC编程中常常遇到子窗口向父窗口传递参数的情况,这就需要获得父窗口的指针。

例:主对话框CMyMainDlg通过按钮ButtonA进入对话框CMyParentDlg,CMyParentDlg在通过按钮ButtonB进入对话框CMyChildDlg。现在需要在CMyChildDlg分别访问CMyParentDlg和CMyMainDlg的内容,需要在CMyChildDlg中加入以下两条语句:

CMyMainDlg    *pMMD = (CMyMainDlg*)AfxGetMainWnd();     //获取主窗口指针
        CMyParentDlg *pMPD = (CMyParentDlg*)this->GetParent();   //获取父窗口指针

其中,this代表当前窗口指针,指向CMyChildDlg;pMMD和pMPD便是指向主窗口和父窗口的指针。

VC++中有关句柄和指针及其转换(转)的更多相关文章

  1. VC++中 wstring和string的互相转换实现

    在VC++开发中,经常会用到string和wstring,这就需要二者之间的转换,项目中封装了wstring和string相互转换的2个函数,实现如下: //将wstring转换成string std ...

  2. VC中句柄、指针、ID之间的转换

    win32直接操作的是句柄HANDLE,每个句柄就对应windows窗口,而vc对HANDLE进行类封装,间接操作的都是HANDLE,现在句柄只是类的一个成员变量. 从句柄到指针 CWnd* pWnd ...

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

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

  4. VC中窗口ID,句柄,指针三者相互转换函数【转】

    ID--HANDLE--HWND三者之间的互相转换id->句柄        hWnd = ::GetDlgItem(hParentWnd,id);id->指针        CWnd:: ...

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

    /*************************************************************************************************** ...

  6. VC++ 中使用 std::string 转换字符串编码

    目录 第1章说明    1 1.1 代码    1 1.2 使用    4 第1章说明 VC++中宽窄字符串的相互转换比较麻烦,借助std::string能大大减少代码量. 1.1 代码 函数声明如下 ...

  7. VC++中的类的内存分布(上)(通过强制转换,观察地址,以及地址里的值来判断)

    0.序 目前正在学习C++中,对于C++的类及其类的实现原理也挺感兴趣.于是打算通过观察类在内存中的分布更好地理解类的实现.因为其实类的分布是由编译器决定的,而本次试验使用的编译器为VS2015 RC ...

  8. VC中CDC与HDC的区别以及二者之间的转换

    CDC是MFC的DC的一个类 HDC是DC的句柄,API中的一个类似指针的数据类型. MFC类的前缀都是C开头的 H开头的大多数是句柄 这是为了助记,是编程读\写代码的好的习惯. CDC中所有MFC的 ...

  9. ATL和vc++中的智能指针(分别是CComPtr和_com_ptr_t)

    一.智能指针的概念 智能指针是一个类,不是指针,智能指针在所包含的指针不再被使用时候会自动释放该所包含指针所占用的系统资源,而不用手动释放. 原理:智能指针封装了包含指针的AddRef()函数和Rel ...

随机推荐

  1. Pandas 数据结构Series:基本概念及创建

    Series:"一维数组" 1. 和一维数组的区别 # Series 数据结构 # Series 是带有标签的一维数组,可以保存任何数据类型(整数,字符串,浮点数,Python对象 ...

  2. Aizu:2224-Save your cats

    Save your cats Time limit 8000 ms Memory limit 131072 kB Problem Description Nicholas Y. Alford was ...

  3. WPF制作的小时钟

    原文:WPF制作的小时钟 周末无事, 看到WEB QQ上的小时钟挺可爱的, 于是寻思着用WPF模仿着做一个. 先看下WEB QQ的图: 打开VS, 开始动工. 建立好项目后, 面对一个空荡荡的页面, ...

  4. BZOJ 3027: [Ceoi2004]Sweet

    容斥 #include<cstdio> using namespace std; int a,b,n,m[15]; long long ans=0,mod=2004; long long ...

  5. P1783 海滩防御

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  6. CSS3 loading效果全

    梦想天空 关注前端开发技术 ◆ 推动 HTML5 & CSS3 技术发展 ◆ 本博客全新站点:yyyweb.com 欢迎围观:) 首页 管理 订阅 网页设计 JavaScript jQuery ...

  7. laravel5.5路由

    目录 1. routes/web.php 2. routes/api.php 3. 重定向路由 4. 路由参数 5. 约束 6. 命名路由 7. 路由组 8 路由模型绑定 9 表单方法伪造 10 访问 ...

  8. 2016年后web开发趋势是什么?

    2016 年后 Web开发趋势是什么 来源:yafeilee.me 发布时间:2016-05-06 阅读次数:1378 3   近二年的进展 前端发展日新月异, 甚至有一句戏言: "每六星期 ...

  9. Spring进阶—如何用Java代码实现邮件发送(一)

    相关文章: <Spring进阶—如何用Java代码实现邮件发送(二)> 在一些项目里面如进销存系统,对一些库存不足发出预警提示消息,招聘网站注册用户验证email地址等都需要用到邮件发送技 ...

  10. 剑指Offer - 九度1522 - 包含min函数的栈

    剑指Offer - 九度1522 - 包含min函数的栈2013-12-01 23:44 题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 输入: 输入可能包含多个测 ...