zoukankan      html  css  js  c++  java
  • VC++中有关句柄和指针及其转换(转)

    原文转自 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便是指向主窗口和父窗口的指针。

  • 相关阅读:
    Oracle死锁只会回滚跟死锁有关的那条SQL,而不会回滚整个事务
    Mysql安装过程(linux:2.6.18-194.el5,Mysql:)
    格式化分区,报/dev/sdb1 is apparently in use by the system; will not make a filesystem here!
    安装Oracle 11gR2,报错:[INS-06101] IP address of localhost could not be determined
    mysql-5.5.25-winx64在win7 x64 免安装配置
    insert遭遇阻塞
    linux中轻松使用backspace和上下按键
    排序
    MySQL
    基于Boost的同步TCP通信
  • 原文地址:https://www.cnblogs.com/happykoukou/p/8881514.html
Copyright © 2011-2022 走看看