duilib:设计一个“长度不够,按钮来凑“的duilib布局控件

2024-03-27 20:38

本文主要是介绍duilib:设计一个“长度不够,按钮来凑“的duilib布局控件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本控件主要为了支持布局内元素很多,但是又不想显示滚动条,意图通过按钮来控制布局滚动的情形。

效果图如下:

当布局高度足以容纳所有子控件时:

 当布局高度不足以容纳子控件时:

 并且上下按钮支持点击翻页功能。

主要实现思路:

1. 控件构造的时候,把上下两个按钮以及中间的布局给添加到控件里。

2. 控件处理绘制事件的时候,通过判断中间的布局滚动条的显示状态来隐藏/显示上下按钮。

3. 托管上下按钮的点击通知。

4. 由于需要滚动条显示属性的支持,因此只能把滚动条的宽度设置为0,来达到隐藏的效果。

具体代码如下:

.h

class CVerticalLayoutExUI : public DuiLib::CVerticalLayoutUI{DECLARE_DUICONTROL(CVerticalLayoutExUI);
public:CVerticalLayoutExUI();void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);void DoPaint(HDC hDC, const RECT& rcPaint) override;bool Add(CControlUI* pControl);private:bool OnControlReady(void*);bool LineUp(void* lpvoid);bool LineDown(void* lpvoid);private:UINT32							m_iUpWidth;UINT32							m_iUpHeight;UINT32							m_iDownWidth;UINT32							m_iDownHeight;DuiLib::CButtonUI*				m_pBtnUp = nullptr;DuiLib::CButtonUI*				m_pBtnDown = nullptr;DuiLib::CTileLayoutUI*			m_pTileToolbar = nullptr;DuiLib::CDuiString				m_upImg;DuiLib::CDuiString				m_downImg;
};

.cpp

