Duilib创建添加自定义控件

xiaoxiao2021-02-27  302

本篇参考资料: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"/>

转载请注明原文地址: https://www.6miu.com/read-4103.html

最新回复(0)