MFC多文件框架

2021-06-20 18:02:55 字數 3999 閱讀 1909

m_viewlist.addtail(pview);

assert(pview->m_pdocument == null); // must be un-attached

pview->m_pdocument = this;

——————————————————————————————————————————

獲得cmainframe 獲得

cchildframe

獲得cdocument

獲得cview

afxgetmainwnd()

m_pmainwnd

afxgetmainwnd()->

mdigetactive()

afxgetmainwnd()->getactiveframe()

sdi:afxgetmainwnd()->getactiveview()->getdocument()

mdi:afxgetmainwnd()->mdigetactive()->getactiveview()->getdocument()

sdi:afxgetmainwnd()->getactiveview()

mdi:afxgetmainwnd()->mdigetactive()->getactiveview()

cmainframe

mdigetactive()

getactiveframe()

sdi:getactiveview()->getdocument() 

mdi:mdigetactive()->getactiveview()->getdocument() 

sdi:getactiveview()  

mdi:mdigetactive()->getactiveview()

cchildframe

getparentframe()

getactiveview()->getdocument() 

getactiveview()

cdocument

afxgetmainwnd() 

afxgetmainwnd()->mdigetactive()

afxgetmainwnd()->getactiveframe()

position   pos   =   getfirstviewposition();getnextview(pos)

cview

afxgetmainwnd() 

getparentframe() 

getdocument()

在其他類中

afxgetmainwnd() 

afxgetmainwnd()->mdigetactive()

afxgetmainwnd()->getactiveframe()

sdi:afxgetmainwnd()->getactiveview()->getdocument()

mdi:afxgetmainwnd()->mdigetactive()->getactiveview()->getdocument()

sdi:afxgetmainwnd()->getactiveview()

mdi:afxgetmainwnd()->mdigetactive()->getactiveview()

關於mfc下的文件和檢視以及框架之間的訪問, 這些問題已經是老生常談了,但我覺得還是都沒有詳細的說明,特

注: 從檢視類中獲得主幀視窗類指標:用函式:cwnd::getparentframe()或afxgetmainwnd()也

可達到目的。getparentframe()的工作原理是在父視窗鏈中搜尋,直到找到cframewnd或其派生類為止,並返回其指標。

((cmainframe *)cwnd::getparentframe())

或者((cmainframe *)afxgetmainwnd()) 

二:當然對於mdi程式,由於子視窗才是文件框窗,因此首先要用getactiveframe()取得活動子框架視窗,然後通過該子視窗獲取活動檢視和文件:

>getactiveframe();

取得活動檢視:

cmyview* pview=(cmyview*)pchild->getactiveview();

取得活動文件:

cmydocument* pdoc=pchild->getactivedocument();

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

//獲得活動子框架視窗

cmdichildwnd* pchild=(cmdichildwnd*)getactiveframe();

//或:

cmdichildwnd* pchild=mdigetactive();

//獲得活動子幀視窗的活動檢視

cmyview* pview=(cmyview*)pchild->getactiveview();

三: 1.   從檢視類獲得文件類的指標 

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

c*doc *pdoc=(c*doc*)getdocument();

以後便可使用pdoc指標訪問文件類。

2.    從文件類取得檢視類的指標 cdocument類提供了兩個函式用於檢視類的定位:

getfirstviewposition()和getnextview()

注意:getnextview()括號中的引數用的是引用方式,因此執行後值可能改變.getfirstviewposition()用於

返 回第乙個檢視位置(返回的並非檢視類指標,而是乙個position型別值),getnextview()有兩個功能:返回下乙個檢視類的指標以及用引用 調動的方式來改變傳入的position型別引數的值。很明顯,在test程式中,只有乙個檢視類,因此只需將這兩個函式呼叫一次即可得到 ctestview的指標如下(需定義乙個position結構變數來輔助操作):

c*view* pview;

position pos=getfirstviewposition();

pview=getnextview(pos);

這 樣,便可到了c*view類的指標pview.執行完成幾句後,變數pos=null,因為沒有下乙個檢視類,自然也沒有下乙個檢視類的 position.但是之幾條語句太簡單,不具有太強的通用性和安全特徵;當象前面說的那樣,當要在多個檢視為中返回某個指定類的指標時,我們需要遍歷所 有檢視類,直到找到指定類為止。判斷乙個類指標指向的是否某個類的例項時,可用iskindof()成員函式時行檢查. 如:

pview->iskindof(runtime_class(c*view));

即可檢查pview所指是否是c*view類。

有了以上基礎,我們已經可以從文件類取得任何類的指標。為了方便,我們將其作為乙個文件類的成員函式,它有乙個引數,表示要獲得哪個類的指標。實現如下:

cview* c*doc::getvieww(cruntimeclass* pclass)

if(!pview->iskindof(pclass))

return pview;}

其中用了兩次檢視類的成員函式iskindof()來判斷,是因為退出while迴圈有三種可能:

1.pos為null,即已經不存在下乙個檢視類供操作;

2.pview已符合要求。

3.1 和2同是滿足。這是因為getnextview()的功能是將當前檢視指標改變成乙個檢視的位置同時返回當前檢視指標,因此pos是pview的下乙個檢視類的position,完全有可能既是pos==null又是pview符合需要。當所需的檢視是最後乙個檢視是最後乙個檢視類時就如引。因此需採用兩次判斷。

使用該函式應遵循如下格式(以取得ctestview指標為例):

ctestview* ptestview=(ctestview*)getview(runtime_class(ctestview));

runtime_class是乙個巨集,可以簡單地理解它的作用:將類的名字轉化為cruntimeclass為指標。

至於強制型別轉換也是為了安全特性考慮的,因為從同乙個基類之間的指標型別是互相相容的。這種強制型別轉換也許並不必

MFC多文件框架

m viewlist.addtail pview assert pview m pdocument null must be un attached pview m pdocument this 獲得cmainframe 獲得 cchildframe 獲得cdocument 獲得cview afxg...

MFC多文件框架

m viewlist.addtail pview assert pview m pdocument null must be un attached pview m pdocument this 獲得cmainframe 獲得 cchildframe 獲得cdocument 獲得cview afxg...

MFC多文件框架

文件 檢視 框架視窗 文件模板之間的相互關係,關鍵要理解他們的結構 m viewlist.addtail pview assert pview m pdocument null must be un attached pview m pdocument this 獲得cmainframe 獲得 cc...