Duilib自定义控件
新版博客已经搭建好了,有问题请访问 htt://www.crazydebug.com
在公司二期项目中为了将谷歌内核嵌入到duilib中,采用了自定义duilib控件的方法,由于也是第一次用duilib,边学边用,所有网上的资料给了我很大的帮助,尤其Redrain兄弟的文章给我启发很大,再次感谢互联网具有开源精神的程序员。
今天简单总结下duilib的自定义控件,要实现自定义控件需要做两件事情
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自定义控件相关推荐
- 【Duilib自定义控件】水平布局的滚动扩展布局,实现菜单的可滑动效果
为了实现如下效果: 左侧为固定菜单,右侧为可滑动菜单.当窗口足够大,菜单可全部展显示. 窗口变小时,菜单只能显示一部分.滑动到最左侧,左滑按钮灰掉 左滑右滑按钮皆可用 滑动到最右侧,右滑按钮灰掉. 需 ...
- duilib创建自定义控件
我之前也写过一片封装xml为一个容器的文章,只是写的很随意,仅仅贴出了一个demo的地址. 在群里还有一些刚刚接触duilib的朋友们问到duilib自定义控件的问题,这里我转载一篇redrain大佬 ...
- Duilib创建添加自定义控件
本篇参考资料:Duilib自定义控件博文(duilib开发基础:创建自定义控件的过程):http://blog.csdn.net/zhuhongshu/article/details/45362751 ...
- 网易纯直播SDK使用 视频回调
一 合成后视频回调 1 视频回调 Nlss_SetVideoSamplerCB,接受合成后的预览的每帧图像rgb32 buffer. void LsSession::SetVideoSamplerCB ...
- duilib中的添加自定义控件
原理参考博客:https://blog.csdn.net/zhuhongshu/article/details/45362751#commentBox 添加自定义的控件时,让程序识别该控件,要继承ID ...
- duilib入门问题集
引入duilib时请确保引入头文件开始时先引入COMUTIL.H头文件 #include "COMUTIL.H" #include "UIlib.h" duil ...
- duilib之源码分析
Duilib入门教程 http://www.cnblogs.com/Alberl/p/3342030.html http://blog.csdn.net/wogel/article/details/9 ...
- duilib制作窗体动画效果
转载请说明原出处,谢谢~·http://blog.csdn.net/zhuhongshu/article/details/49026605 最近一段时间没写博客了,感觉最近没有遇到什么必须解决的bug ...
- 基于360SafeDemo对duilib整体框架的概述
我们以一个具体窗口(360Safe Window)的创建为入口,建立起程序的整个框架.然后逐步深入,对其中的细节以及duilib中各个类在任务的执行过程中负责的任务进行分析.分析以问题作为导向,随着层 ...
最新文章
- activiti源码编译
- OS- -文件系统(二)
- 【渝粤题库】广东开放大学 Linux 形成性考核
- 2021吉林高考26日几点可以查询成绩,2021吉林高考成绩查分时间及入口
- go结构体初始化_golang中结构体的初始化方法(new方法)
- ASP.NET基础教程-Server对象
- python程序员工资高吗_Python程序员必备:EDA数据分析神器,老板疯狂加工资
- 684.冗余连接(力扣leetcode) 博主可答疑该问题
- 什么是数字证书?数字证书在哪办理?
- 绘画和照片编辑:Artstudio Pro for mac
- android 开发者模式进入
- 目标检测中文类别--在图片中添加汉字
- MITxPro平台 Base SPOC-MachineLearning, Modeling, and Simulation Principles 课后习题参考答案
- cocos2d android 音乐,cocos2d-之音乐背景播放(示例代码)
- 今日金融词汇---BP
- Soft Actor-Critic 论文笔记
- R语言_电信客户流失数据分析
- NO.73——《人工智能·一种现代方法》Agent学习笔记
- js导出excel(js-export-excel)
- html 框线设置颜色,css怎么设置边框颜色?