duilib界面库给container添加滚动条后子控件不能正常显示的问题

问题描述

duilib界面库给container添加滚动条后子控件不能正常显示的问题

container子控件需要任意在容器中任意拖拽,就使用了绝对布局,现在要给这个container添加垂直滚动条随子控件位置的改变而改变,现在虽然拖拽和滚动条都实现了,但是当双击向下拖动子控件到一定程度(拖动时顶部有一部分未显示)滚动条以后也不会显示这部分内容了。

解决方案

主要修改的代码如下:

  • void CContainerUI::SetPos(RECT rc)
    {
    if( m_pVerticalScrollBar|| m_pHorizontalScrollBar)//modify 2014-11-14
    {
    CControlUI::SetPos(rc);
    rc = m_rcItem;

        // Adjust for inset
        rc.left += m_rcInset.left;
        rc.top += m_rcInset.top;
        rc.right -= m_rcInset.right;
        rc.bottom -= m_rcInset.bottom;
        if( m_pVerticalScrollBar && m_pVerticalScrollBar->IsVisible() )
        {
            rc.right -= m_pVerticalScrollBar->GetFixedWidth();
        }
        if( m_pHorizontalScrollBar && m_pHorizontalScrollBar->IsVisible() )
        {
            rc.bottom -= m_pHorizontalScrollBar->GetFixedHeight();
        }
    
        if( m_items.GetSize() == 0) {
            ProcessScrollBar(rc, 0, 0);
            return;
        }
    
        // Determine the minimum size
        SIZE szAvailable = { rc.right - rc.left, rc.bottom - rc.top };
        if( m_pHorizontalScrollBar && m_pHorizontalScrollBar->IsVisible() )
            szAvailable.cx += m_pHorizontalScrollBar->GetScrollRange();
    
        // Place elements
        int cyNeeded = 0;
        int cyFixedtop = 0;
        int cyFixedbottm = 0;
        for( int it2 = 0; it2 < m_items.GetSize(); it2++ ) {
            CControlUI* pControl = static_cast<CControlUI*>(m_items[it2]);
            if( !pControl->IsVisible() ) continue;
            if( pControl->IsFloat() ) {  //modify 2014-11-14
                SetFloatPos(it2);
            }
    
            //RECT rcPadding = pControl->GetPadding();//外边距在相对布局中才有效
            RECT rt = pControl->GetPos();
            cyFixedbottm = MAX(cyFixedbottm,rt.bottom);
            cyFixedtop = MIN(cyFixedtop,rt.top);
        }
        cyNeeded = MAX(cyFixedbottm-cyFixedtop,szAvailable.cy);
    
        // Process the scrollbar
        ProcessScrollBar(rc, 0, cyNeeded);
    }
    else{
        CControlUI::SetPos(rc);
        if( m_items.IsEmpty() ) return;
        rc.left += m_rcInset.left;
        rc.top += m_rcInset.top;
        rc.right -= m_rcInset.right;
        rc.bottom -= m_rcInset.bottom;
    
        for( int it = 0; it < m_items.GetSize(); it++ ) {
            CControlUI* pControl = static_cast<CControlUI*>(m_items[it]);
            if( !pControl->IsVisible() ) continue;
            if( pControl->IsFloat() ) {
                SetFloatPos(it);
            }
            else {
                pControl->SetPos(rc); // 所有非float子控件放大到整个客户区
            }
        }
    }
    

    }

  • void CContainerUI::SetScrollPos(SIZE szPos)
    {

             ..............
    RECT rcPos;
    for( int it2 = 0; it2 < m_items.GetSize(); it2++ ) {
        CControlUI* pControl = static_cast<CControlUI*>(m_items[it2]);
        if( !pControl->IsVisible() ) continue;
        if( (!m_pVerticalScrollBar) && (!m_pHorizontalScrollBar))//modify 2014-11-14
        {
            if( pControl->IsFloat() )
                //SetFloatPos(it2);
                continue;
        }
        rcPos = pControl->GetPos();
        rcPos.left -= cx;
        rcPos.right -= cx;
        rcPos.top -= cy;
        rcPos.bottom -= cy;
        pControl->SetPos(rcPos);
    }
    
    Invalidate();
    

    }

  • 滚动条事件响应
  • void CContainerUI::DoEvent(TEventUI& event)
    {
    if( !IsMouseEnabled() && event.Type > UIEVENT__MOUSEBEGIN && event.Type < UIEVENT__MOUSEEND ) {
    if( m_pParent != NULL ) m_pParent->DoEvent(event);
    else CControlUI::DoEvent(event);
    return;
    }

    if( event.Type == UIEVENT_TIMER && event.wParam == SCROLL_TIMERID )//modify 2014-11-14
    {
        if( (m_uButtonState1 & UISTATE_CAPTURED) != 0 ) {
            POINT pt = m_pManager->GetMousePos();
            LONG cy = (pt.y - m_ptLastMouse.y);
            m_ptLastMouse = pt;
            SIZE sz = GetScrollPos();
            sz.cy -= cy;
            SetScrollPos(sz);
            return;
        }
        else if( m_dwDelayLeft > 0 ) {
            --m_dwDelayLeft;
            SIZE sz = GetScrollPos();
            LONG lDeltaY =  (LONG)(CalculateDelay((double)m_dwDelayLeft / m_dwDelayNum) * m_dwDelayDeltaY);
            if( (lDeltaY > 0 && sz.cy != 0)  || (lDeltaY < 0 && sz.cy != GetScrollRange().cy ) ) {
                sz.cy -= lDeltaY;
                SetScrollPos(sz);
                return;
            }
        }
        m_dwDelayDeltaY = 0;
        m_dwDelayNum = 0;
        m_dwDelayLeft = 0;
        m_pManager->KillTimer(this, SCROLL_TIMERID);
        return;
    }
    if( event.Type == UIEVENT_BUTTONDOWN && IsEnabled() )
    {
        m_uButtonState1 |= UISTATE_CAPTURED;
        m_ptLastMouse = event.ptMouse;
        m_dwDelayDeltaY = 0;
        m_dwDelayNum = 0;
        m_dwDelayLeft = 0;
        ::SetCursor(::LoadCursor(NULL, MAKEINTRESOURCE(IDC_HAND)));
        m_pManager->SetTimer(this, SCROLL_TIMERID, 50U);
        //return;
    }
    if( event.Type == UIEVENT_BUTTONUP )
    {
        if( (m_uButtonState1 & UISTATE_CAPTURED) != 0 ) {
            m_uButtonState1 &= ~UISTATE_CAPTURED;
            ::SetCursor(::LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));
            if( m_ptLastMouse.y != event.ptMouse.y ) {
                m_dwDelayDeltaY = (event.ptMouse.y - m_ptLastMouse.y);
                if( m_dwDelayDeltaY > 120 ) m_dwDelayDeltaY = 120;
                else if( m_dwDelayDeltaY < -120 ) m_dwDelayDeltaY = -120;
                m_dwDelayNum = (DWORD)sqrt((double)abs(m_dwDelayDeltaY)) * 5;
                m_dwDelayLeft = m_dwDelayNum;
            }
            else
                m_pManager->KillTimer(this, SCROLL_TIMERID);
        }
        //return;
    }
    if( event.Type == UIEVENT_SCROLLWHEEL )
    {
        LONG lDeltaY = 0;
        if( m_dwDelayNum > 0 ) lDeltaY =  (LONG)(CalculateDelay((double)m_dwDelayLeft / m_dwDelayNum) * m_dwDelayDeltaY);
        switch( LOWORD(event.wParam) ) {
            case SB_LINEUP:
                if( m_dwDelayDeltaY >= 0 ) m_dwDelayDeltaY = lDeltaY + 8;
                else m_dwDelayDeltaY = lDeltaY + 12;
                break;
            case SB_LINEDOWN:
                if( m_dwDelayDeltaY <= 0 ) m_dwDelayDeltaY = lDeltaY - 8;
                else m_dwDelayDeltaY = lDeltaY - 12;
                break;
        }
        if( m_dwDelayDeltaY > 100 ) m_dwDelayDeltaY = 100;
        else if( m_dwDelayDeltaY < -100 ) m_dwDelayDeltaY = -100;
        m_dwDelayNum = (DWORD)sqrt((double)abs(m_dwDelayDeltaY)) * 5;
        m_dwDelayLeft = m_dwDelayNum;
        m_pManager->SetTimer(this, SCROLL_TIMERID, 50U);
        return;
    }
    

