Scrollbar控件的认识

关于scrollbar只研究上下滚动

1. 首先Scrollbar的父窗口是ContainerUI,不管哪个控件想使用滚动条,该空间必须是Container或者继承Container.

2. 该函数记录滚动条的百分比的数值是m_nScrollPos,然后记录滚动条总共被分成多少份的则是m_nRange。

3、滚动条有四个关键的图标:button1、button2、thumb、rail.其中这两个按钮是两端的两个按钮,thumb则是整个滑动的按钮,而rail则是整个滑动按钮中间的小按钮,这两个按钮的位置都是通过动态计算获取到的。具体的thumb计算是在SetPos函数,而rail按钮则是通过thumb的位置来确定,直接在PaintRail的时候进行计算显示即可。

4、thumb的大小则是通过在第479行:int cyThumb = cy * (rc.bottom - rc.top) / (m_nRange + rc.bottom - rc.top);计算出来的,也就是说如果m_nRange越大的话则thumb相对整个滚动条就越小。

5、当整个滚动条的大小:button1高度+button2高度<m_cxyFixed.cy+m_cxyFixed.cy(这里是两个按钮均可见)的时候则thumb滚动条不显示第519行:::ZeroMemory(&m_rcThumb, sizeof(m_rcThumb));把滚动条的大小分给button1和button2。

6、然后doevent中如果点击button1或者button2的时候则会触发containerui的linedown或者up然后可以看containerui中的linedown函数,linesize是固定大小的8,而滚动条则是默认大小的十六,但是这个没关系,因为当点击linedown或者up的时候,位置大小的修改时依赖containerui的移动位置来修改的。

scrollbar的第551行
if( m_pOwner != NULL ) m_pOwner->LineUp();
                    else SetScrollPos(m_nScrollPos - m_nLineSize);

// 也就是说当有容器的时候本身不会去设置scrollpos而是通过containerui来设置大小。

然后这里看containerui的相关lineup函数

    void CContainerUI::LineUp()
    {
        int cyLine = 8;
        if( m_pManager ) cyLine = m_pManager->GetDefaultFontInfo()->tm.tmHeight + 8;

        SIZE sz = GetScrollPos();
        sz.cy -= cyLine;
        SetScrollPos(sz);
    }
//这里明确表明了linesize大小为8

// 而这里的setscrollpos函数则做了两件事:1、调用scrollbar的setscrollpos函数。    2、将自身的elements向上移动相应的像素。

    void CContainerUI::SetScrollPos(SIZE szPos)
    {
        int cx = 0;
        int cy = 0;
        if( m_pVerticalScrollBar && m_pVerticalScrollBar->IsVisible() ) {
            int iLastScrollPos = m_pVerticalScrollBar->GetScrollPos();
            m_pVerticalScrollBar->SetScrollPos(szPos.cy);
            cy = m_pVerticalScrollBar->GetScrollPos() - iLastScrollPos;
        }

        if( m_pHorizontalScrollBar && m_pHorizontalScrollBar->IsVisible() ) {
            int iLastScrollPos = m_pHorizontalScrollBar->GetScrollPos();
            m_pHorizontalScrollBar->SetScrollPos(szPos.cx);
            cx = m_pHorizontalScrollBar->GetScrollPos() - iLastScrollPos;
        }

        if( cx == 0 && cy == 0 ) return;

        RECT rcPos;
        for( int it2 = 0; it2 < m_items.GetSize(); it2++ ) {
            CControlUI* pControl = static_cast<CControlUI*>(m_items[it2]);
            if( !pControl->IsVisible() ) continue;
            if( pControl->IsFloat() ) continue;

            rcPos = pControl->GetPos();
            rcPos.left -= cx;
            rcPos.right -= cx;
            rcPos.top -= cy;
            rcPos.bottom -= cy;
            pControl->SetPos(rcPos);
        }

        Invalidate();
    }

同样的pageup跟pagedown也是通过contaierui函数来设定的。

但是这里滚动的大小并不是固定大小而是一页的大小

void CContainerUI::PageUp()
    {
        SIZE sz = GetScrollPos();
        int iOffset = m_rcItem.bottom - m_rcItem.top - m_rcInset.top - m_rcInset.bottom;
        if( m_pHorizontalScrollBar && m_pHorizontalScrollBar->IsVisible() ) iOffset -= m_pHorizontalScrollBar->GetFixedHeight();
        sz.cy -= iOffset;
        SetScrollPos(sz);
    }

7、这里的uiscrollbar的第546行的settimer是为了在长按pageup或down(lineup跟down也是一样)时触发移动,或者拖动滚动条的时候触发的移动。具体可以看doevent函数。的第660行开始的if( event.Type == UIEVENT_TIMER && event.wParam == DEFAULT_TIMERID )

时间: 2024-10-29 19:05:33

