C#winform自定义滚动条
1.控件
一个UserControl作为ScrollBg,一个panel作为ScrollBar

2.实现功能
(1)设置滚动条背景颜色和背景图片
(2)设置滚动条滑块的背景颜色和背景图片
(3)鼠标左键拖动滑块上下滑动
(4)鼠标进入和离开滑块事件
(5)滚动鼠标中间滚轮事件
(6)鼠标左键点击滚动条除去滑块的位置,上下移动滑块
(7)鼠标左键长时间按住滚动条除去滑块的位置,上下移动滑块
3.关键数据

滑块大小: BoxPanelHeight/ContentPanelHeight*ScrollBgHeight
ContenPanel纵坐标: -ScrollBar.Top /( ScrollBgHeigh - ScrollBgHeight)* (ContentPanelHeight - BoxPanelHeight));
4.代码
(1)自定义控件
public partial class ScrollBarBg : UserControl
{
#region private properties private Timer ScrollTimer = null; /// <summary>
/// 框架面板高度
/// </summary>
private int BoxPanelHeight = ; /// <summary>
/// 内容面板高度
/// </summary>
private int ContentPanelHeight = ; /// <summary>
/// 滚动条滑块鼠标左键是否按下
/// </summary>
private bool IsLeftKeyDown_ScrollBar = false; /// <summary>
/// 滚动条背景板鼠标左键是否按下
/// </summary>
private bool IsLeftKeyDown_ScrollBg = false; /// <summary>
/// 鼠标相对有屏幕的Y坐标
/// </summary>
private int MouseYToScreen = ; #endregion public ScrollBarBg()
{
InitializeComponent();
this.ScrollBar.Top = ;
this.MouseWheel += ScrollBar_MouseWheel;
ScrollBar.MouseWheel += ScrollBar_MouseWheel;
ScrollTimer = new Timer();
ScrollTimer.Interval = ;
ScrollTimer.Tick += Timer_Tick;
} #region public /// <summary>
/// 滑块高度
/// </summary>
public int ScrollBarHeight
{
get { return this.ScrollBar.Height; }
} /// <summary>
/// 滑块在滚动条上的位置
/// </summary>
public int ScrollBarTop
{
set { ScrollBarAndContent(value); }
get { return this.ScrollBar.Top; }
} /// <summary>
/// 滑块背景颜色
/// </summary>
public Color ScrollBarBackColor
{
set { this.ScrollBar.BackColor = value; }
get { return ScrollBar.BackColor; }
} /// <summary>
/// 滑块背景图片
/// </summary>
public Image ScrollBarBackgroundImage
{
set { this.ScrollBar.BackgroundImage = value; }
get { return ScrollBar.BackgroundImage; }
} /// <summary>
/// 鼠标进入滚动条滑块事件
/// </summary>
public event EventHandler ScrollBarMouseEnter = null; /// <summary>
/// 鼠标离开滚动条滑块事件
/// </summary>
public event EventHandler ScrollBarMouseLeave = null; /// <summary>
/// 滑块滚动发生
/// int:内容面板相对于框架面板的高度
/// </summary>
public Action<int> ScrollBarScroll = null; /// <summary>
/// 鼠标转动滚轮滑块滚动的单位高度,影响滚动速度
/// </summary>
private int mouseWheelUnitHeight = ;
public int MouseWheelUnitHeight
{
set { mouseWheelUnitHeight = value; }
get { return mouseWheelUnitHeight; }
} /// <summary>
/// 长按滚动条背景框滑块滚动的单位高度,影响滚动速度
/// </summary>
private int timerScrollUnitHeight = ;
public int TimerScrollUnitHeight
{
set { timerScrollUnitHeight = value; }
get { return timerScrollUnitHeight; }
} /// <summary>
/// 设置滑块高度
/// </summary>
/// <param name="panelHeight">面板高度</param>
/// <param name="contentHeight">内容高度</param>
public void SetScrollBarHeight(int boxPanelHeight, int contentPanelHeight)
{
BoxPanelHeight = boxPanelHeight;
ContentPanelHeight = contentPanelHeight;
ScrollBar.Height = (int)((double)boxPanelHeight / contentPanelHeight * this.Height);
MouseWheel += ScrollBar_MouseWheel;
} /// <summary>
/// 内容面板鼠标滚动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void ContentPanelMouseWheel(object sender, MouseEventArgs e)
{
ScrollBar_MouseWheel(sender, e);
} #endregion #region private private void ScrollBar_MouseWheel(object sender, MouseEventArgs e)
{
int ScrollBarTop = e.Delta > ? this.ScrollBar.Top - mouseWheelUnitHeight : this.ScrollBar.Top + mouseWheelUnitHeight;
ScrollBarAndContent(ScrollBarTop);
} private void ScrollBar_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
IsLeftKeyDown_ScrollBar = true;
MouseYToScreen = Control.MousePosition.Y;
}
} private void ScrollBar_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
IsLeftKeyDown_ScrollBar = false;
} private void ScrollBar_MouseMove(object sender, MouseEventArgs e)
{
if (IsLeftKeyDown_ScrollBar)
{
int ScrollBarTop = this.ScrollBar.Top + Control.MousePosition.Y - MouseYToScreen;
MouseYToScreen = Control.MousePosition.Y; ScrollBarAndContent(ScrollBarTop);
}
} private void ScrollBar_MouseEnter(object sender, EventArgs e)
{
if (ScrollBarMouseEnter != null)
ScrollBarMouseEnter(sender, e);
} private void ScrollBar_MouseLeave(object sender, EventArgs e)
{
if (ScrollBarMouseLeave != null)
ScrollBarMouseLeave(sender, e);
} private void ScrollBarBg_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
IsLeftKeyDown_ScrollBg = true;
ScrollTimer.Start();
}
} private void Timer_Tick(object sender, EventArgs e)
{
if (!IsLeftKeyDown_ScrollBg)
goto ret; int ScrollBarTop = this.ScrollBar.Top;
int ScrollBarMiddlePointY = ScrollBarTop + ScrollBar.Height / ;
int MousePointToClientY = this.PointToClient(Control.MousePosition).Y;
if (ScrollBarMiddlePointY > MousePointToClientY)
{
if (ScrollBarMiddlePointY - timerScrollUnitHeight < this.PointToClient(Control.MousePosition).Y)
goto ret;
else
ScrollBarTop -= timerScrollUnitHeight;
}
else
{
if (ScrollBarMiddlePointY + timerScrollUnitHeight > this.PointToClient(Control.MousePosition).Y)
goto ret;
else
ScrollBarTop += timerScrollUnitHeight;
} this.BeginInvoke(new Action(() =>
{
ScrollBarAndContent(ScrollBarTop);
}));
return; ret:
IsLeftKeyDown_ScrollBg = false;
ScrollTimer.Stop();
} private void ScrollBarBg_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && IsLeftKeyDown_ScrollBg)
{
IsLeftKeyDown_ScrollBg = false;
int ScrollBarTop = this.ScrollBar.Top + ScrollBar.Height / > e.Y ? this.ScrollBar.Top - timerScrollUnitHeight : this.ScrollBar.Top + timerScrollUnitHeight;
ScrollBarAndContent(ScrollBarTop);
}
} private void ScrollBarControl_SizeChanged(object sender, EventArgs e)
{
this.ScrollBar.Width = this.Width;
} private void ScrollBarAndContent(int ScrollBarTop)
{
if (ScrollBarTop <= )
this.ScrollBar.Top = ;
else if (ScrollBarTop >= this.Height - this.ScrollBar.Height)
this.ScrollBar.Top = this.Height - this.ScrollBar.Height;
else
this.ScrollBar.Top = ScrollBarTop; int Y = (int)(this.ScrollBar.Top / (double)(this.Height - this.ScrollBar.Height) * (ContentPanelHeight - BoxPanelHeight));
if (ScrollBarScroll != null)
ScrollBarScroll(-Y);
} #endregion
}
(2)使用
private void Form2_Load(object sender, EventArgs e)
{
scrollBarBg1.ScrollBarScroll += ScrollBarScroll;
pnContent.MouseWheel += PnContent_MouseWheel; scrollBarBg1.SetScrollBarHeight(this.pnBox.Height, this.pnContent.Height);
scrollBarBg1.ScrollBarTop = ;
} private void PnContent_MouseWheel(object sender, MouseEventArgs e)
{
scrollBarBg1.ContentPanelMouseWheel(sender, e);
} private void ScrollBarScroll(int y)
{
this.pnContent.Top = y;
}
C#winform自定义滚动条的更多相关文章
- (八十九)c#Winform自定义控件-自定义滚动条(treeview、panel、datagridview、listbox、listview、textbox)
官网 http://www.hzhcontrols.com/ 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kw ...
- 自定义滚动条(Custom ScrollBar)
时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.W ...
- CSS3自定义滚动条样式 -webkit-scrollbar(转)
有没有觉得浏览器自带的原始滚动条很不美观,同时也有看到很多网站的自定义滚动条显得高端,就连chrome32.0开发板都抛弃了原始的滚动条,美观多了.那webkit浏览器是如何自定义滚动条的呢? 前言 ...
- jquery自定义滚动条 鼠标移入或滚轮时显示 鼠标离开或悬停超时时隐藏
一.需求: 我需要做一个多媒体播放页面,左侧为播放列表,右侧为播放器.为了避免系统滚动条把列表和播放器隔断开,左侧列表的滚动条需要自定义,并且滚动停止和鼠标离开时要隐藏掉. 二.他山之石: 案例来自h ...
- 利用JS实现自定义滚动条
一般默认的滚动条会比较丑,我们可以用简单的js实现自定义滚动条的功能: 代码如下: <!doctype html> <html> <head> <meta c ...
- javascript 学习之自定义滚动条加滚轮事件
要自己写一个自定义滚动条加上滚轮事件,之前的没有滚轮事件不完整,今天整理了一个. 1.滚轮事件是不兼容的,firefox中是必需要用事件绑定的添加,用的DOMMouseScroll,当滚动鼠标的时候, ...
- 自定义滚动条 - mCustomScrollbar
项目中需要使用自定义滚动条,但是试用了很多都功能不够全,今天发现一个比较全而且用法很简单的 -- mCustomScrollbar http://manos.malihu.gr/jquery-cust ...
- Flex:自定义滚动条样式/隐藏上下箭头
Flex组件自定义滚动条的实现 .scrollBar{ downArrowUpSkin:Embed(source="img/mainLeftScrollBar/bar_bottom.png& ...
- javascript自定义滚动条插件,几行代码的事儿
在实际项目中,经常由于浏览器自带的滚动条样式太戳,而且在各个浏览器中显示不一样,所以我们不得不去实现自定义的滚动条,今天我就用最少的代码实现了一个自定义滚动条,代码量区区只有几十行,使用起来也非常方便 ...
随机推荐
- Apache加载curl_init 失败 php_curl.dll
Call to undefined function curl_init php.ini curl_init extension=php_curl.dll xampp\php\php.ini 2018 ...
- dclcommon200.bpl
xe6 dclcommon200.bpl xe7 dclcommon210.bpl xe8 dclcommon220.bpl xe7,xe8都有对应的文件,xe6为何没有?
- 颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别?计算机颜色格式( 8位 16位 24位 32位色)<转>
颜色模式中8位,16位,24位,32位色彩是什么意思?会有什么区别简单地说这里说的位数和windows系统显示器设置中的颜色位数是一样的.表示的是能够显示出来的颜色的多少. 8位的意思是说,能够显示出 ...
- Yum -y update 报错
问题描述: 操作系统:CentOS 6.5 今天服务器上执行 yum -y update 命令时,提示: Running rpm_check_debug ERROR with rpm_check_de ...
- Python与Go选择排序
#!/usr/bin/env python # -*- coding: utf-8 -*- # 选择排序 # 时间复杂度O(n^2) def selection_sort(array): length ...
- Avro总结(RPC/序列化)
Avro(读音类似于[ævrə])是Hadoop的一个子项目,由Hadoop的创始人Doug Cutting(也是Lucene,Nutch等项目的创始人,膜拜)牵头开发,当前最新版本1.3.3.Avr ...
- LIN通讯
1.定义 LIN(Local Interconnect Network)总线是基于UART/SCI(通用异步收发器/串行接口)的低成本串行通讯协议.其目标定位于车身网络模块节点间的低端通信,主要用于智 ...
- Sql Server 2008R2 数据库发布与订阅
背景描述: 发布服务器A: (远程端) , 数据库服务名: GUANWANG1 订阅服务器B: (本机) , 数据库服务名: PC-LLRDBA 需要从服务器A中数据库发布,然后在B中订阅A发布 ...
- 100. Same Tree同样的树
[抄题]: Given two binary trees, write a function to check if they are the same or not. Two binary tree ...
- 669. Trim a Binary Search Tree修剪二叉搜索树
[抄题]: Given a binary search tree and the lowest and highest boundaries as L and R, trim the tree so ...