解决方案二:

直接使用HorLayout或者VerLayout就行了

时间: 2025-01-21 15:45:18

duilib界面库给container添加滚动条后子控件不能正常显示的问题的相关文章

jquery dialog open后,服务器端控件失效的快速解决方法

 本篇文章是对jquery dialog open后,服务器端控件失效的快速解决方法.进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助 jquery dialog为我们提供了非常漂亮实用的对话框,比单调的alert.confirm.prompt好用很多.    在使用jquery与.net共同开发时,直接调用jquery dialog的open后,服务器端控件全部失效了,不能执行相应的后台代码.只是源于jquery默认把dialog添加到body中,而不是原来所在的服务器端的f

ext net-VS中安装ext.net后控件无法正确显示,浏览器中查看正常

问题描述 VS中安装ext.net后控件无法正确显示,浏览器中查看正常 设计界面中EXT控件显示 please configure in source view

为什么我拖拽后的控件回不去!!帮忙看下代码是什么问题!!谢谢

问题描述 为什么我拖拽后的控件回不去!!帮忙看下代码是什么问题!!谢谢 这是JAVA代码 package com.example.test; import com.example.test1.R; import android.annotation.SuppressLint; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; i

c#-界面不显示控件,不显示控件

问题描述 界面不显示控件,不显示控件 如图所示, 解决方案 重启计算机看看,如果你没有添加特殊的代码,可能是你的gfi资源饱和造成的,检查下计算机上有没有不良的软件.尽量关闭.另外禁用aero glass看看. 解决方案二: 是你背景透明化全部透明了?具体代码呢 解决方案三: 是背景被你全给透明了吧.

