duilib中添加自定义控件之后怎么能够在xml文件中配置使用
2015-07-21 16:53
1091 查看
添加自定义控件可能有两种不同的情况:
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类的对象。
到这里外宅已经被转正了。现实生活中就没有这么美的事了,要转正是会出人命的。
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类的对象。
到这里外宅已经被转正了。现实生活中就没有这么美的事了,要转正是会出人命的。
相关文章推荐
- Leetcode #62 Unique Paths
- iOS UIView和CATransition的动画实现
- Android_UI开发详解之ActionBar
- POJ-1458-Common Subsequence-动规最长公共子序列
- request.getContextPath()
- UISlider 属性
- 50 Excel VBA Oral Interview Questions
- java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed
- HDU 2818 Building Block(带权并查集)
- PAT 1051. Pop Sequence (25)
- 在pcDuino下编译安装openCV的问题
- ArrayBlockingQueue跟LinkedBlockingQueue的区别
- 【第四篇章-android平台MediaCodec】解决Observer died. Quickly, do something, ... anything...
- LinkedBlockingQueue的put,add跟offer的区别
- Number Sequence(kmp模板)
- dijistra最短路 hdu1242 Rescue
- ios蓝牙开发(CoreBluetooth)
- ios UIBarButtonItem去除标题
- 终于找到了。 图标搜索、UI设计、移动开发集中导航
- SUID,SGID,Sticky Bit详解