VC MFC SDI MDI框架各部分指標獲取方式

2021-06-22 08:26:45 字數 4258 閱讀 4908

前人在csdn總結的,曾經幫助過我,整理總結一下,希望也能幫助一下別人。

獲得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的這幾個類的關係,可以很容易明白上面的這些亂七八糟的邏輯。

mainframe是主框架,也基本可以用全域性函式訪問到。

mainframe下是若干個childframe,childframe中若干個view和document(可能不成對),childframe管理著view,view和document進行互操作。

因此整體框架就出來了,一般除了直接應用的關係都可以通過mainframe-->active childframe-->active view-->document這條線進行訪問,這應該叫什麼來自?萬能方法吧^_^。

關於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為指標。

至於強制型別轉換也是為了安全特性考慮的,因為從同乙個基類之間的指標型別是互相相容的。這種強制型別轉換也許並不必要,但能避免一些可能出現的麻煩

VC MFC SDI MDI框架各部分指標獲取方式

獲得 獲得cmainframe 獲得cchildframe 獲得cdocument 獲得cview 在中 afxgetmainwnd m pmainwnd afxgetmainwnd mdigetactive afxgetmainwnd getactiveframe sdi afxgetmainwn...

VC MFC SDI MDI框架各部分指標獲取方式

獲得cmainframe 獲得cchildframe 獲得cdocument 獲得cview afxgetmainwnd m pmainwnd afxgetmainwnd mdigetactive afxgetmainwnd getactiveframe sdi afxgetmainwnd geta...

VC MFC SDI MDI框架各部分指標獲取方式

整理總結一下,希望也能幫助一下別人。獲得cmainframe 獲得cchildframe 獲得cdocument 獲得cview afxgetmainwnd m pmainwnd afxgetmainwnd mdigetactive afxgetmainwnd getactiveframe sdi ...