美文网首页C++
MFC中句柄、指针、ID之间的关联

MFC中句柄、指针、ID之间的关联

作者: JasonChen8888 | 来源:发表于2018-03-02 15:52 被阅读15次

    MFC中句柄、指针、ID之间的关联

    win32直接操作的是句柄HANDLE。每一个句柄就相应windows窗体,而vc对HANDLE进行类封装,间接操作的都是HANDLE,如今句柄仅仅是类的一个成员变量。

    • 从句柄到指针
      CWnd* pWnd=CWnd::FromHandle(hWnd); //a temporary CWnd object is created //and attached.
      pWnd->Attach(hWnd); //Attaches a Windows window to a CWnd object
    • 从指针到句柄
      HWND hWnd=pWnd->GetSafeHandle();
      hWnd=pWnd->m_hWnd;
    • SDK编程中窗体ID。句柄,指针三者相互转换函数
      ID--HANDLE--HWND三者之间的互相转换
      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);
      GetDlgCtrlID();
      指针->句柄--------hWnd=cWnd.GetSafeHandle() or mywnd->m_hWnd;
      ID->HICON--------HICON hIcon = AfxGetApp()->LoadIcon(nIconID);
      HICON hIcon = LoadIcon(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(nIconID));
    • 补充
      附注:获得窗体句柄三种方法
      1.HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)
      2 HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName)
      3.HWND WindowFromPoint(POINT& Point)//获得当前鼠标光标位置的窗体HWND
      FindWindow和FindWindowEx 具体见此处

    VC++中有关句柄和指针及其转换
    1.MFC窗体的句柄和指针的转换
    (1) 一般窗体对象都会有一个其相应的句柄变量,所以我们能够取此对象的m_hWnd属性来得到句柄。
    (2)使用GetSafeHwnd函数取得程序所在窗体类的句柄
    (3)使用FromHandle函数来通过句柄得到其想要的指针
    其它的一些方法:
    GetActiveWindow 取当前活动窗体句柄
    AfxGetMainWnd 取主窗体句柄
    GetForegroundWindow 取前台窗体句柄
    FindWindow寻找參数指定的窗体
    EnumWindow枚举窗体

    1. 上下文无关设备的句柄和指针的转换
      (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();

    本文来自CSDN博客:http://blog.csdn.net/lovegod12/archive/2009/04/19/4092249.aspx

    • 常用的窗口控件和窗口的句柄或者指针的获取
      通过窗体类函数:CWnd *GetWindow获得窗体指针,pWnd->m_hWnd(The handle of the Windows window attached to this CWnd)在::FromHandle(hWnd);
      获取主窗体句柄: CWnd *wnd = AfxGetMainWnd();
      HWND hwnd = wnd->GetSafeHwnd();
      设置控件为窗体焦点:GetDlgItem(IDC_TREE1)->SetFocus();
      获取控件句柄:HWND hwndctrl = ::GetDlgItem(mainHwnd, IDC_TREE1);//获取树形控件的句柄IDC_TREE IDC_COMBO1
      获取当前最上层窗体的句柄: HWND mainHwnd = ::GetForegroundWindow();//获取当前topmost的窗体句柄
      获取当前窗体的焦点句柄: HWND currentFocus = ::GetFocus();

    相关文章

      网友评论

        本文标题:MFC中句柄、指针、ID之间的关联

        本文链接:https://www.haomeiwen.com/subject/vcmaxftx.html