VC中句柄、指针、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;
HICON->ID--------HICON hIcon = AfxGetApp()->LoadIcon(nIconID);
                 HICON hIcon = LoadIcon(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(nIconID));

附注:获得窗口句柄三种方法
1.HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)
  HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName)
2.HWND WindowFromPoint(POINT& Point)//获得当前鼠标光标位置的窗口HWND


二、VC++中有关句柄和指针及其转换
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();
上一篇:用WinDBG远程调试程序


下一篇:Console程序显示彩色文本