Scrollbar控件的认识的相关文章

UGUI Scrollbar控件

如题就是Scrollbar控件,它简单可以看成 Scrollbar 和 Image组件组成 它基本上不单独使用多数是制作滚动视图.我们来看看他独特的属性,重复的属性就不在介绍了! 属性讲解: Handle Rect: 表示滚动条的把手, 如果你有一个Image物体,虽然让它来成为滚动条的把手. 你只需要两个步骤: 1. Image成为Scrollbar子物体 2. Image拖动到Hanle Rect赋值即可 Image用于替代原来的Sliding Area把手 Direction: 代表朝向,

背水一战 Windows 10 (46) - 控件(ScrollViewer 基础): ScrollViewer, ScrollBar, ScrollContentPresenter

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 控件(ScrollViewer 基础) ScrollViewer ScrollBar ScrollContentPresenter 示例1.ScrollViewer 的基本应用Controls/ScrollViewerDemo/ScrollViewerDemo.xaml <Page x:Class="Windows10.Controls.ScrollViewerDemo.ScrollViewerDemo"

【Unity】8.1 Unity内置的UI控件

分类:Unity.C#.VS2015 创建日期:2016-04-27 一.简介 Unity 5.x内置了-套完整的GUI系统,提供了从布局.控件到皮肤的-整套GUI解决方案,因此可直接利用它做出各种风格和样式的GUI界面,并且扩展性很强(程序员可以基于已有的控件创建出适合自己需求的控件). 有两种使用GUI的办法,一种是直接将UI添加到层次视图或者场景视图中,然后通过GUI脚本去控制它:另一种是直接通过GUI脚本去创建. 二.直接添加UI控件到场景中 下图是Unity 5.3.4内置的UI控件,

GUI 控件学习一(C#)

代码片段: using UnityEngine; using System.Collections; public class SkinTest : MonoBehaviour { public Texture imgbtn; private string textContent ="Textfield"; private string passwordToEdit ="PasswordField"; private string textAreaToEdit =

DataGridView控件-[引用]

DataGridView控件 DataGridView是用于Windows Froms 2.0的新网格控件.它可以取代先前版本中DataGrid控件,它易于使用并高度可定制,支持很多我们的用户需要的特性. 关于本文档: 本文档不准备面面俱到地介绍DataGridView,而是着眼于深入地介绍一些技术点的高级特性. 本文档按逻辑分为5个章节,首先是结构和特性的概览,其次是内置的列/单元格类型的介绍,再次是数据操作相关的内容,然后是主要特性的综述,最后是最佳实践. 大部分章节含有一个"Q &

【WPF学习】第二十四章 基于范围的控件

原文:[WPF学习]第二十四章 基于范围的控件 WPF提供了三个使用范围概念的控件.这些控件使用在特定最小值和最大值之间的数值.这些控件--ScrollBar.ProgressBar以及Slider--都继承自RangeBase类(该类又继承自Control类).尽管它们使用相同的抽象概念(范围),但工作方式却又很大的区别. 下表显示了RangeBase类定义的属性: 表 RangeBase类的属性 通常不比直接使用ScrollBar控件.更高级的ScrollViewer控件(封装了两个Scro

【WPF学习】第二十章 内容控件

原文:[WPF学习]第二十章 内容控件 内容控件(content control)是更特殊的控件类型,它们可包含并显示一块内容.从技术角度看,内容控件时可以包含单个嵌套元素的控件.与布局容器不同的是,内容控件只能包含一个子元素,而布局容器主要愿意可以包含任意多个牵头元素. 正如前面所介绍,所有WPF布局容器都继承自抽象类Panel,该类提供了对包含多个元素的支持.类似地,所有内容控件都继承自抽象类ContentControl.下图显示了ContentControl类的层次结构. 图 Conten

WPF针对控件中ScrollBar样式的修改

代码最终实现的效果 样式资源代码: 1 <Window.Resources> 2 <SolidColorBrush x:Key="DisabledForegroundBrush" Color="#2280BC" /> 3 <SolidColorBrush x:Key="NormalBrush" Color="#2280BC" /> 4 <SolidColorBrush x:Key=&q

MFC编程入门之二十六(常用控件:滚动条控件ScrollBar)

回顾上一节,讲的是组合框控件Combo Box的使用.本节详解滚动条控件Scroll Bar的相关内容. 滚动条控件简介 滚动条大家也很熟悉了,Windows窗口中很多都有滚动条.前面讲的列表框和组合框设置了相应属性后,如果列表项显示不下也会出现滚动条.滚动条分为水平滚动条(Horizontal Scroll Bar)和垂直滚动条(Vertical Scroll Bar)两种.滚动条中有一个滚动块,用于标识滚动条当前滚动的位置.我们可以拖动滚动条,也可以用鼠标点击滚动条某一位置使滚动块移动. 从