IMPLEMENT_DUICONTROL(CVerticalLayoutExUI)CVerticalLayoutExUI::CVerticalLayoutExUI() {//m_bDrawScrollbar = false;CDialogBuilder builder;CVerticalLayoutUI *pItem = (CVerticalLayoutUI*)(builder.Create(TEXT("xml/controls/vertical_layout_ex.xml"), NULL, NULL, NULL));m_pBtnUp = reinterpret_cast<decltype(m_pBtnUp)>(pItem->FindSubControl(L"btn_vertical_layout_ex_up"));m_pBtnDown = reinterpret_cast<decltype(m_pBtnDown)>(pItem->FindSubControl(L"btn_vertical_layout_ex_down"));m_pTileToolbar = reinterpret_cast<decltype(m_pTileToolbar)>(pItem->FindSubControl(L"tile_vertical_layout_ex_toolbar"));ASSERT(m_pBtnUp);ASSERT(m_pBtnDown);ASSERT(m_pTileToolbar);OnInit += MakeDelegate(this, &CVerticalLayoutExUI::OnControlReady);m_pBtnUp->OnNotify += MakeDelegate(this, &CVerticalLayoutExUI::LineUp);m_pBtnDown->OnNotify += MakeDelegate(this, &CVerticalLayoutExUI::LineDown);CVerticalLayoutUI::Add(pItem);
}void CVerticalLayoutExUI::SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue) {if (_tcsicmp(pstrName, _T("upimg")) == 0) {m_upImg = pstrValue;}else if (_tcsicmp(pstrName, _T("upsize")) == 0) {LPTSTR pstr = NULL;m_iUpWidth = _tcstol(pstrValue, &pstr, 10);  ASSERT(pstr);m_iUpHeight = _tcstol(pstr + 1, &pstr, 10);    ASSERT(pstr);}else if((_tcsicmp(pstrName, _T("downimg")) == 0)){m_downImg = pstrValue;}else if (_tcsicmp(pstrName, _T("downsize")) == 0) {LPTSTR pstr = NULL;m_iDownWidth = _tcstol(pstrValue, &pstr, 10);  ASSERT(pstr);m_iDownHeight = _tcstol(pstr + 1, &pstr, 10);    ASSERT(pstr);}CVerticalLayoutUI::SetAttribute(pstrName, pstrValue);
}void CVerticalLayoutExUI::DoPaint(HDC hDC, const RECT& rcPaint){int height = GetHeight() - m_pBtnDown->GetFixedHeight() - m_pBtnUp->GetFixedHeight();m_pTileToolbar->SetFixedHeight(height);auto pScroll = m_pTileToolbar->GetVerticalScrollBar();if (pScroll) {if (pScroll->IsVisible()) {m_pBtnDown->SetVisible(true);m_pBtnUp->SetVisible(true);}else {m_pBtnDown->SetVisible(false);m_pBtnUp->SetVisible(false);}}CVerticalLayoutUI::DoPaint(hDC, rcPaint);
}bool CVerticalLayoutExUI::Add(CControlUI* pControl) {if (m_pTileToolbar) {return m_pTileToolbar->Add(pControl);}return false;
}bool CVerticalLayoutExUI::LineUp(void* lpvoid) {TNotifyUI* pNotifyUI = (TNotifyUI*)lpvoid;if (!pNotifyUI) return false;if (pNotifyUI->sType != DUI_MSGTYPE_CLICK) return false;if (m_pTileToolbar) {m_pTileToolbar->LineUp();}return true;
}bool CVerticalLayoutExUI::LineDown(void* lpvoid) {TNotifyUI* pNotifyUI = (TNotifyUI*)lpvoid;if (!pNotifyUI) return false;if (pNotifyUI->sType != DUI_MSGTYPE_CLICK) return false;if (m_pTileToolbar) {m_pTileToolbar->LineDown();}return true;
}bool CVerticalLayoutExUI::OnControlReady(void*) {//控件本身的滚动条宽度也要设置成0SetAttribute(L"vscrollbar", L"true");auto scroll = GetVerticalScrollBar();if (scroll) {scroll->SetFixedWidth(0);}//不能直接隐藏滚动条,只能强制把宽度设置成0scroll = m_pTileToolbar->GetVerticalScrollBar();if (scroll) {scroll->SetFixedWidth(0);}if (m_pBtnUp) {m_pBtnUp->SetFixedWidth(m_iUpWidth);m_pBtnUp->SetFixedHeight(m_iUpHeight);m_pBtnUp->SetBkImage(m_upImg);}if (m_pBtnDown) {m_pBtnDown->SetFixedWidth(m_iDownWidth);m_pBtnDown->SetFixedHeight(m_iDownHeight);m_pBtnDown->SetBkImage(m_downImg);}return true;
}

.xml

<?xml version="1.0" encoding="utf-8"?>
<Window><VerticalLayout childalign="center" ><Button name="btn_vertical_layout_ex_up" cursor="hand" height="22" width="22" bkimage="playUI/btn_page_up.png" /><TileLayout name="tile_vertical_layout_ex_toolbar" vscrollbar="true"></TileLayout><Button name ="btn_vertical_layout_ex_down" cursor="hand" height="22" width="22" bkimage="playUI/btn_page_down.png" /></VerticalLayout>
</Window>

这篇关于duilib:设计一个“长度不够,按钮来凑“的duilib布局控件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/853317

相关文章

C#实现WinForm控件焦点的获取与失去

《C#实现WinForm控件焦点的获取与失去》在一个数据输入表单中,当用户从一个文本框切换到另一个文本框时,需要准确地判断焦点的转移,以便进行数据验证、提示信息显示等操作,本文将探讨Winform控件... 目录前言获取焦点改变TabIndex属性值调用Focus方法失去焦点总结最后前言在一个数据输入表单

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

SprinBoot+Vue网络商城海鲜市场的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w+

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

Spring的设计⽬标——《Spring技术内幕》

读《Spring技术内幕》第二版,计文柯著。 如果我们要简要地描述Spring的设计⽬标,可以这么说,Spring为开发者提供的是⼀个⼀站式的轻量级应⽤开发框架(平台)。 作为平台,Spring抽象了我们在 许多应⽤开发中遇到的共性问题;同时,作为⼀个轻量级的应⽤开发框架,Spring和传统的J2EE开发相⽐,有其⾃⾝的特点。 通过这些⾃⾝的特点,Spring充分体现了它的设计理念:在