加入自己定義控件可能有兩種不同的情況:
1、 在duilib庫中加入的自己定義控件。
2、 在我們的應用程式中自己重寫了一個控件。
以下開始解說不同的情況下怎麼才幹支援在xml檔案配置控件:
1、 庫中情況
假如自己定義的控件是CGifUI類。
庫中情況相對是比較簡單的,僅僅需在分析xml檔案時候将控件建立出來即可了,是以我找到的函數是CControlUI*
CDialogBuilder::_Parse(CMarkupNode*
pRoot, CControlUI*
pParent, CPaintManagerUI*
pManager)。這個函數中加入例如以下的代碼:
SIZE_T cchLen =
_tcslen(pstrClass);
switch( cchLen ) {
case 3:
if (_tcscmp(pstrClass,
DUI_CTR_GIF) == 0) pControl =
new CGifUI;
// 以下這個宏定義就是xml中配置的配置項相應
#define DUI_CTR_GIF (_T("Gif"))
2、 庫外情況
假如自己定義控件是CTransportTaskLayout 類
庫外的情況。可能就麻煩一些了。首先我們在載入xml檔案的時候要調用以下的函數:
CControlUI* Create(STRINGorID xml,
LPCTSTR type =
NULL,
IDialogBuilderCallback* pCallback =
CPaintManagerUI* pManager =
CControlUI* pParent =
NULL);
在這個函數中和此處有關的參數就是IDialogBuilderCallback* pCallback。
首先要明白一點是這個控件是在duilib中不能被接受的。是以僅僅能在外宅裡養着了。至于怎麼養讓我以下給你細細的說來。盡管說家裡面是不接受的。可是我們自己必須接受這個事實,是以我們必須想辦法解決問題,那就會從上面的那個參數開始着手了。我看CControlUI*
CDialogBuilder::_Parse這個函數能夠知道。假設在原有的duilib庫中不接受這樣的控件類型,會一直到函數的後面調用 pControl = m_pCallback->CreateControl(pstrClass);
。這裡就給我們給外宅轉正的機會了,是以我們自己會能夠重寫一個IDialogBuilderCallback類,然後重寫類裡的CreateControl函數,建立我們自己新控件了。以下給出在項目中用到的代碼:
class
CTransportTaskBuilderCallBack : public
IDialogBuilderCallback
{
public:
CTransportTaskBuilderCallBack(){};
virtual
CControlUI* CreateControl(LPCTSTR
pstrClass)
{
if (_tcscmp(pstrClass,
_T("TransportTaskLayout")) == 0)
{
CTransportTaskLayout * pLayout = (CTransportTaskLayout*)g_TransportListUICenter->CreateLayoutInstance(_T("TransportTaskLayout"));
return pLayout;
}
return
NULL;
}
};
上面這個類就是假設在xml檔案裡發現了"TransportTaskLayout"字元串,就會建立CTransportTaskLayout類的對象。
到這裡外宅已經被轉正了。現實生活中就沒有這麼美的事了。要轉正是會出人命的。