DECLARE_DYNAMIC
IMPLEMENT_DYNAMIC
當你從CObject派生類的時候,該宏使你的類有能力處理運作時資訊(比如類型識别).你可以通過RUNTIME_CLASS宏和CObject::IsKindOf函數在運作時确定你的類的對象的所屬類. 支援動态建立和儲存裝載,是以需要MFC動态建立和序列化的類都需要,比如文檔視圖MFC建立的。
DECLARE_DYNCREATE
IMPLEMENT_DYNCREATE
使CObject的派生類可以在運作時動态建立.系統可以該功能動态建立類的對象,舉個例子,當你的程式通過序列化從磁盤讀取對象資料時,可以動态建立該類的對象.
DECLARE_SERIAL
IMPLEMENT_SERIAL
該宏使擁有它的CObject派生類可以序列化
BEGIN_MESSAGE_MAP()
END_MESSAGE_MAP()
定義消息映射關系,擁有消息隊列的類都應該有,比如視窗類。
DECLARE_DYNCREATE
DECLARE_DYNCREATE( class_name )
參數: class_name 類的實際名字(不用引号括起來)。
說明:
使用DECLARE_DYNCREATE宏可以使每個CObject的派生類的對象具有運作時動态建立的能力。架構利用這種能力來動态建立對象,例如,當它在串行化過程中從磁盤讀取對象的時候。文檔、視和架構類必須支援動态建立,因為架構需要動态地建立它們。
在類的.H子產品中加入DECLARE_DYNCREATE宏,然後在每個需要通路這個類的對象的.CPP子產品中包含這個子產品。
如果在類聲明中包含了DECLARE_DYNCREATE,那麼必須在類的實作中包含IMPLEMENT_DYNCREATE宏。
關于DECLARE_DYNCREATE宏的更多資訊參見“Visual C++程式員指南”中的“CObject類主題”。
問答:
<<Dissecting MFC>>章看了一遍,想問:
1.哪些類要DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC,哪些類要DECLARE_DYNCREATE / IMPLEMENT_DYNCREATE,哪些類又要BEGIN_MESSAGE_MAP()/END_MESSAGE_MAP()呢?不會要靠死記吧,是什麼規律?
2.用Console程式來模仿MFC的動作,如不建立視窗則可以不要CView和CDocument類系吧?
3.在Persistence相關章節中,如果從某個CArchieve對象中讀出的一個類名在記憶體中沒有任何定義或聲明的資訊,這如何能Dynamic Create出來呢?(我想是不可能的)
回答1:
聲明DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE表明該類的執行個體可以動态建立。一般從CCmdTarget類繼承下來的類都有BEGIN_MESSAGE_MAP()/END_MESSAGE_MAP()對消息進行處理
2.沒有關系。
3.通過類名來建立執行個體這就是動态建立的功能阿,當然前提是你一定要事先在該類裡加上了DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE聲明,至于怎麼建立出來的,書裡講得很清楚吧,我記得是建立了一個資料結構的連結清單,。。。。
回答2
1.DECLARE_DYNAMIC隻需要運作時,就要用這個宏
IMPLEMENT_DYNAMIC,支援動态建立,其中包含了對DECLARE_DYNAMIC的支援
mfc用到了文檔模闆,是以,cdocument,cview,cframewnd派生的都需要IMPLEMENT_DYNAMIC
BEGIN_MESSAGE_MAP()/END_MESSAGE_MAP()定義消息映射的宏,派生自ccmdtarget的類都可以用它,(ccmdtarget的字面意義也是處理消息,command target,深入淺出mfc後面有)
2.用Console程式來模仿MFC的動作,如不建立視窗則可以不要CView和CDocument類系吧?
用cview和cdocument是為了更清楚的講解framework,否則就不是模仿mfc了。
3.類名已儲存在磁盤檔案中,讀取檔案,獲得類名字元串,再利用動态建立就可以建立了,書的第四部分第一章有詳細解釋
DECLARE_MESSAGE_MAP()
在一些資料上,有這麼一段文字:
DECLARE_MESSAGE_MAP()
說明:
使用者程式中的每個CCmdTarget派生類必須提供消息映射以處理消息。在類定義的末尾使用DECLARE_MESSAGE_MAP宏。接着,在定義類成員函數的.CPP檔案中,使用BEGIN_MESSAGE_MAP宏,每個使用者消息處理函數的宏項下面的清單以及END_MESSAGE_MAP宏。
注釋:
如果在DECLARE_MESSAGE_MAP之後定義任何一個成員,那麼必須為他們指定一個新存取類型(公共的,私有的,保護的)。
我覺得他描述得欠妥,我的了解是:
隻要有:隻要是CCmdTarget(用于所有能夠消息映射的基類)派生類,必有消息映射以處理消息,則在類的說明檔案的尾部有DECLARE_MESSAGE_MAP宏,在類的定義檔案中有BEGIN_MESSAGE_MAP宏和END_MESSAGE_MAP宏以處理使用者消息。
其中BEGIN_MESSAGE_MAP(參數1,參數2) ,參數1為該類的類名,參數2為該類基類的類名。
其中ON_MESSAGE(參數1,參數2),參數1為響應的消息,參數2為該消息對應的處理的函數名。
轉載于:https://www.cnblogs.com/cwbo-win/articles/3398637.html