DOC,VIEW,FRAME互相呼叫

2021-07-22 23:52:03 字數 4084 閱讀 5194

document/view模式,是為了在邏輯上,讓資料和顯示分開。

一般在document裡,定義document類的成員變數,來存資料,並用view來顯示。在document裡,當成員變數的資料改變時,你可以用updateallviews()來通知檢視更新。

在view裡,用getdocument來獲取與之對應document的指標,進而可以訪問document的成員變數,從而進行顯示document/view僅僅是mfc為你提供的一種很好的支援而已。

在mfc中實現經典的mvc結構,如下圖所示:

注意:

1、document和view之間的繫結:view繫結到document。

2、frame作為controller時,由於可以接收到輸入訊息,比較適合充當控制器。但是,由於檢視和文件繫結,所以在切換檢視時需要將檢視和文件分離開,然後再進行切換。

3、view作為contrller時,由於該檢視和文件是繫結的,所以,可以通過該檢視將其他檢視與文件關聯起來,其他檢視並不直接和文件繫結。因此,可以通過隱藏和顯示檢視來實現不同檢視之間的切換。

4、mfc的doc/view結構本質上就是mvc結構,是mvc結構的一種實現,但是對mvc結構進行了簡化。

先這麼多,以後再補充……

1)在view中獲得doc指標:

cyousdidoc *pdoc=getdocument();乙個視只能有乙個文件。

cmainframe *pmain =(cmainframe *)afxgetmainwnd();

3)在view中獲得mainframe指標:

cmainframe *pmai

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

cyouview *pview=(cyouview *)pmain->getactiveview();

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();

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

獲得cmainframe:

-在cchildframe中可用getparentframe()  

-在其它類中用afxgetmainwnd()  

獲得cchildframe:

-在cview中用getparentframe()  

-在cmainframe中用mdigetactive()或getactiveframe()  

-在其它類中用afxgetmainwnd()->mdigetactive()或afxgetmainwnd()->getactiveframe()  

獲得cdocument:

-在cview中用getdocument()  

-在cchildframe中用getactiveview()->getdocument()  

-在cmainframe中用  

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

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

-在其它類中  

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

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

獲得cview:

-在cdocument中   position   pos   =   getfirstviewposition();getnextview(pos)  

-在cchildframe中   getactiveview()  

-在cmainframe中  

-if   sdi:getactiveview()  

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

-在其它類中  

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

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

//  

不錯!!!  

不過要注意在doc中要取得view的指標c*view要注意類c*view宣告的問題,  

因為預設情況下,mfc在*view.h中已經包含了*doc.h,如果在*doc.h中包含  

*view.h,就會引起巢狀包含問題,這樣要在*doc.h中加入   class   c*view;  

而在*doc.cpp中加入   #include   "*view.h"  

//  

方便我一直專門操作的說:)  

//  

我先拋塊磚,有玉的砸過來!  

2。通過afxgetmainwnd()得到主視窗;  

3。通過cmdiframewnd::getactiveframe得到當前活動視窗;  

4。通過getnextwindow()遍例所有的子視窗;(如果要得到你想要的子視窗,可以通過特定的成員變數來標誌);  

6。通過cdoctemplate::getfirstdocposition()以及cdoctemplate的getnextdoc()組合來遍歷所有的該模板的文件物件,並用cdocument::getdoctemplate()來得到文件模板,用cdocment::gettitle()   或者getpathname()來判斷當前的文件是哪個。  

7。通過cdocuemt的getfirstviewpositon()以及getnextview()來遍歷檢視物件,一般通過訪問view的成員變數來區別各個檢視;通過cview::getdocument()來得到文件物件;  

8。frame->view:   通過getactiveview()方法;  

9。frame->doc: 

通過getactivedocument();  

10。view->frame: 

getparentframe();  

11。view->doc: 

getdocuemt()//前面已經說了。  

12。doc->view: 

//前面說了;  

13。doc->frame: 

//不知道有沒有很直接的方法。

time t tm systemtime 互相轉換

摘自 標頭檔案 time.h 函式原型 time t time time t timer 功 能 獲取當前的系統時間,返回的結果是乙個time t型別 即int64型別 其實就是乙個大整數,其值表示從cut coordinated universal time 時間1970年1月1日00 00 00...

time t tm systemtime 互相轉換

標頭檔案 time.h 函式原型 time t time time t timer 功 能 獲取當前的系統時間,返回的結果是乙個time t型別 即int64型別 其實就是乙個大整數,其值表示從cut coordinated universal time 時間1970年1月1日00 00 00 稱為...

VIEW DOC frame 互相訪問

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