MFC筆記-SDI窗口-類之間的調用總結

MFC筆記-SDI窗口-類之間的調用總結

學MFC的時候有一段時間被類與類之間的函數調用整的模模糊糊的,函數調用老是出錯。這裏記述一下自己的總結,供日後查閱。

SDI中的類與對象:

想自如的調用函數,首先要知道SDI窗口的基本框架。類嚮導創建的程序框架中無非也就是幫你建了4個窗口類(應用程序類,Frame框架類,文檔類,View視圖類),4個對象(應用程序對象,框架窗口類對象,文檔對象,視圖對象),大致是一個類對應一個實例對象。

編寫代碼其實就是在設計類(設計成員變量及成員函數),對程序來說相當於指明瞭規則,程序在運行時先按照我們寫的類的框架生成實體化的對象,然後對象再按照我們的規則來運行。

比如在視圖類中用類嚮導添加了一個“WM_LBUTTONDOWN”消息的處理函數。然後再編輯代碼添一行messagebox()函數,實際上就是告訴程序:“如果有人按下鼠標左鍵,那你就按照我給你的代碼彈出消息框”。就是這末個流程!

其次要知道要調用的函數是作用於對象而不是作用於類的,類比較虛,而對象是實實在在的,在一個類中調用其它類時要獲取對象的指針,然後再調用對象的成員函數來進行操作。
(當然貌似C++書中有些類(好像是靜態方法的,記不清了)是可以不創建對象直接調用的。不過應該用的很少)

如何在一個類中調用另一個類的函數呢?類與類之間雖然看得見,但是摸不着,他們之間的聯繫還是通過對象來完成的!舉個自身例子,當我還是MFC小白的時候(當然現在也是!哦呵呵呵!現在已經MFC小學二年級啦!),有一次在doc類自己添加了一個成員函數。然後我在view類中的一個函數中想要調用它,直接寫函數名編譯器馬上就不樂意了,後來我悟出來了:我在doc類中寫的函數是doc類的成員函數,想要調用它應該先獲取doc類的對象(文檔對象),然後你直接“文檔對象名.成員函數”或者“文檔對象指針->成員函數”不就行了,
那麼怎麼獲取doc的對象呢,可以先定義一個doc類的指針,然後調用GetDucument()函數,就一行代碼就行.下面來個示例(其實就是view類中的onDraw()函數的第一行代碼):

CXXXDoc* pDoc = GetDocument();

那麼程序是如何運行的嘞?這幾個類對應的對象在程序中是在哪創建的?如何在一個類中隨心所欲的調用其它類中的函數嘞?

程序首先創建一個應用程序對象,再在裏頭創建一個frame框架對象,再在frame對象中創建一個view視圖對象,(doc文檔對象就不列了因爲獲取其指針只需要一個GetDocument()就行了)。這樣它們三個層層包含。因爲MFC是基於消息驅動,接下來就開啓死循環大法,一有鼠標點擊之類的消息就趕緊處理,直到關掉程序爲止。

這幾個類對應的對象在程序中是在哪創建的?app類是在一開始的時候就最先創建的,框架類是在app類裏創建的,視圖類是在框架類裏創建的。具體參見孫鑫老師的C++課程(這裏給出鏈接:http://tech.163.com/special/0009159F/vc.html)。

如何在一個類中隨心所欲的調用其它類中的函數嘞?

文檔類最容易:調用GetDocument()函數獲得文檔對象指針,已經寫過。

app類也很容易:AfxGetApp()函數獲得應用程序指針,這個一般都是用來進一步獲得框架類對象或者視圖類對象的指針的。

框架類也不難,如下:

CWnd* AfxGetMainWnd( ); 
使用AfxGetMainWnd函數獲取MFC程序中的主框架類指針是一個常用作法。

view類也一樣:

CXXXView *pView = (CXXXView *)((CMainFrame *)AfxGetApp()->GetMainWnd())->GetActiveView();

注意:別忘了在Doc.cpp文件上面加上

include "XXXView.h"
include "MainFrm.h"

不加會報錯!

寫的有點亂,目標其實就只是解決在不同類之間數據,函數的調用這一個問題!

如果有錯誤!還請指出!筆者在此先行謝過!

2016.5.27

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章