本篇参考资料: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创建添加自定义控件相关推荐

  1. Qt创建设计师自定义控件(Qt Designer自定义控件)

    Qt提供了一个Designer界面,使得我们可以自由拖动控件对ui进行布局,但所有的控件都是固定的,如果我们想要自定义一个自己设计的控件,添加到Designer中,可供设计者自由设计.那么可以进行如下 ...

  2. 1.创建一个自定义控件

    1.创建一个自定义控件 原文请看我个人博客:http://clzf.co/blog.php?id=1 这篇文章是 C#自定义控件开发 系列的第一篇文章 其实如果你看过[GDI+程序设计]这本书的话 我 ...

  3. 一步一步SharePoint 2007之十二:实现Form认证(2)——创建添加管理帐户的工程

    摘要 本篇文章将记录实现Form认证的第二部分--创建添加管理帐户的工程.为了完成本部分的操作,希望您已经安装了Microsoft Visual Studio 2005:) 之所以要创建添加管理帐户的 ...

  4. duilib创建自定义控件

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

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

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

  6. SwipeToLoadLayout布局中添加自定义控件仿美团、饿了吗等下拉效果

    SwipeToLoadLayout是一个可重用的下拉刷新和上拉加载控件,理论上支持各种View和ViewGroup(ListView,ScrollView,RecyclerView,GridView, ...

  7. python3 字典 dict 创建 添加 修改 复制 取值 删除

    创建,添加,修改 # 可以创建空的字典 my_dict={}# 可以添加一对键值 my_dict["new_key"] = "new_value"# 可以添加多 ...

  8. 如何在fluid中添加自定义控件

    fluid中已经有它自己自带的控件,那如何让我们自定义的控件放到fluid中呢,这里有两种方法,一种是修改fluid代码,一种是以另外的控件来代替自定义的控件,只是在代替控件属性的class选项下填写 ...

  9. Fragment创建添加切换和对应底部导航(二)

    目标:可以滑动Fragment来导航. 原来是通过FragmentManager添加Fragment后,show和hide来显示和隐藏Fragment. 这里使用Viewpager和FragmentP ...

最新文章

  1. Tomcat5集群中的SESSION复制详解
  2. 解决rspec 生成报告时报utf-8错误的方法
  3. vue cli3.0创项目报错‘This may cause things to work incorrectly. Make sure to use the same version for b’
  4. fastjson与spring mvc整合的配置
  5. ssh 将22端口换为其它 防火墙设置
  6. vue的watch使用(如淘宝优惠券设置计算属性时候)
  7. eclipse sdk manager无法更新
  8. 计算机绘图相切,第九章计算机绘图基础.
  9. 云栖·武汉峰会 | 现场:阿里云为何频打“自研”牌?
  10. 主板检测卡c5_主板测试卡代码及解决方法
  11. Sentinel 控制台 不显示实时监控
  12. Python 中 'unicodeescape' codec can't decode bytes in position XXX: trun错误解决方案
  13. 帝国国王科技大学上机题解(二)
  14. 嵌入式linux qos tc,iptables和tc脚本实现智能QOS
  15. MPEG DASH MPD文件字段解释
  16. 专门画像素图的软件_有哪几种简便的做像素画的软件?
  17. c语言——do……while循环
  18. BeanFactoryPostProcessor的调用时机
  19. oracle12c映像文件,Oracle 12C Database File Mapping for Oracle ASM Files
  20. 树莓派 linux pwm,树莓派使用pwm控制风扇

热门文章

  1. OrCad 与PADS9.5关联
  2. 武田就欧盟委员会对拟收购Shire plc进行中的1期评审发表置评
  3. Linux内核配置(二) :CPU类型配置
  4. 赢得阵亡将士纪念日的十大怪异项目
  5. RTL8720DN SDK 环境搭建
  6. 「镁客早报」NASA公布“门户计划”,未来将在月球轨道建立空间站;特斯拉裁掉Model3交付部门一半以上...
  7. SQL中with as用法
  8. 流水线中使用 docker in pod 方式构建容器镜像
  9. 吉首大学第九届"新星杯"大学生程序设计大赛 J.小阳排队
  10. 甘特图是什么?有什么作用?