新版博客已经搭建好了,有问题请访问 htt://www.crazydebug.com

在公司二期项目中为了将谷歌内核嵌入到duilib中,采用了自定义duilib控件的方法,由于也是第一次用duilib,边学边用,所有网上的资料给了我很大的帮助,尤其Redrain兄弟的文章给我启发很大,再次感谢互联网具有开源精神的程序员。

今天简单总结下duilib的自定义控件,要实现自定义控件需要做两件事情

1、继承现有的控件类创建新的控件类
2、让程序识别新的控件并可以在xml中使用
第一步继承我就不多说了,直接看代码吧
class CBrowserUI :public CControlUI
{
public:CBrowserUI();~CBrowserUI();virtual LPCTSTR GetClass() const;virtual LPVOID GetInterface(LPCTSTR pstrName);//这个一定要设置,不然控件无法显示virtual void SetPos(RECT rc, bool bNeedInvalidate = true);CefRefPtr<CefBrowser> GetBrowser(){return m_Browser->GetBrowser();}CefRefPtr<CefFrame> GetMainFrame(){return m_Browser->GetMainFrame();}void CloseAllBrowser(); bool CreateBrowser(const CefString & szHomePage, CHaoMainFrame  * pWnd);void LoadUrl(const CefString & url);protected:CefRefPtr<CHaoBrowserHandler> m_Browser;
};

下面是实现文件

CBrowserUI::CBrowserUI() :m_Browser(NULL)// m_Browser(NULL)
{}CBrowserUI::~CBrowserUI()
{
}LPCTSTR CBrowserUI::GetClass() const
{return _T("BrowserUI");
}LPVOID CBrowserUI::GetInterface(LPCTSTR pstrName)
{if (_tcsicmp(pstrName, _T("Browser")) == 0){return static_cast<CBrowserUI*>(this);}return CControlUI::GetInterface(pstrName);
}void CBrowserUI::SetPos(RECT rc, bool bNeedInvalidate /* = true */)
{CControlUI::SetPos(rc, bNeedInvalidate);if (m_Browser.get()){CefRefPtr<CefBrowser> browser = m_Browser->GetBrowser();DuiLib::CDuiRect rc = GetPos(); if (browser && !rc.IsNull()){::SetWindowPos(browser->GetHost()->GetWindowHandle(),NULL, rc.left, rc.top, rc.GetWidth(), rc.GetHeight(), SWP_NOZORDER | SWP_NOACTIVATE); }}
}void CBrowserUI::CloseAllBrowser()
{if (m_Browser.get()){m_Browser->CloseAllBrowsers(true);}
}bool CBrowserUI::CreateBrowser(const CefString & szHomePage, CHaoMainFrame  * pWnd)
{CefWindowInfo info; if (m_Browser == NULL){m_Browser = new CHaoBrowserHandler(pWnd);}m_Browser->SetHomePage(szHomePage);if (m_Browser != NULL){info.SetAsChild(GetManager()->GetPaintWindow(), GetPos());CefBrowserSettings browserSettings; return CefBrowserHost::CreateBrowser(info, m_Browser.get(), szHomePage,browserSettings,NULL);}return false;
}void CBrowserUI::LoadUrl(const CefString & url)
{if (m_Browser.get()){CefRefPtr<CefFrame> mainframe = m_Browser->GetMainFrame();if (mainframe)mainframe->LoadURL(url);}
}

建立新控件后,最先应该重写的两个函数是GetClass和GetInterface。他们后用来区分控件的类型的虚函数,用于动态识别控件类型和做控件的类型转换。

从Duilib的自带控件上可以看出,比如当前的自定义控件类名为CBrowserUI,那么GetClass函数返回的字符串BrowserUI。而GetInterface函数是根据传入的参数是否与自身的字符串匹配,来决定能否把自己转换为需要的控件类型。GetInterface中用来匹配的字符串,应该与xml中的对应的控件的标签名称一直,这里应该是Browser。

ButtonUI类,GetClass对应ButtonUI,GetInterface对应Button。这不是强制的,但是保持这个风格很重要

好了控件类的定义实现都有了,那么如何让xml可以识别我们定义的控件?这才是最重要的问题

为了让xml布局识别我们的新控件,我们需要完成Duilib的IDialogBuilderCallback接口,重写这个接口中的CreateControl函数。

通常情况下,可以让窗体类继承IDialogBuilderCallback接口并且重写CreateControl(DuiLib自带的WindowImplBase窗体类已经继承了这个接口,如果是继承WindowImplBase的话就直接重写CreateControl就可以了)。函数处理方法是比较传入的字符串,根据字符串来决定返回什么控件的指针,这个传入的字符串就是xml文件中控件的标签,比如<Button />中的字符串Button

