MFC通过对话框窗口句柄获得对话框对象指针
mfc如何獲得控件句柄
CWnd *pWnd = GetDlgItem(ID_***); // 取得控件的指針
HWND hwnd = pWnd->GetSafeHwnd(); // 取得控件的句柄
?
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://忽略透明子窗口
總結
以上是生活随笔為你收集整理的MFC通过对话框窗口句柄获得对话框对象指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: H.264
- 下一篇: 什么是程序员正确的职场心态?