国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

MFC的Document和View類之間訪問

2019-11-08 02:28:11
字體:
供稿:網(wǎng)友

 轉(zhuǎn)自http://blog.csdn.net/qiangxyz/article/details/5836254

 

獲得CWinApp

獲得CMainFrame

獲得CChildFrame

獲得CDocument

獲得CView

在CWinApp

 

AfxGetMainWnd()

m_pMainWnd

AfxGetMainWnd()->MDIGetActive()

AfxGetMainWnd()->GetActiveFrame()

SDI:AfxGetMainWnd()->GetActiveView()->GetDocument()

MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()->GetDocument()

SDI:AfxGetMainWnd()->GetActiveView()  

MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()

在CMainFrame中

AfxGetApp()

theApp

 

MDIGetActive()

GetActiveFrame()

SDI:GetActiveView()->GetDocument()  

MDI:MDIGetActive()->GetActiveView()->GetDocument()  

SDI:GetActiveView()  

MDI:MDIGetActive()->GetActiveView()

在CChildFrame中

AfxGetApp()

theApp

GetParentFrame()

 

GetActiveView()->GetDocument()  

GetActiveView()

在CDocument中

AfxGetApp()

theApp

AfxGetMainWnd()  

AfxGetMainWnd()->MDIGetActive()

AfxGetMainWnd()->GetActiveFrame()

 

POSITION   pos   =   GetFirstViewPosition();GetNextView(pos)  

在CView中

AfxGetApp()

theApp

AfxGetMainWnd()  

GetParentFrame()  

GetDocument()

 

在其他類中

AfxGetApp()

AfxGetMainWnd()  

AfxGetMainWnd()->MDIGetActive()

AfxGetMainWnd()->GetActiveFrame()

SDI:AfxGetMainWnd()->GetActiveView()->GetDocument()

MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()->GetDocument()

SDI:AfxGetMainWnd()->GetActiveView()  

MDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()

MainFrame是主框架,也基本可以用全局函數(shù)訪問到。MainFrame下是若干個(gè)ChildFrame,ChildFrame中若干個(gè)View和Document(可能不成對(duì)),ChildFrame管理著View,View和Document進(jìn)行互操作。因此整體框架就出來了,一般除了直接應(yīng)用的關(guān)系都可以通過MainFrame-->Active ChildFrame-->Active View-->Document這條線進(jìn)行訪問

一、SDI

1:在CMainFrame框架中如何得到視圖類的指針:

C **View * pView;

pView=(C**View*)((CFrameWnd*)AfxGetApp()

->m_pMainWnd)->GetActiveView();

    CWinApp中的m_pMainWnd變量就是CMainFrame的指針。每一個(gè)MFC應(yīng)用程序都有一個(gè)CWinApp派生類的對(duì)象。而 CWinApp 類中有一個(gè) CWnd * m_pMainWnd 成員變量。

    當(dāng)新建一個(gè)MFC應(yīng)用程序的時(shí)候,在 InitInstance虛函數(shù)里都會(huì)出現(xiàn)對(duì) m_pMainWnd 賦值的語句.唯一的例外是單文檔界面的MFC應(yīng)用程序,你無法在 InitInstance 函數(shù)里看到這段代碼,因?yàn)樗呀?jīng)被隱藏在 PRocessShellCommand 這個(gè)函數(shù)里了。

    因?yàn)锳fxGetApp()得到的是CWinApp類的對(duì)象,且AfxGetApp返回值為CWinApp對(duì)象指針,因?yàn)槟闶窃谧约簞?chuàng)建的項(xiàng)目中得到CWndApp成員函數(shù)或者成員變量,所以你必須強(qiáng)制轉(zhuǎn)換為你自己的項(xiàng)目中的類,才能找到成員函數(shù)或者變量。

    注: 在單文檔中,獲得視指針的最簡單的方法還是:

    ((C**View *)CFrameWnd::GetActiveView())

2:當(dāng)然在CMainFrame中也可以得到文檔類的指針:

CMyDocument* pDoc;

pDoc=(CMyDocument*)((CFrameWnd*)AfxGetApp()->m_pMainWnd)

->GetActiveDocument();

3:由上面可以知道:在View中怎樣獲得MainFrame指針

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

注: 從視圖類中獲得MainFrame指針也可以:

((CMainFrame *)CWnd::GetParentFrame())或者

((CMainFrame *)AfxGetMainWnd())

二、MDI

