duilib中加入自己定義控件之後怎麽可以在xml文件裏配置使用
加入自己定義控件可能有兩種不同的情況:
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
。這裏就給我們給外宅轉正的機會了,所以我們自己會能夠重寫一個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文件裏配置使用