深入淺出MFC之Frame6

2021-05-22 09:24:41 字數 2528 閱讀 5794

動態建立機制

在cruntimeclass結構中加入了兩個元素

cobject* createobject()函式和static cruntimeclass pascal load()

於是又多了兩個巨集

declare_dyncreate巨集和implement_dyncreate巨集

#define declare_dyncreate(class_name)/

declare_dynamic(class_name)/

static cobject* pascal createobject();

#define implement_dyncreate(class_name,base_class_name)/

cobject* pascal class_name::createobject()/

_implement_runtimeclass(class_name,base_class_name,0xffff,/

class_name::createobject)

由上可知,declare_dyncreate是declare_dynamic的增強版,也就是說,擁有動態建立能力的類庫,必然亦有執行時型別識別能力

class cframewnd:public cwnd

;implement_dyncreate(cframewnd,cwnd)

於是被展開如下

class cframewnd:public cwnd

cobject* pascal cframewnd::createobject()

static char _lpszcframewnd="cframewnd";

cruntimeclass cframewnd::classcframewnd=;

staitc afx_classinit _init_cframewnd(&cframewnd::classcframewnd);

cruntimeclass* cframewnd::getruntimeclass() const

這個類的結構中的m_pfncreateobject不再為null,而是被賦予函式指標cframewnd::createobject,而用declare_dynamic來宣告時這個函式指標被賦值null,因為declare_dynamic不具有動態建立功能,所以這個建立函式指標為null

在main()函式中加上這一段**

void main()

cobject* cruntimeclass::createobject()

cobject* pobject=null;

pobject= (*m_pfncreateobject)();

return pobject;

}這個函式先檢查結構中的m_pfncreateobject是否為空,為空則不能建立物件,凡是m_pfncreateobject不為null者,即可動態建立,若不為空,則利用m_pfncreateobject所指向的函式來建立乙個物件的指標。

cruntimeclass* pascalcruntimeclass::load()

trace1("error:class not found:%s /n",szclassname;

return null;

}這個函式首先需要輸入乙個類名,cruntimeclass* pclass這條**宣告了乙個結構的指標,然後利用這個指標來遍歷鍊錶

當找到和這個類名相同的類時,則返回這個類的結構的指標,即pclass。

這其中有幾個creat函式,共有三處,其聯絡如下

在結構中有:

cobject* (pascal* m_pfncreateobject)();稱為函式一

cobject* createobject();函式二

在類中有static cobject* pascal createobject();函式三

其中,結構中的函式一是用來記錄類中的函式三的指標的(正好對應著cruntimeclass記錄類的資訊),因為想要訪問這個類時可以獲得的只有這個類的結構指標而以

函式二則是通過呼叫函式一來實現建立物件的,並且在函式二中還要對m_pfncreateobject進行檢查是否為null

函式三在類定義中,如上面的

cobject* pascal cframewnd::createobject()

返回的是乙個當前類物件的指標,真正建立物件的create函式只有乙個而已,即在函式二中建立

要動態建立乙個類物件,有如下幾個步驟

1.類說明中使用declare_dyncreate(classnmae)巨集;和在類的實現檔案中使用implement_dyncreate(classname,baseclass)巨集;這個巨集完成構造cruntimeclass物件,並加入到鍊錶中。

2、使用時先通過巨集runtime_class得到類的runtime資訊,當獲得乙個類名時,先用類別型錄網判別這個類是否是鍊錶中有的類,若是,就使用cruntimeclass的成員函式createobject建立乙個該類的例項。

3、cobject* pobject = pruntimeclass->createobject();//完成動態建立     非常簡單的過程

深入淺出MFC筆記

深入淺出mfc筆記 一 勿在浮砂築高台 1 並不是擴充套件名為 dll dynamic link library 的才是動態鏈結庫。事實上,exe dll fon mod drv 和.ocx 都是所謂的動態鏈結函式庫。2 windows 程式編譯時需要包含 windows.h 標頭檔案,若需要使用諸...

深入淺出MFC 卷首語

昨晚有點睡不著,想起還有些書還沒看完,於是,起床把 深入淺出mfc 看完了。看這本書斷斷續續也有乙個多月了,我看完之後的第一衝動是找本mfc應用的書來深入熟悉熟悉mfc。因為,看這本書的時候,才發現自己的mfc知識是那麼的貧乏,總有點力不從心的感覺,以至於很多東西都一看而過,根本進入不了思考的階段。...

深入淺出MFC 卷首語

昨晚有點睡不著,想起還有些書還沒看完,於是,起床把 深入淺出mfc 看完了。看這本書斷斷續續也有乙個多月了,我看完之後的第一衝動是找本mfc應用的書來深入熟悉熟悉mfc。因為,看這本書的時候,才發現自己的mfc知識是那麼的貧乏,總有點力不從心的感覺,以至於很多東西都一看而過,根本進入不了思考的階段。...