DuiLib学习笔记(二) 扩展CScrollbar属性

DuiLib学习笔记(二) 扩展CScrollbar属性

Duilib的滚动条滑块默认最小值为滚动条的高度(HScrollbar)或者宽度(VScrollbar)。并且这个值默认为16。当采用系统样式的滚动条,或者 Troy的源码(https://github.com/qdtroy/DuiLib_Ultimate)自带的样式时,是没有问题的,因为这两种样式默认高(宽)度都是16,当滑块最小时,也有16*16,背景图片(九宫格式)不会出拉伸BUG。但是,当自定义背景图片时,如果图片本身大小超过16*16,则会出现重影,本图中滚动条宽度设置为12,滑块背景图片为40*12。corner=”0,6,0,24”。或者滑块变得很小,本图中滚动条宽度设置为12,滑块背景图片为40*12。corner=”0,6,0,6”。

查看源码可以发现

m_rcThumb.top = rc.top;
                m_rcThumb.bottom = rc.top + m_cxyFixed.cy;
                if( m_nRange > 0 ) {
                    int cxThumb = cx * (rc.right - rc.left) / (m_nRange + rc.right - rc.left);
                    if( cxThumb < m_cxyFixed.cy ) cxThumb = m_cxyFixed.cy;

                    m_rcThumb.left = m_nScrollPos * (cx - cxThumb) / m_nRange + m_rcButton1.right;
                    m_rcThumb.right = m_rcThumb.left + cxThumb;
                    if( m_rcThumb.right > m_rcButton2.left ) {
                        m_rcThumb.left = m_rcButton2.left - cxThumb;
                        m_rcThumb.right = m_rcButton2.left;
                    }
                }
                else {
                    m_rcThumb.left = m_rcButton1.right;
                    m_rcThumb.right = m_rcButton2.left;
                }

,当滑块变得很小时,源码只是简单的设置滑块的宽度为m_cxyFixed.cy,即滚动条高度(HScrollbar)。因此,我们可以给它加一个属性ThumbMinSize,即设置一个滑块最小值,来替换m_cxyFixed.cy。

具体代码如下:

头文件UIScrollbar.h

protected:
int m_nThumbMinSize;

public:
int GetThumbMinSize();
void SetThumbMinSize();

实现文件UIScrollbar.cpp

//构造函数里面初始化m_nThumbMinSize值为DEFAULT_SCROLLBAR_SIZE ,即16
CScrollBarUI::CScrollBarUI():……{  m_nThumbMinSize = DEFAULT_SCROLLBAR_SIZE;}
void CScrollBarUI::SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue)
{
    .......   //源码
    else if (_tcsicmp(pstrName, _T("thumbminsize")) == 0) SetThumbMinSize(_ttoi(pstrValue));
}

int CScrollBarUI::GetThumbMinSize()
{
    return m_nThumbMinSize;
}

void CScrollBarUI::SetThumbMinSize(int nSize)
{
    m_nThumbMinSize = nSize;
    Invalidate();
}

void CScrollBarUI::SetPos(RECT rc, bool bNeedInvalidate)
{
    ……    //源码
    m_rcThumb.top = rc.top;
    m_rcThumb.bottom = rc.top + m_cxyFixed.cy;
    if( m_nRange > 0 ) {
        int cxThumb = cx * (rc.right - rc.left) / (m_nRange + rc.right - rc.left);
        /*这儿有改动,源码设置的滑块最小值为 滚动条的高度(HScrollbar)*/
        if (cxThumb < m_nThumbMinSize)
        {
            if (m_nThumbMinSize < m_cxyFixed.cy)
            {
                cxThumb = m_cxyFixed.cy;
            }
            else
                cxThumb = m_nThumbMinSize;
        }

        m_rcThumb.left = m_nScrollPos * (cx - cxThumb) / m_nRange + m_rcButton1.right;
        m_rcThumb.right = m_rcThumb.left + cxThumb;
        if( m_rcThumb.right > m_rcButton2.left ) {
            m_rcThumb.left = m_rcButton2.left - cxThumb;
            m_rcThumb.right = m_rcButton2.left;
        }
    }
    ……    //源码

    //另外,下面的竖向滚动条也一样
}

完美实现!!!

时间: 2024-12-25 18:51:32

DuiLib学习笔记(二) 扩展CScrollbar属性的相关文章

Caliburn.Micro学习笔记(二)----Actions

