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