天天看點

DECLARE_DYNCREATE等宏

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