Duilib 自定义控件 通过xml自定义控件 可自定义属性等
·
首先 创建一个 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
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)