wpf中添加控件怎么不显示

问题描述 wpf中添加控件怎么不显示 新人求指导,代码如下,TextBlock和Button不显示 <Window x:Class="计算器界面.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="计算器&

activex控件添加-VC2010程序当中添加Labview的ActiveX控件

问题描述 VC2010程序当中添加Labview的ActiveX控件 我在VC2010程序当中添加Labview的ActiveX控件后,只要为ActiveX控件添加成员变量,程序就会报很多的错误,然而对VS2010本身的控件操作就没问题.这与我当初将VS2010软件安装的位置是否有关(我当初安装在F盘下了). 解决方案 看下是什么错误,是编译错误还是运行时错误,错误和错误是不同的. 解决方案二: LabView的控件是否正确注册成功.是通过VS的import方式导入的控件吗

list&amp;amp;lt;&amp;amp;gt;中添加用户控件,子控件等属性无法显示

问题描述 本意是设计一抽屉控件,含柜体Container,抽屉Part.Container中用list<Part>定义了一组Parts.当点击某Part时,按顺序,该抽屉之上的抽屉收缩,dockstyle=top,该抽屉展开,dockstyle=fill,该抽屉之下的抽屉收缩,docstyle=bottom.代码如下:Container:Container.cs:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentM

Android动态添加设置布局与控件的方法_Android

本文实例讲述了Android动态添加设置布局与控件的方法.分享给大家供大家参考,具体如下: 有时候我们会在代码端,动态的设置,添加布局和控件.下面我们就看来看一下如何处理,直接上代码,代码里面的注解很清楚了. 布局文件:fragment_hot.xml 说明:这个部局,我用的是scrollView做为基础布局,主要是为了实现一个滚动.这里不多说,这个你可以使用任何布局都可以,这里的id我是提前定义的. 这里面的现在有的布局是我为了看到我在代码端,动态添加的代码,是否可以追加到现有布局的后面而加上

Android动态添加设置布局与控件的方法

本文实例讲述了Android动态添加设置布局与控件的方法.分享给大家供大家参考,具体如下: 有时候我们会在代码端,动态的设置,添加布局和控件.下面我们就看来看一下如何处理,直接上代码,代码里面的注解很清楚了. 布局文件:fragment_hot.xml 说明:这个部局,我用的是scrollView做为基础布局,主要是为了实现一个滚动.这里不多说,这个你可以使用任何布局都可以,这里的id我是提前定义的. 这里面的现在有的布局是我为了看到我在代码端,动态添加的代码,是否可以追加到现有布局的后面而加上