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 > ) {
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")) == ) 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 > ) {
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;
}
}
…… //源码 //另外,下面的竖向滚动条也一样
}

完美实现!!!

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

  1. WPF学习笔记二之依赖属性

    1.快捷生成依赖属性:propdp然后按两次tab键 2.应用场景:自定义控件 什么是依赖属性:依赖属性自己没有值,通过依赖别人(如Binding)来获得值. 依赖属性为什么会出现:控件常用字段有限, ...

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

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

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

    在前面已经对duilib有个一个基本的了解,并且创建了简单的空白窗体.这仅仅只是一个开始,如何去创建一个绚丽多彩的界面呢?这就需要一些控件元素(按钮.文本框.列表框等等)来完善. 一. Duilib控 ...

  4. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

  5. Duilib学习笔记《05》— 消息响应处理

    在Duilib学习笔记<04>中已经知道了如何将窗体显示出来,而如何处理窗体上的事件.消息呢? 一. 系统消息 窗体显示的时候我们就已经说了,窗体是继承CWindowWnd类的,对于窗体的 ...

  6. Duilib学习笔记《04》— 窗体显示

    在前面已经了解了duilib控件以及界面布局相关内容,接下来就要考虑该如何将xml中描述的布局通过界面展现出来.实际上在 Duilib学习笔记<01> 中我们已经简单提到过基本的流程及元素 ...

  7. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  8. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  9. SQL反模式学习笔记6 支持可变属性【实体-属性-值】

    目标:支持可变属性 反模式:使用泛型属性表.这种设计成为实体-属性-值(EAV),也可叫做开放架构.名-值对. 优点:通过增加一张额外的表,可以有以下好处 (1)表中的列很少: (2)新增属性时,不需 ...

随机推荐

  1. 如何很好的Review自己的代码

    写这篇博文的原因是因为自己写的代码经常会因为返工,delay项目的交付日期.总结了一下引起项目delay的原因,大概有如下几点: 在没有完全深熟悉需求交互细节的情况下:诸如根据不同渠道设置不同的订单状 ...

  2. 框架Hibernate笔记系列 基础Session

    标题:框架Hibernate笔记 资料地址: 1. www.icoolxue.com 孔浩 1.背景简介 Hibenate是JBoss公司的产品.它是数据持久化的框架.Usually,我们使用JDBC ...

  3. struts 用拦截器进行用户权限隔离,未登录用户跳到登录界面 *** 最爱那水货

    一般,我们的web应用都是只有在用户登录之后才允许操作的,也就是说我们不允许非登录认证的用户直接访问某些页面或功能菜单项.对于个别页面来说,可能不需要进行拦截,此时,如果项目采用struts view ...

  4. java 编译时的初始化顺序

    有的时候,java的初始化会对我的工作照成很大影响,所以简单介绍一下, 首先介绍简单的变量的初始化:在类的内部,变量定义的先后顺序决定了初始化的顺序,即使变量定义散布于方法定义之间,它也会先于构造器和 ...

  5. SQL SERVER 2008 R2 SP1更新时,遇上共享功能更新失败解决方案

    SQL SERVER 2008 R2 SP1更新时,遇上共享功能更新失败的问题,可作如下尝试: 更新失败后,在windows的[事件查看器→应用程序]中找到来源为MsiInstaller,事件ID为1 ...

  6. Xamarin 手动安装步骤+破解(最新版Xamarin V3)

    Create native iOS, Android, Mac and Windows apps in C#. 看到这句话,你就知道Xamarin是什么了,对于C#开发者,这样的标语还是会让你激动一下 ...

  7. HTML中网页超链接设计

    一.超链接的概念: 1>用<a>标签实现.href属性设置了要链接的网址. 链接路径URL:Uniform Resource Locator的缩写.统一资源定位符. 4部分组成:协议 ...

  8. Reapp - 下一代的 Hybrid App 开发框架

    Reapp 与 React Native 有着惊人的相似之处,二者都使用 React 来创建应用程序用户界面的框架.然而,在底层机制上这两个框架之间却具有明显的哲学差异.React Native 将 ...

  9. HTML表格边框的设置小技巧

    对于很多初学HTML的人来说,表格<table>是最常用的标签了,但对于表格边框的控制,很多初学者却不甚其解. 对于很多初学HTML的人来说,表格<table>是最常用的标签了 ...

  10. linux下的服务器搭建集成环境

    linux下的服务器搭建集成环境 ——写给初学者的我们 1.准备工具 1.1 SecureCRT SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录 ...