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

相关文章

html5的响应式布局的方法示例详解

《html5的响应式布局的方法示例详解》:本文主要介绍了HTML5中使用媒体查询和Flexbox进行响应式布局的方法,简要介绍了CSSGrid布局的基础知识和如何实现自动换行的网格布局,详细内容请阅读本文,希望能对你有所帮助... 一 使用媒体查询响应式布局        使用的参数@media这是常用的

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

前端CSS Grid 布局示例详解

《前端CSSGrid布局示例详解》CSSGrid是一种二维布局系统,可以同时控制行和列,相比Flex(一维布局),更适合用在整体页面布局或复杂模块结构中,:本文主要介绍前端CSSGri... 目录css Grid 布局详解(通俗易懂版)一、概述二、基础概念三、创建 Grid 容器四、定义网格行和列五、设置行

Vue中动态权限到按钮的完整实现方案详解

《Vue中动态权限到按钮的完整实现方案详解》这篇文章主要为大家详细介绍了Vue如何在现有方案的基础上加入对路由的增、删、改、查权限控制,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、数据库设计扩展1.1 修改路由表(routes)1.2 修改角色与路由权限表(role_routes)二、后端接口设计

CSS3 最强二维布局系统之Grid 网格布局

《CSS3最强二维布局系统之Grid网格布局》CS3的Grid网格布局是目前最强的二维布局系统,可以同时对列和行进行处理,将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,本文介... 深入学习 css3 目前最强大的布局系统 Grid 网格布局Grid 网格布局的基本认识Grid 网

CSS弹性布局常用设置方式

《CSS弹性布局常用设置方式》文章总结了CSS布局与样式的常用属性和技巧,包括视口单位、弹性盒子布局、浮动元素、背景和边框样式、文本和阴影效果、溢出隐藏、定位以及背景渐变等,通过这些技巧,可以实现复杂... 一、单位元素vm 1vm 为视口的1%vh 视口高的1%vmin 参照长边vmax 参照长边re

CSS3中使用flex和grid实现等高元素布局的示例代码

《CSS3中使用flex和grid实现等高元素布局的示例代码》:本文主要介绍了使用CSS3中的Flexbox和Grid布局实现等高元素布局的方法,通过简单的两列实现、每行放置3列以及全部代码的展示,展示了这两种布局方式的实现细节和效果,详细内容请阅读本文,希望能对你有所帮助... 过往的实现方法是使用浮动加

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

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