duilib中添加自定义控件之后怎么能够在xml文件中配置使用

前端之家收集整理的这篇文章主要介绍了duilib中添加自定义控件之后怎么能够在xml文件中配置使用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

添加自定义控件可能有两种不同的情况:

1、 在duilib库中添加自定义控件。

2、 在我们的应用程序中自己重写了一个控件。

下面开始讲解不同的情况下怎么才能支持在xml文件配置控件:

1、 库中情况

假如自定义的控件是CGifUI类。

库中情况相对是比较简单的,只需在分析xml文件时候将控件创建出来就行了,所以我找到的函数CControlUI* CDialogBuilder::_Parse(CMarkupNode* pRoot,CControlUI* pParent,175)">CPaintManagerUI* pManager)。这个函数添加如下的代码

SIZE_T cchLen = _tcslen(pstrClass);

switch( cchLen ) {

case 3:

if (_tcscmp(pstrClass,DUI_CTR_GIF) == 0) pControl = new CGifUI;

// 下面这个宏定义就是xml中配置的配置项对应

#defineDUI_CTR_GIF (_T("Gif"))

2、 库外情况

假如自定义控件是CTransportTaskLayout

库外的情况,可能就麻烦一些了。首先我们在加载xml文件的时候要调用下面的函数

CControlUI* Create(STRINGorID xml,

LPCTSTR type = NULL,

IDialogBuilderCallback* pCallback = NULL,

CPaintManagerUI* pManager = CControlUI* pParent = NULL);

在这个函数中和此处有关的参数就是IDialogBuilderCallback* pCallback。

首先要明确一点是这个控件是在duilib中不能被接受的,所以只能在外宅里养着了。至于怎么养让我下面给你细细的说来。虽然说家里面是不接受的,但是我们自己必须接受这个事实,所以我们必须想办法解决这个问题,那就会从上面的那个参数开始着手了,我看CDialogBuilder::_Parse这个函数可以知道,如果在原有的duilib库中不接受这种控件类型,会一直到函数的后面调用pControl = m_pCallback->CreateControl(pstrClass);

,这里就给我们给外宅转正的机会了,所以我们自己会可以重写一个IDialogBuilderCallback类,然后重写类里的CreateControl函数,创建我们自己新控件了。下面给出在项目中用到的代码

class CTransportTaskBuilderCallBack : public IDialogBuilderCallback

{

public:

CTransportTaskBuilderCallBack(){};

virtual CControlUI* CreateControl(LPCTSTR pstrClass)

{

if (_tcscmp(pstrClass,21)">"TransportTaskLayout")) == 0)

{

CTransportTaskLayout * pLayout = (CTransportTaskLayout*)g_TransportListUICenter->CreateLayoutInstance("TransportTaskLayout"));

return pLayout;

}

return NULL;

}

};

上面这个类就是如果在xml文件中发现了"TransportTaskLayout"字符串,就会创建CTransportTaskLayout类的对象。

到这里外宅已经被转正了。现实生活中就没有这么美的事了,要转正是会出人命的。

猜你在找的XML相关文章