Duilib创建添加自定义控件
本篇参考资料:Duilib自定义控件博文(duilib开发基础:创建自定义控件的过程):http://blog.csdn.net/zhuhongshu/article/details/45362751
Duilib是一个强大的c++界面库,相比MFC,它对于程序员来说更加友好。不仅易懂易学,做出的界面效果还比较美观。据悉,现在市面上很多桌面应用都是直接或间接地基于Duilib来制作的。
这篇博文主要介绍如何把自定义的控件融入到Duilib的控件里面。由于现在Duilib的作者没有维护了,所以现在也出现了Duilib的各种版本,本篇是用到DuiLib_Ultimate May 3, 2017版本(github地址:https://github.com/qdtroy/DuiLib_Ultimate/tree/master/DuiLib)
先看效果(这里是用到Alberl的Duilib入门教程写的界面,增加了CWaterUI控件):
话不多说,开始主题:
水纹的效果是基于第三方的代码,对第三方代码进行封装后,由于想要写的控件和Label很像,所以就选用继承Label的方式,以下是UIWater.h代码,其中CDib和CWaterEffect是第三方的库提供的类:
class UILIB_API CWaterUI : public CLabelUI{DECLARE_DUICONTROL(CWaterUI)public:CWaterUI(void);virtual ~CWaterUI(void);virtual void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue) override;virtual LPCTSTR GetClass() const override;virtual LPVOID GetInterface(LPCTSTR pstrName) override;public:void DoInit() override;void SetVisible(bool bVisible = true) override;void SetInternVisible(bool bVisible = true) override;void DoPaint(HDC hDC, const RECT& rcPaint) override;void DoEvent(TEventUI& event) override;void SetPos(RECT rc, bool bNeedInvalidate = true)override;//设置控件位置并重绘private:bool m_bUpdate;CDib m_renderSrc;CDib m_renderDest;CWaterEffect m_waterEffect;};
想要把自定义控件融入Duilib中,ControlFactory.h是非常关键的文件,让我们看看里面有什么内容
#pragma once
#include <map>
namespace DuiLib
{typedef CControlUI* (*CreateClass)();typedef std::map<CDuiString, CreateClass> MAP_DUI_CTRATECLASS;class UILIB_API CControlFactory{public:CControlUI* CreateControl(CDuiString strClassName);void RegistControl(CDuiString strClassName, CreateClass pFunc);static CControlFactory* GetInstance();void Release();private: CControlFactory();virtual ~CControlFactory();private:MAP_DUI_CTRATECLASS m_mapControl;};//用于识别xml文件的空间名字 这是声明操作
#define DECLARE_DUICONTROL(class_name)\
public:\static CControlUI* CreateControl();//用于识别xml文件的空间名字 这是实现操作
#define IMPLEMENT_DUICONTROL(class_name)\CControlUI* class_name::CreateControl()\{ return new class_name; }//用于在控件工厂对自定义控件进行注册
#define REGIST_DUICONTROL(class_name)\CControlFactory::GetInstance()->RegistControl(_T(#class_name), (CreateClass)class_name::CreateControl);#define INNER_REGISTER_DUICONTROL(class_name)\RegistControl(_T(#class_name), (CreateClass)class_name::CreateControl);
}
我们只需要在这个控件工厂类中的构造函数下添加一句,就可以了
INNER_REGISTER_DUICONTROL(CWaterUI);
然后,只需要在配置xml中,加入类似这样一句(均来自于父类CLabelUI的属性,也可以自己在SetAttribute中实现)
<Water text="水波纹" textcolor="#FFeeeeee" align="center" valign="vcenter"/>
Duilib创建添加自定义控件相关推荐
- Qt创建设计师自定义控件(Qt Designer自定义控件)
Qt提供了一个Designer界面,使得我们可以自由拖动控件对ui进行布局,但所有的控件都是固定的,如果我们想要自定义一个自己设计的控件,添加到Designer中,可供设计者自由设计.那么可以进行如下 ...
- 1.创建一个自定义控件
1.创建一个自定义控件 原文请看我个人博客:http://clzf.co/blog.php?id=1 这篇文章是 C#自定义控件开发 系列的第一篇文章 其实如果你看过[GDI+程序设计]这本书的话 我 ...
- 一步一步SharePoint 2007之十二:实现Form认证(2)——创建添加管理帐户的工程
摘要 本篇文章将记录实现Form认证的第二部分--创建添加管理帐户的工程.为了完成本部分的操作,希望您已经安装了Microsoft Visual Studio 2005:) 之所以要创建添加管理帐户的 ...
- duilib创建自定义控件
我之前也写过一片封装xml为一个容器的文章,只是写的很随意,仅仅贴出了一个demo的地址. 在群里还有一些刚刚接触duilib的朋友们问到duilib自定义控件的问题,这里我转载一篇redrain大佬 ...
- duilib中的添加自定义控件
原理参考博客:https://blog.csdn.net/zhuhongshu/article/details/45362751#commentBox 添加自定义的控件时,让程序识别该控件,要继承ID ...
- SwipeToLoadLayout布局中添加自定义控件仿美团、饿了吗等下拉效果
SwipeToLoadLayout是一个可重用的下拉刷新和上拉加载控件,理论上支持各种View和ViewGroup(ListView,ScrollView,RecyclerView,GridView, ...
- python3 字典 dict 创建 添加 修改 复制 取值 删除
创建,添加,修改 # 可以创建空的字典 my_dict={}# 可以添加一对键值 my_dict["new_key"] = "new_value"# 可以添加多 ...
- 如何在fluid中添加自定义控件
fluid中已经有它自己自带的控件,那如何让我们自定义的控件放到fluid中呢,这里有两种方法,一种是修改fluid代码,一种是以另外的控件来代替自定义的控件,只是在代替控件属性的class选项下填写 ...
- Fragment创建添加切换和对应底部导航(二)
目标:可以滑动Fragment来导航. 原来是通过FragmentManager添加Fragment后,show和hide来显示和隐藏Fragment. 这里使用Viewpager和FragmentP ...
最新文章
- Tomcat5集群中的SESSION复制详解
- 解决rspec 生成报告时报utf-8错误的方法
- vue cli3.0创项目报错‘This may cause things to work incorrectly. Make sure to use the same version for b’
- fastjson与spring mvc整合的配置
- ssh 将22端口换为其它 防火墙设置
- vue的watch使用(如淘宝优惠券设置计算属性时候)
- eclipse sdk manager无法更新
- 计算机绘图相切,第九章计算机绘图基础.
- 云栖·武汉峰会 | 现场:阿里云为何频打“自研”牌?
- 主板检测卡c5_主板测试卡代码及解决方法
- Sentinel 控制台 不显示实时监控
- Python 中 'unicodeescape' codec can't decode bytes in position XXX: trun错误解决方案
- 帝国国王科技大学上机题解(二)
- 嵌入式linux qos tc,iptables和tc脚本实现智能QOS
- MPEG DASH MPD文件字段解释
- 专门画像素图的软件_有哪几种简便的做像素画的软件?
- c语言——do……while循环
- BeanFactoryPostProcessor的调用时机
- oracle12c映像文件,Oracle 12C Database File Mapping for Oracle ASM Files
- 树莓派 linux pwm,树莓派使用pwm控制风扇
热门文章
- OrCad 与PADS9.5关联
- 武田就欧盟委员会对拟收购Shire plc进行中的1期评审发表置评
- Linux内核配置(二) :CPU类型配置
- 赢得阵亡将士纪念日的十大怪异项目
- RTL8720DN SDK 环境搭建
- 「镁客早报」NASA公布“门户计划”,未来将在月球轨道建立空间站;特斯拉裁掉Model3交付部门一半以上...
- SQL中with as用法
- 流水线中使用 docker in pod 方式构建容器镜像
- 吉首大学第九届"新星杯"大学生程序设计大赛 J.小阳排队
- 甘特图是什么?有什么作用?