找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3375|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

MFC獲取各個窗口(體)之間的指針(對象)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:104287 發(fā)表于 2016-1-31 00:59 | 只看該作者 回帖獎勵 |正序?yàn)g覽 |閱讀模式
MFC在很多的對話框操作中,我們經(jīng)常要用到在一個對話框中調(diào)用另一個對話框的函數(shù)或變量.可以用如下方法來解決.

   HWND hWnd=::FindWindow(NULL,_T("Sphere"));      //得到對話框的句柄
   C***Dialog* pWnd= (C***Dialog*)C***Dialog::FromHandle(hWnd); //由句柄得到對話框的對象指針
   pWnd->xxx( );   //調(diào)用C***Dialog中的函數(shù)xxx();
以上參考:http://www.cnblogs.com/del/archive/2008/02/28/1085432.html。


通過窗口類函數(shù):CWnd *GetWindow獲得窗口指針,pWnd->m_hWnd(The handle of the Windows window attached to this CWnd)在::FromHandle(hWnd);



獲取主窗口句柄:      CWnd *wnd  = AfxGetMainWnd();
                     HWND hwnd = wnd->GetSafeHwnd();

設(shè)置控件為窗口焦點(diǎn):GetDlgItem(IDC_TREE1)->SetFocus();

獲取控件句柄:HWND hwndctrl = ::GetDlgItem(mainHwnd, IDC_TREE1);//獲取樹形控件的句柄IDC_TREE IDC_COMBO1

獲取當(dāng)前最上層窗口的句柄: HWND  mainHwnd = ::GetForegroundWindow();//獲取當(dāng)前topmost的窗口句柄
獲取當(dāng)前窗口的焦點(diǎn)句柄:        HWND  currentFocus = ::GetFocus();

(一)MFC中獲得各個類的句柄總結(jié)

    VC中編程,最大的障礙和問題就是消息機(jī)制和指針獲取與操作。其實(shí)這些內(nèi)容基本上是每本VC學(xué)習(xí)工具書上
必講的內(nèi)容,而且通過MSDN很多問題都能解決。下面文字主要是個人在編程中指針使用的一些體會,說的不當(dāng)?shù)牡胤秸堉刚。一般我們使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架,無論是多文檔還是單文檔,都存在指針獲取和操作問題。
    下面這節(jié)內(nèi)容主要是一般的框架,然后再講多線程中的指針使用。使用到的類需要包含響應(yīng)的頭文件。首先一般獲得本類(視,文檔,對話框都支持)實(shí)例指針this,用this的目的,主要可以通過類中的函數(shù)向其他類或者函數(shù)中發(fā)指針,以便于在非本類中操作和使用本類中的功能。
這其中的關(guān)鍵在于理解 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) 獲得當(dāng)前文檔指針
CDocument * pCurrentDoc =(CFrameWnd *)m_pMainWnd->GetActiveDocument();
6) 獲得狀態(tài)欄與工具欄指針
CStatusBar * pStatusBar=(CStatusBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);
CToolBar * pToolBar=(CtoolBar *)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);
7) 如果框架中加入工具欄和狀態(tài)欄變量還可以這樣
(CMainFrame *)GetParent()->m_wndToolBar;
(CMainFrame *)GetParent()->m_wndStatusBar;
8) 在Mainframe獲得菜單指針
CMenu *pMenu=m_pMainWnd->GetMenu();
9) 在任何類中獲得應(yīng)用程序類
AfxGetInstanceHandle 得到句柄,AfxGetApp 得到指針
B1.如何在自己的類和“應(yīng)用程序類”中獲得“文檔類”的句柄?
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(),調(diào)用 GetFirstViewPosition 和 GetNextView 函數(shù)得到指針。
C2.如何在自己的類和“應(yīng)用程序類”中獲得“視圖類”句柄?
SDI GetActiveView 得到指針
MDI MDIGetActive() -> GetActiveView() 從 CMainFrame 得到指針,GetActiveView 從 CChildFrame 得到指針

最后提醒大家,在提取到各個句柄之后,因?yàn)槌醮翁崛〉亩际菢?biāo)準(zhǔn)類句柄,所以,在使用時要注意將標(biāo)準(zhǔn)句柄轉(zhuǎn)換成自己的類的句柄。如:
AfxGetApp();//得到的是WinApp類的句柄,
所以操作前記得轉(zhuǎn)換成自己定義的類的句柄。
如:((CMyApp*)AfxGetApp())->XXXX();//這的xxxx()就是你定義的類中間的成員。
(二)MFC中句柄、指針、ID之間的轉(zhuǎn)換
win32直接操作的是句柄HANDLE,每個句柄就對應(yīng)windows窗口,而vc對HANDLE進(jìn)行類封裝,間接操作的都是HANDLE,現(xiàn)在句柄只是類的一個成員變量。
從句柄到指針
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,句柄,指針三者相互轉(zhuǎn)換函數(shù)
ID--HANDLE--HWND三者之間的互相轉(zhuǎn)換
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)//獲得當(dāng)前鼠標(biāo)光標(biāo)位置的窗口HWND

本文來自CSDN博客:http://blog.csdn.net/cy757/archive/2009/08/07/4423756.aspx



VC++中有關(guān)句柄和指針及其轉(zhuǎn)換
1.MFC窗口的句柄和指針的轉(zhuǎn)換
      (1) 一般窗口對象都會有一個其對應(yīng)的句柄變量,所以我們可以取此對象的m_hWnd屬性來得到句柄。
      (2)使用GetSafeHwnd函數(shù)取得程序所在窗口類的句柄
      (3)使用FromHandle函數(shù)來通過句柄得到其想要的指針
      其他的一些方法:
      GetActiveWindow 取當(dāng)前活動窗口句柄
      AfxGetMainWnd   取主窗口句柄
      GetForegroundWindow 取前臺窗口句柄
      FindWindow尋找參數(shù)指定的窗口
      EnumWindow枚舉窗口

2. 上下文無關(guān)設(shè)備的句柄和指針的轉(zhuǎn)換
      (1)this->m_hDC
      (2)CDC::GetSafeHdc
      (3)可以使用FromHandle函數(shù)來通過句柄得到其想要的指針

3.Gdi對象的句柄和指針的轉(zhuǎn)換
      (1)this->m_hObject
      (2)CGdiObject::GetSafeHandle
      (3)可以使用FromHandle函數(shù)來通過句柄得到其想要的指針

4.窗口、控件的指針和句柄的相互轉(zhuǎn)化
(1)指針轉(zhuǎn)化為句柄
在MFC應(yīng)用程序中首先要獲得窗口的指針,然后將其轉(zhuǎn)化為句柄
CWnd* pWnd;
HANDLE hWnd = pWnd->GetSafeHwnd();
(2)句柄轉(zhuǎn)化為指針
在MFC應(yīng)用程序中首先獲得對話框控件的句柄,然后獲得其指針
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();





分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表