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

相关文章

MySQL 获取字符串长度及注意事项

《MySQL获取字符串长度及注意事项》本文通过实例代码给大家介绍MySQL获取字符串长度及注意事项,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 获取字符串长度详解 核心长度函数对比⚠️ 六大关键注意事项1. 字符编码决定字节长度2

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

WinForms中主要控件的详细使用教程

《WinForms中主要控件的详细使用教程》WinForms(WindowsForms)是Microsoft提供的用于构建Windows桌面应用程序的框架,它提供了丰富的控件集合,可以满足各种UI设计... 目录一、基础控件1. Button (按钮)2. Label (标签)3. TextBox (文本框

CSS3 布局样式及其应用举例

《CSS3布局样式及其应用举例》CSS3的布局特性为前端开发者提供了无限可能,无论是Flexbox的一维布局还是Grid的二维布局,它们都能够帮助开发者以更清晰、简洁的方式实现复杂的网页布局,本文给... 目录深入探讨 css3 布局样式及其应用引言一、CSS布局的历史与发展1.1 早期布局的局限性1.2

Java实现按字节长度截取字符串

《Java实现按字节长度截取字符串》在Java中,由于字符串可能包含多字节字符,直接按字节长度截取可能会导致乱码或截取不准确的问题,下面我们就来看看几种按字节长度截取字符串的方法吧... 目录方法一:使用String的getBytes方法方法二:指定字符编码处理方法三:更精确的字符编码处理使用示例注意事项方

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 配合使用四、自