Caliburn.Micro学习笔记(二)----Actions 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions,看一下Caliburn.Micro给我们提供了多强大的支持 我们还是从做例子开始 demo的源码下载在文章的最后 例子1.无参数方法调用 点击button把textBox输入的文本弹出来 如果textbox里没有文本button不可点,看一下效果图 看一下前台代码 <Stac

JavaScript--基于对象的脚本语言学习笔记(二)

第二部分:DOM编程 1.文档象模型(DOM)提供了访问结构化文档的一种方式,很多语言自己的DOM解析器. DOM解析器就是完成结构化文档和DOM树之间的转换关系. DOM解析器解析结构化文档:将磁盘上的结构化文档转换成内存中的DOM树 从DOM树输出结构化文档:将内存中的DOM树转换成磁盘上的结构化文档 2.DOM模型扩展了HTML元素,为几乎所有的HTML元素都新增了innerHTML属性,该属性代表该元素的"内容",即返回的某个元素的开始标签.结束标签之间的字符串内容(不包含其它

Android学习笔记二十九之SwipeRefreshLayout、RecyclerView和CardView

Android学习笔记二十九之SwipeRefreshLayout.RecyclerView和CardView 前面我们介绍了AlertDialog和几个常用的Dialog,ProgressDialog进度条提示框.DatePickerDialog日期选择对话框和TimePickerDialog时间选择对话框.这一节我们介绍几个新的API控件SwipeRefreshLayout.RecyclerView和CardView,这几个API控件都是google在Android5.0推出的.下面我们来学

Android学习笔记二

17. 在ContentProvider中定义的getType()方法是定义URI的内容类型. 18. SQLiteDatabase类中的insert/delete/update/query方法其实也挺好用的,我在EquipmentProvider类中做了实现 19. Android专门有个单元测试项目(Android Test Project),在这个项目中,可以新建一个继承AndroidTestCase类的具体测试类来单元测试某个功能.我新建了一个AndroidTestProject项目,在

Ajax学习笔记(二)

二.prototype库详解 1.prototype库的使用 //导入下载好的prototype.js文件 <script type="text/javascript" src="prototype.js"></script> //在自己的js中直接使用Prototype对象 <script type="text/javascript"> document.writeln("Prototype库的版本

Duilib学习笔记《03》— 控件使用

在前面已经对duilib有个一个基本的了解,并且创建了简单的空白窗体.这仅仅只是一个开始,如何去创建一个绚丽多彩的界面呢?这就需要一些控件元素(按钮.文本框.列表框等等)来完善. 一. Duilib控件简介 在之前空白窗体的基础上,在界面上添加了一些控件,让大家先对这些控件效果有个基本的认识.如下图所示: 基本控件 高级控件 一些控件的基本显示效果就如同上面两幅图所示.实际上,在Duilib学习笔记<01>—duilib整体框架认识中我们就已经提到过Duilib这个库的组成,其中就提到了控件这

Android学习笔记二十七之ExpandableListView可折叠列表和StackView栈视图

Android学习笔记二十七之ExpandableListView可折叠列表和StackView栈视图 ExpandableListView可折叠列表 这一节我们介绍第三个用适配器的控件,ExpandableListView可折叠列表.这个控件可以实现我们在QQ中非常常见好友分组功能,ExpandableListView是ListView的子类,用法跟ListView差不多,下面我们来学习这个控件的基本使用: 常用属性: android:childDivider:指定各组内子类表项之间的分隔条,

AJax 学习笔记二(onreadystatechange的作用)

AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了onreadyStateChange事件实现这一功能.这类似于回调函数的做法.onreadyStateChange事件可指定一个事件处理函数来处理XMLHttpRequest对象的执行结果,如: 复制代码 代码如下: ajaxObj=createAjaxObject(); var url="/MyTod

2. 蛤蟆Python脚本学习笔记二基本命令畅玩

2. 蛤蟆Python脚本学习笔记二基本命令畅玩 本篇名言:"成功源于发现细节,没有细节就没有机遇,留心细节意味着创造机遇.一件司空见惯的小事或许就可能是打开机遇宝库的钥匙!" 下班回家,咱先来看下一些常用的基本命令. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48092873 1.  数字和表达式 看下图1一就能说明很多问题: 加法,整除,浮点除,取模,幂乘方等.是不是很直接也很粗暴. 关于上限,蛤蟆不太清楚