當(dāng)然對(duì)于MDI程序,由于子窗口才是文檔框窗,因此首先要用GetActiveFrame()取得活動(dòng)子框架窗口,然后通過該子窗口獲取活動(dòng)視圖和文檔:

CMDIChildWnd* pChild=(CMDIChildWnd*)((CFrameWnd*)AfxGetApp()

                                ->m_pMainWnd)->GetActiveFrame();

取得活動(dòng)視圖:

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

取得活動(dòng)文檔:

CMyDocument* pDoc=pChild->GetActiveDocument();

注: 也可以用這種方法來得到多文檔中的視指針

獲得活動(dòng)子框架窗口

CMDIChildWnd* pChild=(CMDIChildWnd*)GetActiveFrame();

CMDIChildWnd* pChild=MDIGetActive();

獲得活動(dòng)子幀窗口的活動(dòng)視圖

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

三、還是MDI

1.從視圖類獲得文檔類的指針

在視圖類中需要引用文檔類的地方之前,使用以下語句:

C*Doc *pDoc=(C*Doc*)GetDocument();

2.從文檔類取得視圖類的指針CDocument類提供了兩個(gè)函數(shù)用于視圖類的定位:

GetFirstViewPosition()和GetNextView()

注意:GetFirstViewPosition()用于返回第一個(gè)視圖位置(返回的并非視圖類指針,而是一個(gè)POSITION類型值),GetNextView()有兩個(gè)功能:返回下一個(gè)視圖類的指針以及用引用調(diào)動(dòng)的方式來改變傳入的POSITION類型參數(shù)的值。在Test程序中,只有一個(gè)視圖類,因此只需將這兩個(gè)函數(shù)調(diào)用一次即可得到 CTestView的指針如下:

C*View* pView;

POSITION pos=GetFirstViewPosition();

pView=GetNextView(pos);

這樣便可到了C*View類的指針pView。執(zhí)行完成后,變量pos=NULL,因?yàn)闆]有下一個(gè)視圖類,自然也沒有下一個(gè)視圖類的 POSITION。但是這幾條語句太簡單,不具有太強(qiáng)的通用性和安全特征;當(dāng)要在多個(gè)視圖為中返回某個(gè)指定類的指針時(shí),我們需要遍歷所有視圖類,直到找到指定類為止。判斷一個(gè)類指針指向的是否某個(gè)類的實(shí)例時(shí),可用IsKindOf()成員函數(shù)時(shí)行檢查.

如:

pView->IsKindOf(RUNTIME_CLASS(C*View));

即可檢查pView所指是否是C*View類。

有了以上基礎(chǔ),我們已經(jīng)可以從文檔類取得任何類的指針。為了方便,我們將其作為一個(gè)文檔類的成員函數(shù),它有一個(gè)參數(shù),表示要獲得哪個(gè)類的指針。實(shí)現(xiàn)如下:

CView* C*Doc::GetVieww(CRuntimeClass* pClass)

{

CView* pView;

POSITION pos=GetFirstViewPosition();

while(pos!=NULL)

{

pView=GetNextView(pos);

if(!pView->IsKindOf(pClass))

break;

}

if(!pView->IsKindOf(pClass))

{

AfxMessageBox("Connt Locate the View.");

return NULL;

}

return pView;

}

其中用了兩次視圖類的成員函數(shù)IsKindOf()來判斷,是因?yàn)橥顺鰓hile循環(huán)有三種可能:1.pos為NULL,即已經(jīng)不存在下一個(gè)視圖類供操作;

2.pView已符合要求。

3.1和2同是滿足。這是因?yàn)镚etNextView()的功能是將當(dāng)前視圖指針改變成一下個(gè)視圖的位置同時(shí)返回當(dāng)前視圖指針,因此pos是pView的下一個(gè)視圖類的POSITION,完全有可能既是pos==NULL又是pView符合需要。因此需采用兩次判斷。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 西乌珠穆沁旗| 景东| 公主岭市| 拉萨市| 山东省| 邳州市| 宁陵县| 乐亭县| 张家界市| 长沙县| 建阳市| 祁门县| 望谟县| 万年县| 当雄县| 元阳县| 北川| 公主岭市| 扶风县| 洛川县| 蒙山县| 包头市| 荃湾区| 平凉市| 大邑县| 上栗县| 宽甸| 防城港市| 上杭县| 腾冲县| 双鸭山市| 扶风县| 泰顺县| 宁晋县| 侯马市| 吕梁市| 威远县| 如皋市| 台北市| 大港区| 渭南市|