03 MFC的動態建立

2021-09-05 11:59:02 字數 2784 閱讀 5953

動態建立基本和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 這裡在建立的時候一定不能少了...