代码仓库:https://github.com/yangpan4485/duilib/tree/develop/MyDemo

一、效果如下图所示

二、具体操作

1、拷贝 UIAnimation.cpp,UIAnimation.h 到 Control 目录下面,拷贝 UIAnimationTabLayout.cpp,UIAnimationTabLayout.h 到 Layout 目录下面,这四个文件需要在网上自己找,然后拷贝到自己的目录

2、在 Core/UIDefine.h 文件里面加上下面这一行

#define  DUI_CTR_ANIMATIONTABLAYOUT               (_T("AnimationTabLayout"))

3、 在 UIlib.h 文件里面 include 上面两个头文件,如果加上报错,那么把这两个头文件的位置往后移动一些,我是加在 #include "Control/UIEdit.h" 这个头文件后面的正常没有报错

#include "Control/UIAnimation.h"
#include "Layout/UIAnimationTabLayout.h"

4、修改 Core/UIDlgBuilder.cpp 文件,加上下面这几行代码,表示创建一个 CAnimationTabLayoutUI 的对象

case 18:if(_tcsicmp(pstrClass, DUI_CTR_ANIMATIONTABLAYOUT) == 0 ) {pControl = new CAnimationTabLayoutUI;}break;

5、xml 文件内容如下

<?xml version="1.0" encoding="UTF-8"?>
<Window size="1280,720" mininfo="1280,720" caption="0,0,0,32" sizebox="4,4,4,4"> <!-- 窗口的初始尺寸(宽800,高600)、窗口的最小尺寸(宽600,高400)、标题栏拖拽区域(高32)、可拖拽边框大小(这里添加sizebox后就可以拖拽边框调整大小了) --><Font id="0" name="宋体" size="20" bold="false" underline="false" italic="false" shared="true"/><Font id="1" name="宋体" size="17" bold="false" underline="false" italic="false" shared="true"/><Font id="2" name="黑体" size="24" bold="true" underline="false" italic="false" shared="true"/><Font id="3" name="宋体" size="17" bold="false" underline="false" italic="false" shared="true"/><HorizontalLayout bkcolor="#FFFFFFFF"> <!-- 整个窗口的背景色 --><!-- 客户区 --><VerticalLayout name="tabHeader" width="150" bkcolor="#FFFFFAFA"><Control /><Option pos="0,0,150,70" float="true" height="60" text="常规设置" name="basicTab" textcolor="#FFAFADAD" hottextcolor="#FFFFFFFF" selectedtextcolor="#FFFFFFFF" textpadding="6,0,6,0" bkcolor="#FFFFFAFA" hotbkcolor="#FF4b4b4b" pushedbkcolor="#FF424242" selectedbkcolor="#FF424242" group="tabHeader" selected="true" font="0" /><Option pos="0,70,150,140" float="true" height="60" text="视频设置" name="videoTab" textcolor="#FFAFADAD" hottextcolor="#FFFFFFFF" selectedtextcolor="#FFFFFFFF" textpadding="6,0,6,0" bkcolor="#FFFFFAFA" hotbkcolor="#FF4b4b4b" pushedbkcolor="#FF424242" selectedbkcolor="#FF424242" group="tabHeader" font="0" /><Option pos="0,140,150,210" float="true" height="60" text="音频设置" name="audioTab" textcolor="#FFAFADAD" hottextcolor="#FFFFFFFF" selectedtextcolor="#FFFFFFFF" textpadding="6,0,6,0" bkcolor="#FFFFFAFA" hotbkcolor="#FF4b4b4b" pushedbkcolor="#FF424242" selectedbkcolor="#FF424242" group="tabHeader" font="0" /><Option pos="0,210,150,280" float="true" height="60" text="屏幕设置" name="screenTab" textcolor="#FFAFADAD" hottextcolor="#FFFFFFFF" selectedtextcolor="#FFFFFFFF" textpadding="6,0,6,0" bkcolor="#FFFFFAFA" hotbkcolor="#FF4b4b4b" pushedbkcolor="#FF424242" selectedbkcolor="#FF424242" group="tabHeader" font="0" /><Option pos="0,280,150,350" float="true" height="60" text="账户设置" name="accountTab" textcolor="#FFAFADAD" hottextcolor="#FFFFFFFF" selectedtextcolor="#FFFFFFFF" textpadding="6,0,6,0" bkcolor="#FFFFFAFA" hotbkcolor="#FF4b4b4b" pushedbkcolor="#FF424242" selectedbkcolor="#FF424242" group="tabHeader" font="0" /><Control /></VerticalLayout><VerticalLayout bkcolor="#FFF5F5F5"></VerticalLayout></HorizontalLayout>
</Window>

