1. 程式人生 > >MFC通過對話方塊視窗控制代碼獲得對話方塊物件指標

MFC通過對話方塊視窗控制代碼獲得對話方塊物件指標

MFC在很多的對話方塊操作中,我們經常要用到在一個對話方塊中呼叫另一個對話方塊的函式或變數.可以用如下方法來解決.
HWND hWnd=::FindWindow(NULL,_T("
視窗名"));      //得到對話方塊的控制代碼
C***Dialog* pWnd= (C***Dialog*)FromHandle(hWnd); //由控制代碼得到對話方塊的物件指標

pWnd->xxx( );                                             //呼叫C***Dialog中的函式xxx();

VC MFC架構主要由CMyApp,  CMainFrame,   CMyDoc,   CMyView,   CMyDlg

5個主要的類,如何在每個類中相互獲取資料,需要在各自相關類中獲取其它類的指標。

1.獲得應用程式指標這個很簡單,一句話搞定:
   CMyApp* pApp=(CMyApp*)AfxGetApp();

2.獲得主框架指標

在類CWinThread裡面有一個公有的成員變數:CWnd* m_pMainWnd; 它存在的主要目的就是提供我們獲得CWnd指標,我們可以利用它來達到我們的目的:

CMainFrame* pAppFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;

ASSERT_KINDOF(CMainFrame, pAppFrame);

3. 

在框架類中呼叫文件類、檢視類
這裡我們可以利用GetActiveXXXXX()去掉用當前啟用的文件和檢視:
   CMyDoc*  pDoc=(CMyDoc*)GetActiveDocument();
   CMyView* pView=(CMyView*)GetActiveView();

4.在文件類中呼叫檢視類指標
我們可以利用文件類的成員函式GetFirstView()和GetNextView()遍歷檢視。

CMainFrame* pAppFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;

ASSERT_KINDOF(CMainFrame, pAppFrame);

CMyView *pView=(CMyView *) pAppFrame->GetActiveView();

//To get the first view in the list of views:

POSITION pos = GetFirstViewPosition();

CView* pFirstView = GetNextView( pos );

// This example uses CDocument::GetFirstViewPosition

// and GetNextView to repaint each view.

void CMyDoc::OnRepaintAllViews()

{

  POSITION pos = GetFirstViewPosition();

  while (pos != NULL)

  {

     CView* pView = GetNextView(pos);

     pView->UpdateWindow();

  }  

}

// An easier way to accomplish the same result is to call

// UpdateAllViews(NULL);

5.在檢視類中呼叫文件類
其實,在檢視類中有一個現成的成員函式供我們使用,那就是:GetDocument();利用它我們可以很容易的得到文件類指標,我們先看一下GetDocument()函式的實現:
    CColorButtonDoc* CColorButtonView::GetDocument() 
   {
       ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CColorButtonDoc)));
       return (CColorButtonDoc*)m_pDocument;
   }

這裡實際上是將m_pDocument強制轉換成CColorButtonDoc*,也就是我們想要的。

CDSplitDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);  

6.從對話方塊向文件類寫入資料

CMyApp* pApp=(CMyApp*)AfxGetApp();

CMainFrame* pAppFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;

ASSERT_KINDOF(CMainFrame, pAppFrame);

CMyDoc* pDoc=(CMyDoc*) pAppFrame->GetActiveDocument();

//CView *pView=(CView *) pAppFrame->GetActiveView();

//CMyDoc* pDoc =(CMyDoc*) pView ->GetDocument();

ASSERT_VALID(pDoc);

7.獲取工具條的指標
在預設狀態下,有一個預設的工具條AFX_IDW_TOOLBAR,我們可以根據相應的ID去獲取工具條指標,方法如下:
     CToolBar* pToolBar=(CToolBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_TOOLBAR);
     是不是很簡單? 
8.獲取狀態條的指標
在預設狀態下,有一個預設的狀態條AFX_IDW_STATUS_BAR,我們自然也可以根據相應的ID去獲取狀態條指標,方法如下:
     CStatusBar* pToolBar=(CStatusBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);
     是不是同樣很簡單?

9.獲取控制元件的指標 這裡有兩種方法。
    
一、呼叫CWnd: : GetDlgItem,獲取一個CWnd*指標呼叫成員函式。例如,我們想獲取CButton指標,方法如下:
    CButton* pButton=(CButton*) GetDlgItem (IDC_MYBUTTON);
    二、可以使用ClassWizard將控制元件和成員變數聯絡起來。在ClassWizard中簡單地選擇Member Variables標籤,然後選擇Add Variable ...按鈕。如果在對話資源編輯器中,按下Ctrl鍵並雙擊控制元件即可轉到Add Member Variable對話。

10.通過滑鼠獲得子視窗指標
這裡我們要用到一個不太常用的函式:ChildWindowFromPoint。他的原型如下:
   CWnd* ChildWindowFromPoint(POINT point) const;
   CWnd* ChildWindowFromPoint(POINT point,UINT nFlags) const;
   這個函式用於確定包含指定點的子視窗,如果指定點在客戶區之外,函式返回NULL;如果指定點在客戶區內,但是不屬於任何一個子視窗,函式返回該CWnd的指標;如果有多個子視窗包含指定點,則返回第一個子視窗的指標。不過,這裡還要注意的是:該函式返回的是一個偽視窗指標,不能將它儲存起來供以後使用。
   對於第二個引數nFlags有幾個含義:
   CWP_ALL             file://忽略任何子視窗
   CWP_SKIPNIVSIBLE    file://略不可見子視窗
   CWP_SKIPDISABLED    file://略禁止的子視窗
  CWP_SKIPRANSPARENT  file://略透明子視窗