動態建立基本和c++的new雲算符建立沒有區別,但是迴避了c++語言中不讓執行如下物件建立的情形:
char *classname = 「myclass」;
cobject *obj = new classname;
那mfc動態建立怎麼用呢?這次我們直接思路同上篇一樣,**直接貼巨集展開後的**,上面帶注釋,使用只需將展開**注釋後,將巨集解注釋就是同樣的效果。
/*
*hellomfc.h
*/#ifndef _hello_mfc_
#define _hello_mfc_
public:
virtual bool initinstance();
};class cmainwindow : public cframewnd;
#endif
/*
*hellomfc.cpp
*/#include #include "hellomfc.h"
//implement_dyncreate(cmainwindow, cframewnd) //展開為下面語句
cobject* pascal cmainwindow::createobject()
//implement_runtimeclass(class_name, base_class_name, 0xffff, class_name::createobject, null)
const cruntimeclass cmainwindow::classcmainwindow = ;
cruntimeclass* cmainwindow::getruntimeclass() const
cmainwindow::cmainwindow()
那麼問題來了,這玩意怎麼實現的,現在我們得回過頭來再看看上篇那個類了!下面貼**加注釋:
struct cruntimeclass
;
接下來我們在上面貼的示例**此處下斷點:
然後f11跟進去來到下面**出,下面貼出**注釋寫一下:
cobject* cruntimeclass::createobject()
cobject* pobject = null;
try //自行跟一下咯,異常處理
end_try
return pobject;
}
說了那麼多,我們通過名字來建立物件的問題還沒有解決啊!這時,我們應該想想上篇我們說執行程式前跟我們建立了乙個繼承鍊錶,這點向同了,那麼我們就來貼下面**咯!
/*
*hellomfc.h
*/#ifndef _hello_mfc_
#define _hello_mfc_
public:
virtual bool initinstance();
};class cmainwindow : public cframewnd;
#endif
/*
*hellomfc.h
*/#ifndef _hello_mfc_
#define _hello_mfc_
public:
virtual bool initinstance();
};class cmainwindow : public cframewnd;
#endif
/*
*hellomfc.cpp
*/#include #include "hellomfc.h"
//implement_dyncreate(cmainwindow, cframewnd) //展開為下面語句
cobject* pascal cmainwindow::createobject()
//implement_runtimeclass(class_name, base_class_name, 0xffff, class_name::createobject, null)
const cruntimeclass cmainwindow::classcmainwindow = ;
cruntimeclass* cmainwindow::getruntimeclass() const
cmainwindow::cmainwindow()
cobject* cmainwindow::createobjectbyname(const char *pclassname)
cruntimeclass* pclass = fromname(pclassname);
if (pclass == nullptr)
cobject* pobject = pclass->createobject();
return pobject;
}cruntimeclass* cmainwindow::fromname(const char *pclassname)
cruntimeclass* pclass = null;
for (pclass = (cruntimeclass*)(&cmainwindow::classcmainwindow); pclass != null; pclass = pclass->m_pbaseclass)
} return null;
}
MFC中的動態建立
1 為了能夠動態建立,程式必須維護乙個cruntimeclass的類,當需要去識別乙個類的時候,就依次去查詢這個鍊錶,而這個是通過一組巨集來實現的。因為是乙個鍊錶,所以就需要初始化,這個初始化在cobject中用稍有不同的巨集來實現的。2 cruntimeclass的結構 lpcstr m lpsz...
MFC動態建立物件
define implement dyncreate class name,base class name cobject pascal class name createobject implement runtimeclass class name,base class name,0xffff,...
MFC 動態建立Picture Control
1.首先定義乙個靜態的cstatic 的指標 cstatic ppicturecontrol null ppicturecontrol create t ws child ws visible ss bitmap,crect 20,10,80,40 this,12345 這裡在建立的時候一定不能少了...