CControlUI * CHaoMainFrame::CreateControl(LPCTSTR pstrClass)
{CControlUI * pUI = NULL;if (_tcsicmp(pstrClass, _T("MyBrowser")) == 0){pUI = m_browser = new CBrowserUI;}return pUI;
}

这样一个自定义控件就搞完了,而且我用着也是很不错的,上个图吧,无图无真相

转载于:https://www.cnblogs.com/crazydebug/p/5983676.html

Duilib自定义控件相关推荐

  1. 【Duilib自定义控件】水平布局的滚动扩展布局,实现菜单的可滑动效果

    为了实现如下效果: 左侧为固定菜单,右侧为可滑动菜单.当窗口足够大,菜单可全部展显示. 窗口变小时,菜单只能显示一部分.滑动到最左侧,左滑按钮灰掉 左滑右滑按钮皆可用 滑动到最右侧,右滑按钮灰掉. 需 ...

  2. duilib创建自定义控件

    我之前也写过一片封装xml为一个容器的文章,只是写的很随意,仅仅贴出了一个demo的地址. 在群里还有一些刚刚接触duilib的朋友们问到duilib自定义控件的问题,这里我转载一篇redrain大佬 ...

  3. Duilib创建添加自定义控件

    本篇参考资料:Duilib自定义控件博文(duilib开发基础:创建自定义控件的过程):http://blog.csdn.net/zhuhongshu/article/details/45362751 ...

  4. 网易纯直播SDK使用 视频回调

    一 合成后视频回调 1 视频回调 Nlss_SetVideoSamplerCB,接受合成后的预览的每帧图像rgb32 buffer. void LsSession::SetVideoSamplerCB ...

  5. duilib中的添加自定义控件

    原理参考博客:https://blog.csdn.net/zhuhongshu/article/details/45362751#commentBox 添加自定义的控件时,让程序识别该控件,要继承ID ...

  6. duilib入门问题集

    引入duilib时请确保引入头文件开始时先引入COMUTIL.H头文件 #include "COMUTIL.H" #include "UIlib.h" duil ...

  7. duilib之源码分析

    Duilib入门教程 http://www.cnblogs.com/Alberl/p/3342030.html http://blog.csdn.net/wogel/article/details/9 ...

  8. duilib制作窗体动画效果

    转载请说明原出处,谢谢~·http://blog.csdn.net/zhuhongshu/article/details/49026605 最近一段时间没写博客了,感觉最近没有遇到什么必须解决的bug ...

  9. 基于360SafeDemo对duilib整体框架的概述

    我们以一个具体窗口(360Safe Window)的创建为入口,建立起程序的整个框架.然后逐步深入,对其中的细节以及duilib中各个类在任务的执行过程中负责的任务进行分析.分析以问题作为导向,随着层 ...

最新文章

  1. activiti源码编译
  2. OS- -文件系统(二)
  3. 【渝粤题库】广东开放大学 Linux 形成性考核
  4. 2021吉林高考26日几点可以查询成绩,2021吉林高考成绩查分时间及入口
  5. go结构体初始化_golang中结构体的初始化方法(new方法)
  6. ASP.NET基础教程-Server对象
  7. python程序员工资高吗_Python程序员必备:EDA数据分析神器,老板疯狂加工资
  8. 684.冗余连接(力扣leetcode) 博主可答疑该问题
  9. 什么是数字证书?数字证书在哪办理?
  10. 绘画和照片编辑:Artstudio Pro for mac
  11. android 开发者模式进入
  12. 目标检测中文类别--在图片中添加汉字
  13. MITxPro平台 Base SPOC-MachineLearning, Modeling, and Simulation Principles 课后习题参考答案
  14. cocos2d android 音乐,cocos2d-之音乐背景播放(示例代码)
  15. 今日金融词汇---BP
  16. Soft Actor-Critic 论文笔记
  17. R语言_电信客户流失数据分析
  18. NO.73——《人工智能·一种现代方法》Agent学习笔记
  19. js导出excel(js-export-excel)
  20. html 框线设置颜色,css怎么设置边框颜色?

热门文章

  1. 【刘文彬】【精解】EOS TPS 多维实测
  2. js基础知识学习(二)
  3. dubbo负载均衡代码分析1(leastactive策略)
  4. AST语法结构树初学者完整教程
  5. 关于javaweb地址栏技巧
  6. solaris10上修改最大文件句柄数
  7. 洛谷P5050 【模板】多项式多点求值
  8. SVN服务器搭建详解
  9. jdk自带4种多线程创建方式
  10. 使用阿里云容器监控服务与第三方监控框架集成搭建自己的容器看板