首先 创建一个 HEToolsItem.xml

内容很简单 就一个Button + 一个Label + 一个垂直布局

然后回到vs 创建一个继承 CContainerUI 的类 CHEToolsItemUI

 

HEToolsItem.h

#pragma once
#include <UIlib.h>
using namespace DuiLib;

class CHEToolsItemUI : public CContainerUI, INotifyUI {

public:
	CHEToolsItemUI();
	~CHEToolsItemUI();
	virtual LPCTSTR GetClass() const;
	virtual LPVOID GetInterface(LPCTSTR name);
	virtual void SetAttribute(LPCTSTR name, LPCTSTR value);
	virtual void DoInit();
	virtual void Notify(TNotifyUI& msg);
	virtual void DoEvent(TEventUI& event);
	virtual void SetEnabled(bool enable = true);

public:
	void SetFont(int font);
	void SetImage(LPCTSTR image);
	void SetTitle(LPCTSTR title);
	void SetAllClick(bool click);
	void SetTitleColor(DWORD color);

private:
	DWORD m_TitleColor = 0xFF000000;
	bool m_AllClick = false;
	CDuiString m_Image;
	CDuiString m_Title;
	int m_Font = -1;
	CButtonUI* m_ImageUI;
	CLabelUI* m_TitleUI;
};

HEToolsItem.cpp

#include "pch.h"
#include "CHEToolsItemUI.h"	

CHEToolsItemUI::CHEToolsItemUI():
	m_Image(TEXT("")), 
	m_Title(TEXT("标题")),
	m_ImageUI(NULL),
	m_TitleUI(NULL) {

}

CHEToolsItemUI::~CHEToolsItemUI() {
	
}

LPCTSTR CHEToolsItemUI::GetClass() const {
	return TEXT("HEToolsItemUI");
}

LPVOID CHEToolsItemUI::GetInterface(LPCTSTR name) {
	if (wcscmp(name, TEXT("HEToolsItem")) == 0) {
		return static_cast<CHEToolsItemUI*>(this);
	}
	return CControlUI::GetInterface(name);
}

void CHEToolsItemUI::SetAttribute(LPCTSTR name, LPCTSTR value) {
	if (wcscmp(name, TEXT("image")) == 0) {
		m_Image = value;
	} else if (wcscmp(name, TEXT("title")) == 0) {
		m_Title = value;
	} else if (wcscmp(name, TEXT("font")) == 0) {
		SetFont(_ttoi(value));
	} else if (wcscmp(name, TEXT("allclick")) == 0) {
		SetAllClick(wcscmp(value, TEXT("true")) == 0);
	} else if (wcscmp(name, TEXT("titlecolor")) == 0) {
		if (*value == _T('#')) value = CharNext(value);
		LPTSTR pstr = NULL;
		const DWORD color = _tcstoul(value, &pstr, 16);
		SetTitleColor(color);
	}
	CControlUI::SetAttribute(name, value);
}

void CHEToolsItemUI::DoInit() {
	CDialogBuilder builder;
    //IDX_CONTROL_HETOOLSITEM 我这里是读取了资源中的xml 所以这里传的是资源id 如果你是文件 这里传文件名就可以了
	CContainerUI* ui = static_cast<CVerticalLayoutUI*>(builder.Create(IDX_CONTROL_HETOOLSITEM, TEXT("xml"), NULL, m_pManager));
	if (ui) {
		this->Add(ui);
		m_pManager->AddNotifier(this);
	} else {
		this->RemoveAll();
	}
	m_ImageUI = static_cast<CButtonUI*>(m_pManager->FindControl(_T("he_tools_item_image")));
	m_ImageUI->SetNormalImage(m_Image);
	m_TitleUI = static_cast<CLabelUI*>(m_pManager->FindControl(_T("he_tools_item_title")));
	m_TitleUI->SetText(m_Title);
	m_TitleUI->SetFont(m_Font);
	m_TitleUI->SetTextColor(m_TitleColor);
}

void CHEToolsItemUI::Notify(TNotifyUI& msg) {
	if (msg.sType == DUI_MSGTYPE_CLICK) {
		if (IsEnabled()) {
			if (msg.pSender == m_ImageUI || msg.pSender == m_TitleUI) {
				m_pManager->SendNotify(this, DUI_MSGTYPE_CLICK);
			}
		}
	}
}

void CHEToolsItemUI::DoEvent(TEventUI& event) {
	if (m_AllClick) {
		if (event.Type == UIEVENT_BUTTONDOWN) {
			m_pManager->SendNotify(this, DUI_MSGTYPE_BUTTONDOWN);
			return;
		} else if (event.Type == UIEVENT_BUTTONUP) {
			if (PtInRect(&m_rcItem, event.ptMouse)) {
				m_pManager->SendNotify(this, DUI_MSGTYPE_CLICK);
			}
			return;
		}
	}
	__super::DoEvent(event);
}

void CHEToolsItemUI::SetEnabled(bool enable) {
	CContainerUI::SetEnabled(enable);
}

void CHEToolsItemUI::SetFont(int font) {
	m_Font = font;
	if (m_TitleUI != NULL) {
		m_TitleUI->SetFont(font);
	}
}

void CHEToolsItemUI::SetTitle(LPCTSTR title) {
	m_Title = title;
	if (m_TitleUI != NULL) {
		m_TitleUI->SetText(title);
	}
}

void CHEToolsItemUI::SetImage(LPCTSTR image) {
	m_Image = image;
	if (m_ImageUI != NULL) {
		m_ImageUI->SetNormalImage(image);
	}
}

void CHEToolsItemUI::SetAllClick(bool click) {
	m_AllClick = click;
}

void CHEToolsItemUI::SetTitleColor(DWORD color) {
	m_TitleColor = color;
	if (m_TitleUI != NULL) {
		m_TitleUI->SetTextColor(color);
	}
}

使用方式也很简单 

 

只需要在你的

WindowImplBase

中实现  对 CreateControl 的重写

virtual CControlUI* CreateControl(LPCTSTR name);

具体如下:

 

mainwin.h

class CBaseWnd : public WindowImplBase {
public:
	virtual CControlUI* CreateControl(LPCTSTR name);
};

mainwin.cpp

CControlUI* CBaseWnd::CreateControl(LPCTSTR name) {
	CControlUI* ui = nullptr;
	CDialogBuilder builder;
	if (wcscmp(name, TEXT("HEToolsItem")) == 0) {
		ui = new CHEToolsItemUI();
	}
	return ui;
}

然后再你的布局文件中就可以添加自己的自定义控件了

 

最后送上运行结果:

 

有不懂的,可以联系QQ:3195774121

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