6、代码

tab_switch.h

#pragma once#include "UIlib.h"class TabSwitch : public DuiLib::CWindowWnd, public DuiLib::INotifyUI
{
public:TabSwitch();~TabSwitch();void Init();bool CreateDUIWindow();void ShowWindow();LPCTSTR GetWindowClassName() const override;void Notify(DuiLib::TNotifyUI& msg) override;LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam) override;LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam);LRESULT OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam);void OnClick(DuiLib::TNotifyUI& msg);void OnEditTextChange(DuiLib::TNotifyUI& msg);private:HINSTANCE _hInstance;DuiLib::CPaintManagerUI _paintManager{};HWND _ownerWnd{};
};

tab_switch.cpp

#include "tab_switch.h"#include <iostream>
#include <string>TabSwitch::TabSwitch()
{}
TabSwitch::~TabSwitch()
{}void TabSwitch::Init()
{SetProcessDPIAware();_hInstance = GetModuleHandle(0);DuiLib::CPaintManagerUI::SetInstance(_hInstance);DuiLib::CPaintManagerUI::SetResourcePath(DuiLib::CPaintManagerUI::GetInstancePath() + +_T("resources"));
}
bool TabSwitch::CreateDUIWindow()
{_ownerWnd = Create(NULL, _T("TabSwitch"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);if (!_ownerWnd){std::cout << "create dui window failed" << std::endl;return false;}return true;
}
void TabSwitch::ShowWindow()
{ShowModal();
}LPCTSTR TabSwitch::GetWindowClassName() const
{return _T("DUITabSwitchFrame");
}
void TabSwitch::Notify(DuiLib::TNotifyUI& msg)
{if (msg.sType == _T("click")){OnClick(msg);}else if (msg.sType == _T("textchanged")){OnEditTextChange(msg);}
}
void TabSwitch::OnClick(DuiLib::TNotifyUI& msg)
{}
void TabSwitch::OnEditTextChange(DuiLib::TNotifyUI& msg)
{}
LRESULT TabSwitch::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{LRESULT lRes = 0;switch (uMsg) {case WM_CREATE:lRes = OnCreate(uMsg, wParam, lParam);break;case WM_CLOSE:lRes = OnClose(uMsg, wParam, lParam);break;default:break;}if (_paintManager.MessageHandler(uMsg, wParam, lParam, lRes)){return lRes;}return __super::HandleMessage(uMsg, wParam, lParam);
}LRESULT TabSwitch::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam)
{_paintManager.Init(m_hWnd);DuiLib::CDialogBuilder builder;DuiLib::CControlUI* pRoot = builder.Create(_T("tableSwitch.xml"), (UINT)0, NULL, &_paintManager);_paintManager.AttachDialog(pRoot);_paintManager.AddNotifier(this);return 0;
}
LRESULT TabSwitch::OnClose(UINT uMsg, WPARAM wParam, LPARAM lParam)
{return 0;
}

main.cpp

#include <Windows.h>
#include <iostream>
#include "tab_switch.h"int main(void) {TabSwitch tabSwitch;tabSwitch.Init();tabSwitch.CreateDUIWindow();tabSwitch.ShowWindow();return 0;
}

7、运行结果

是可以进行正常切换的,但是我们发现每一个 table 下面并没有内容,这个时候我们可以加一些内容,并在代码中进行设置

xml 增加内容

