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"/>



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值