• 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* 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类的对象。

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

  • 相关阅读:
    01-HTML控件
    08-多线程
    07-Log日志
    06-File-文件
    05-函数式编程
    04-异常使用处理
    03-常用包模块
    02-包
    Java NIO(六) Selector
    Java NIO(四) Scatter/Gather
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7137241.html
Copyright © 2020-2023  润新知