<VerticalLayout bkcolor="#FFF5F5F5"><AnimationTabLayout bkcolor="#FFF5F5F5" name="tabSwitch"><VerticalLayout name="basicTabPanel" inset="2,2,2,2" vscrollbar="true"><Label text="Label标签控件自动换行测试0" width="260" align="left" wordbreak="true" textcolor="#FFFF0000" font="1"/><Label text="Label标签控件自动换行测试1" width="260" align="left" wordbreak="true" textcolor="#FFFF0000" font="1"/><Label text="Label标签控件自动换行测试2" width="260" align="left" wordbreak="true" textcolor="#FFFF0000" font="1"/><Label text="Label标签控件自动换行测试3" width="260" align="left" wordbreak="true" textcolor="#FFFF0000" font="1"/></VerticalLayout><VerticalLayout name="videoTabPanel" inset="2,2,2,2" vscrollbar="true"><Label text="Label标签控件自动换行测试10" width="260" align="left" wordbreak="true" textcolor="#FFFF0000" font="1"/><Label text="Label标签控件自动换行测试11" width="260" align="left" wordbreak="true" textcolor="#FFFF0000" font="1"/><Label text="Label标签控件自动换行测试12" width="260" align="left" wordbreak="true" textcolor="#FFFF0000" font="1"/><Label text="Label标签控件自动换行测试13" width="260" align="left" wordbreak="true" textcolor="#FFFF0000" font="1"/></VerticalLayout><VerticalLayout name="audioTabPanel" inset="2,2,2,2" vscrollbar="true"><Label text="Label标签控件自动换行测试20" width="260" align="left" wordbreak="true" textcolor="#FFFF0000" font="1"/><Label text="Label标签控件自动换行测试21" width="260" align="left" wordbreak="true" textcolor="#FFFF0000" font="1"/><Label text="Label标签控件自动换行测试22" width="260" align="left" wordbreak="true" textcolor="#FFFF0000" font="1"/><Label text="Label标签控件自动换行测试23" width="260" align="left" wordbreak="true" textcolor="#FFFF0000" font="1"/></VerticalLayout><VerticalLayout name="screenTabPanel" inset="2,2,2,2" vscrollbar="true"><Label text="Label标签控件自动换行测试30" width="260" align="left" wordbreak="true" textcolor="#FFFF0000" font="1"/><Label text="Label标签控件自动换行测试31" width="260" align="left" wordbreak="true" textcolor="#FFFF0000" font="1"/><Label text="Label标签控件自动换行测试32" width="260" align="left" wordbreak="true" textcolor="#FFFF0000" font="1"/><Label text="Label标签控件自动换行测试33" width="260" align="left" wordbreak="true" textcolor="#FFFF0000" font="1"/></VerticalLayout><VerticalLayout name="accountTabPanel" inset="2,2,2,2" vscrollbar="true"><Label text="Label标签控件自动换行测试40" width="260" align="left" wordbreak="true" textcolor="#FFFF0000" font="1"/><Label text="Label标签控件自动换行测试41" width="260" align="left" wordbreak="true" textcolor="#FFFF0000" font="1"/><Label text="Label标签控件自动换行测试42" width="260" align="left" wordbreak="true" textcolor="#FFFF0000" font="1"/><Label text="Label标签控件自动换行测试43" width="260" align="left" wordbreak="true" textcolor="#FFFF0000" font="1"/></VerticalLayout></AnimationTabLayout></VerticalLayout>

tab_switch.cpp 增加内容

void TabSwitch::Notify(DuiLib::TNotifyUI& msg)
{if (msg.sType == _T("click")){OnClick(msg);}else if (msg.sType == _T("textchanged")){OnEditTextChange(msg);}else if (msg.sType == _T("selectchanged")){OnTableSelectChange(msg);}
}
/*
省略若干代码
*/
void TabSwitch::OnTableSelectChange(DuiLib::TNotifyUI& msg)
{DuiLib::CDuiString name = msg.pSender->GetName();DuiLib::CTabLayoutUI* pTabSwitch = static_cast<DuiLib::CTabLayoutUI*>(_paintManager.FindControl(_T("tabSwitch")));if (!pTabSwitch){return;}if (name.CompareNoCase(_T("basicTab")) == 0){pTabSwitch->SelectItem(0);}if (name.CompareNoCase(_T("videoTab")) == 0){pTabSwitch->SelectItem(1);}if (name.CompareNoCase(_T("audioTab")) == 0){pTabSwitch->SelectItem(2);}if (name.CompareNoCase(_T("screenTab")) == 0){pTabSwitch->SelectItem(3);}if (name.CompareNoCase(_T("accountTab")) == 0){pTabSwitch->SelectItem(4);}
}

最后的运行结果如下图所示,我们可以进行正常的 table 切换

