1. 程式人生 > >duilib中加入自己定義控件之後怎麽可以在xml文件裏配置使用

duilib中加入自己定義控件之後怎麽可以在xml文件裏配置使用

調用 tin 不同 center ger 使用 我們 article virtual

加入自己定義控件可能有兩種不同的情況:

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 = NULL,

CPaintManagerUI* pManager = NULL,

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類的對象。

到這裏外宅已經被轉正了。現實生活中就沒有這麽美的事了。要轉正是會出人命的。

duilib中加入自己定義控件之後怎麽可以在xml文件裏配置使用