MFC 各類間指標的獲得

2021-06-02 08:18:00 字數 3532 閱讀 1269

1) 在view中獲得doc指標

3) 在view中獲得mainframe指標

4) 獲得view(已建立)指標

5) 獲得當前文件指標

6) 獲得狀態列與工具欄指標

7) 獲得狀態列與工具欄變數

8) 在mainframe獲得選單指標

9) 在任何類中獲得應用程式類

10) 從文件類取得檢視類的指標(1)

12) 從文件模板獲得文件類指標

13) 在文件類中獲得文件模板指標

14) 從文件類取得檢視類的指標(2)

15) 從乙個檢視類取得另一檢視類的指標

1) 在view中獲得doc指標 cyousdidoc *pdoc=getdocument();乙個視只能有乙個文件。

5) 獲得當前文件指標 cdocument * pcurrentdoc =(cframewnd *)m_pmainwnd->getactivedocument();

6) 獲得狀態列與工具欄指標 cstatusbar * pstatusbar=(cstatusbar *)afxgetmainwnd()->getdescendantwindow(afx_idw_status_bar);c******* * p*******=(c******* *)afxgetmainwnd()->getdescendantwindow(afx_idw_*******);

7) 如果框架中加入工具欄和狀態列變數還可以這樣 (cmainframe *)getparent()->m_wnd*******;(cmainframe *)getparent()->m_wndstatusbar;

8) 在mainframe獲得選單指標 cmenu *pmenu=m_pmainwnd->getmenu();

10) 從文件類取得檢視類的指標我是從

學到的,從文件獲得檢視類指標目的一般為了控制同一文件的多個檢視的定位問題,我的體會特別是文書處理ceditview當產生多個檢視類時,這個功能是非常需要的。 cdocument類提供了兩個函式用於檢視類的定位:getfirstviewposition()和getnextview() virtual position getfirstviewposition() const;virtual cview* getnextview(position& rposition) const;注意:getnextview()括號中的引數用的是引用方式,因此執行後值可能改變。getfirstviewposition()用於返回第乙個檢視位置(返回的並非檢視類指標,而是乙個position型別值),getnextview()有兩個功能:返回下乙個檢視類的指標以及用引用呼叫的方式來改變傳入的position型別引數的值。很明顯,在test程式中,只有乙個檢視類,因此只需將這兩個函式呼叫一次即可得到ctestview的指標如下(需定義乙個position結構變數來輔助操作): ctestview* ptestview;position pos=getfirstviewposition();ptestview=getnextview(pos);這樣,便可到了ctestview類的指標ptestview.執行完幾句後,變數pos=null,因為沒有下乙個檢視類,自然也沒有下乙個檢視類的position.但是這幾條語句太簡單,不具有太強的通用性和安全特徵;當象前面說的那樣,當要在多個檢視為中返回某個指定類的指標時,我們需要遍歷所有檢視類,直到找到指定類為止。判斷乙個類指標指向的是否某個類的例項時,可用iskindof()成員函式時行檢查,如: pview->iskindof(runtime_class(ctestview));即可檢查pview所指是否是ctestview類。

有了以上基礎,我們已經可以從文件類取得任何類的指標。為了方便,我們將其作為乙個文件類的成員函式,它有乙個引數,表示要獲得哪個類的指標。實現如下: cview* ctestdoc::getview(cruntimeclass* pclass) if(!pview->iskindof(pclass)) return pview;}

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

1.pos為null,即已經不存在下乙個檢視類供操作;2.pview已符合要求。

1和2同是滿足。這是因為getnextview()的功能是將當前檢視指標改變成乙個檢視的位置同時返回當前檢視指標,因此pos是pview的下乙個檢視類的position,完全有可能既是pos==null又是pview符合需要。當所需的檢視是最後乙個檢視是最後乙個檢視類時就如引。因此需採用兩次判斷。使用該函式應遵循如下格式(以取得ctestview指標為例):ctestview* ptestview=(ctestview*)getview(runtime_class(ctestview));runtime_class是乙個巨集,可以簡單地理解它的作用:將類的名字轉化為cruntimeclass為指標。至於強制型別轉換也是為了安全特性考慮的,因為從同乙個基類之間的指標型別是互相相容的。這種強制型別轉換也許並不必要,但能避免一些可能出現的麻煩。

12)乙個文件模板可以有多個文件,每個文件模板都保留並維護了乙個所有對應文件的指標列表。 用cdoctemplate::getfirstdocposition函式獲得與文件模板相關的文件集合中第乙個文件的位置,並用position值作為cdoctemplate::getnextdoc的引數來重複遍歷與模板相關的文件列表。函式原形為: viaual position getfirstdocposition( ) const = 0; visual cdocument *getnextdoc(position & rpos) const = 0;  如果列表為空,則rpos被置為null.

13)在文件中可以呼叫cdocument::getdoctemplate獲得指向該文件模板的指標。函式原形如下: cdoctemplate * getdoctemplate ( ) const; 如果該文件不屬於文件模板管理,則返回值為null。

14)乙個文件可以有多個視。每乙個文件都保留並維護乙個所有相關視的列表。cdocument::addview將乙個視連線到文件上,將該視加入到文件相聯絡的視的列表中,並將視的文件指標指向該文件。當有file/new、file/open、windows/new或window/split的命令而將乙個新建立的視的物件連線到文件上時, mfc會自動呼叫該函式,框架通過文件/視的結構將文件和視聯絡起來。當然,程式設計師也可以根據自己的需要呼叫該函式。 virtual position getfirstviewposition( ) const; virtual cview * getnextview( position &rposition) cosnt; 應用程式可以呼叫cdocument::getfirstviewposition返回與呼叫文件相聯絡的視的列表中的第乙個視的位置,並呼叫cdocument::getnextview返回指定位置的視,並將rpositon的值置為列表中下乙個視的position值。如果找到的視為列表中的最後乙個視,則將rposition置為null.

15)從乙個檢視類取得另一檢視類的指標這個應用在多視的應用程式中很多見,一般如果自己在主程式或者主框架中做好變數記號,也可以獲得,還有比較通用的就是用文件類作中轉,以文件類的檢視遍歷定位,取得另乙個檢視類。這個功能從本文第10項中可以得到。

這些資料大部分都是從網上和msdn中獲得的,寫這個文件就是為了讓大家不用再尋找,列出標題,可操作性更強

獲得父視窗指標 獲得MFC視窗其它類指標的方法

獲得cmainframe 在cchildframe中可用getparentframe 在其它類中用afxgetmainwnd 獲得cchildframe 在cview中用getparentframe 在cmainframe中用mdigetactive 或getactiveframe 在其它類中用af...

FAQ 如何在 中獲得 的指標 MFC

問 請問如何在乙個全域性函式中,獲得它檢視類,文件類得指標啊?問 如何在乙個對話方塊中,獲得它檢視類,文件類得指標啊?舉例來說,如果檢視的成員函式需要建立乙個對話方塊,而對話方塊需要訪問文件,那麼可以在對話方塊類中宣告乙個文件指標,檢視的成員函式建立對話方塊之後把對話方塊中的文件指標變數的值設定為和...

關於獲得MFC視窗其它類指標的方法

關於獲得mfc視窗其它類指標的方法 學到的,從文件獲得檢視類指標目的一般為了控制同一文件的多個檢視的定位問題,我的體會 特別是文書處理ceditview當產生多個檢視類時,這個功能是非常需要的。cdocument類提供了兩個函式用於檢視類的定位 getfirstviewposition 和getne...