MFC擷取各個視窗(體)之間的指標(對象)

來源:互聯網
上載者:User

標籤:des   style   blog   http   color   使用   

MFC在很多的對話方塊操作中,我們經常要用到在一個對話方塊中調用另一個對話方塊的函數或變數.可以用如下方法來解決.
   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);
擷取主視窗控制代碼:      CWnd *wnd  = AfxGetMainWnd();                     HWND hwnd = wnd->GetSafeHwnd();
設定控制項為視窗焦點:GetDlgItem(IDC_TREE1)->SetFocus();
擷取控制項控制代碼:HWND hwndctrl = ::GetDlgItem(mainHwnd, IDC_TREE1);//擷取樹形控制項的控制代碼IDC_TREE IDC_COMBO1
擷取當前最上層視窗的控制代碼: HWND  mainHwnd = ::GetForegroundWindow();//擷取當前topmost的視窗控制代碼擷取當前視窗的焦點控制代碼:        HWND  currentFocus = ::GetFocus();
(一)MFC中獲得各個類的控制代碼總結 
    VC中編程,最大的障礙和問題就是訊息機制和指標擷取與操作。其實這些內容基本上是每本VC學習工具書上必講的內容,而且通過MSDN很多問題都能解決。下面文字主要是個人在編程中指標使用的一些體會,說的不當的地方請指正。一般我們使用的架構是VC提供的Wizard產生的MFC App Wizard(exe)架構,無論是多文檔還是單文檔,都存在指標擷取和操作問題。
    下面這節內容主要是一般的架構,然後再講多線程中的指標使用。使用到的類需要包含響應的標頭檔。首先一般獲得本類(視,文檔,對話方塊都支援)執行個體指標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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.