HWND hWnd=::FindWindow(NULL,_T("Sphere")); //得到對話框的句柄
C***Dialog* pWnd= (C***Dialog*)C***Dialog::FromHandle(hWnd); //由句柄得到對話框的對象指針
pWnd->xxx( ); //調用C***Dialog中的函數xxx();
以上參考:http://www.cnblogs.com/del/archive/2008/02/28/1085432.html。
通過窗體類函數:CWnd *GetWindow獲得窗體指針,pWnd->m_hWnd(The handle of the Windows window attached to this CWnd)在::FromHandle(hWnd);
以下這節內容主要是一般的框架。然后再講多線程中的指針使用。使用到的類須要包括響應的頭文件。首先一般獲得本類(視,文檔。對話框都支持)實例指針this,用this的目的,主要能夠通過類中的函數向其它類或者函數中發指針,以便於在非本類中操作和使用本類中的功能。
這當中的關鍵在於理解 m_pMainWnd, AfxGetApp(),AfxGetMainWnd() 的意義!
1) 在View中獲得Doc指針
CYouSDIDoc *pDoc=GetDocument();一個視僅僅能有一個文檔。
2) 在App中獲得MainFrame指針
CWinApp 中的 m_pMainWnd變量就是MainFrame的指針。也能夠: CMainFrame *pMain =(CMainFrame *)AfxGetMainWnd();
3) 在View中獲得MainFrame指針
CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;
4) 獲得View(已建立)指針
CMainFrame *pMain=(CmaimFrame *)AfxGetApp()->m_pMainWnd;
CyouView *pView=(CyouView *)pMain->GetActiveView();
5) 獲得當前文檔指針
CDocument * pCurrentDoc =(CFrameWnd *)m_pMainWnd->GetActiveDocument();
6) 獲得狀態欄與工具欄指針
CStatusBar * pStatusBar=(CStatusBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);
CToolBar * pToolBar=(CtoolBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);
7) 假設框架中增加工具欄和狀態欄變量還能夠這樣
(CMainFrame *)GetParent()->m_wndToolBar;
(CMainFrame *)GetParent()->m_wndStatusBar;
8) 在Mainframe獲得菜單指針
CMenu *pMenu=m_pMainWnd->GetMenu();
9) 在不論什么類中獲得應用程序類
AfxGetInstanceHandle 得到句柄,AfxGetApp 得到指針
B1.怎樣在自己的類和“應用程序類”中獲得“文檔類”的句柄?
SDI AfxGetMainWnd() -> GetActiveView() -> GetDocument() 得到指針
MDI AfxGetMainWnd() -> MDIGetActive() -> GetActiveView() -> GetDocument() 得到指針
B3.怎樣在“框架類”中獲得“文檔類”句柄?
SDI GetActiveView() -> GetDocument() 得到指針。MDI MDIGetActive() -> GetActiveView() -> GetDocument() 從 CMainFrame 得到指針,GetActiveView() -> GetDocument() 從 CChildFrame 得到指針
B4.怎樣在“視圖類”中獲得“文檔類”句柄?
GetDocument()
C1.怎樣在“文檔類”中獲得“視圖類”句柄?
GetView()。調用 GetFirstViewPosition 和 GetNextView 函數得到指針。
C2.怎樣在自己的類和“應用程序類”中獲得“視圖類”句柄?
SDI GetActiveView 得到指針
MDI MDIGetActive() -> GetActiveView() 從 CMainFrame 得到指針,GetActiveView 從 CChildFrame 得到指針
最后提醒大家。在提取到各個句柄之后。由於初次提取的都是標准類句柄,所以,在使用時要注意將標准句柄轉換成自己的類的句柄。
如:
AfxGetApp();//得到的是WinApp類的句柄。
所以操作前記得轉換成自定義的類的句柄。
如:((CMyApp*)AfxGetApp())->XXXX()。//這的xxxx()就是你定義的類中間的成員。
(二)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;
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
本文來自CSDN博客:http://blog.csdn.net/cy757/archive/2009/08/07/4423756.aspx
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();
本文來自CSDN博客:http://blog.csdn.net/lovegod12/archive/2009/04/19/4092249.aspx