天天看點

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();