duilib开发(八):duilib 实现 table switch相关推荐

  1. 一.Duilib开发之基本使用

    一. Duilib介绍 Duilib是一款轻量级,遵循BSD协议的开源C++ GUI框架,可以免费用于商业项目,是由杭州月牙儿网络技术有限公司基于DirectUI界面思想设计出来的GUI开源框架:所谓 ...

  2. openresty开发系列19--lua的table操作

    openresty开发系列19--lua的table操作 Lua中table内部实际采用哈希表和数组分别保存键值对.普通值:下标从1开始 不推荐混合使用这两种赋值方式. local color={fi ...

  3. firefox扩展开发(八) :控件激活

    firefox扩展开发(八) :控件激活 2008-06-11 17:01 当我们用鼠标点击一个控件,或者用TAB键移动到一个控件上时,我们说这个控件被激活 了(focus),离开这个控件时,我们说这 ...

  4. 2021-09-07体脂秤模块用来做什么?开发八电极体脂秤方案

    体脂秤模块用来做什么?可以用做开发八电极体脂秤方案,我们都在大时代的背景上成长,对于健康都有自己的要求,而体脂秤作为测人体分析脂肪率的设备,可以根据不同用户的体脂状态推荐不同的运动模式,用户通过运动来 ...

  5. Duilib样式性大全-Duilib属性大全-Duilib XML属性大全-Duilib XML样式大全

    Duilib样式性大全-Duilib属性大全-Duilib XML属性大全-Duilib XML样式大全 <?xml version="1.0" encoding=" ...

  6. FFmpeg开发(八)——Qt视频播放器之多线程的使用(参考了暴风影音、迅雷影音)

    FFmpeg开发(八)--Qt视频播放器之多线程的使用(参考了暴风影音.迅雷影音) 上篇文章介绍了: FFmpeg开发(七)--Qt视频播放器之播放列表类(参考了暴风影音.迅雷影音) 本播放器系列相关 ...

  7. 1.QT上位机开发之表格设计-TABLE WIDGET

    QT上位机开发之表格设计-TABLE WIDGET 开发平台: QT Designer QT5 系统:Windows 11 软件语言:python 项目需要开发上位机软件用于模块测试,自己之前没有做过 ...

  8. duilib设置透明窗口_使用duilib开发半透明异形窗体程序(补充)

    距离上一篇半透明窗体的博客,已经过去一年,现在这几天又对Duilib进行了一些优化和修复.这次我把CRenderEngine的渲染函数都改成了基于Gdi+的.根据我的测试,因为Duilib所需的都是最 ...

  9. Duilib开发环境搭建

    1.到github上下载最新版本,https://github.com/duilib/duilib,也没有发现版本号,就如图所示吧 2.我只安装了VS2008,而github上的已经更新到VS2013 ...

最新文章

  1. 深度学习实现缺陷检测
  2. python获取excel某一列-Python 读取excel指定的列
  3. KubeCon + CloudNativeCon北美2018年会议透明度报告:一项破纪录的CNCF活动
  4. Qt编写可换肤的中文双拼汉字输入法
  5. 第六课:不要为金钱而工作
  6. Linux内存管理初探
  7. Django从理论到实战(part20)--DLT常用过滤器
  8. 从数学入手,3招打破机器学习的边界
  9. 牛客题霸 [ 寻找峰值] C++题解/答案
  10. javafx 和swing_集成JavaFX和Swing(修订版)
  11. ai字体行间距怎么调整_字体基础知识(一)
  12. 简单com编写流程及注册事项
  13. 【iOS开发必备指南合集二】申请IDP/真机调试/GameCenter 指南/OpenFeint指南
  14. PHP:同时发送多个异步ajax请求,但数据却是按同步顺序返回
  15. Hadoop简介(1)
  16. 区块链中国专利申请状况及技术分析
  17. tokenizers in Transformers:BPE、WordPiece,SentencePiece
  18. 炒作与现实的博弈,厂商大肆宣传自动驾驶致司机陷入危险
  19. 让HR眼前一亮:30个APP项目软件测试经验,点燃你的简历
  20. Win7系统卸载McAfee杀毒软件

热门文章

  1. 微信小程序云开发数据库模糊查询
  2. EtherCAT与RTEX驱动器轴回零的配置与实现
  3. 证明完全立方数模9同余_完美的“钻石”替代品——立方氧化锆
  4. VB.NET制作SQL用户登录界面代码
  5. EXE文件也能直接制作成屏保吗?
  6. Tableau / 环形图 教程
  7. 【前端系列教程之CSS3】01_CSS概述、引入规则和三大机制
  8. 网狐精华版搭建教程之web网站搭建
  9. 八大芯片代工制造商为什么中国占了5成?
  10. 计算机毕业设计 SSM+Vue校园快递管理系统 校园代取系统 校园快递信息系统Java Vue MySQL数据库 远程调试 代码讲解