找了些例子,要么庞大、要么搞个安装组件什么的,我要求能用就行了。实在找例子修改麻烦,就做了一个。其实实现挺简单,就是panel或图片什么的跟着鼠标走就行了。

这里panel自己可以加背景图或直接搞个图就行了。为了演示清楚,有个滚动条控件做对比,与自定义的同步。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace customscroll
{
public partial class Form1 : Form
{
int limt, set_x; //滚动位置最大值和固定的左右的位置
bool mouse_Press = false; //鼠标按下
bool mouse_Wheel = false; //滑轮是否滚动
Point mouseOff; //存放当前鼠标位置 public Form1()
{
InitializeComponent();
//向panel填充一堆内容
for (int i = ; i < ; i++)
{
Panel num_panel = new Panel();
Label num = new Label(); num.Text = i + ".";
num.ForeColor = Color.FromArgb(, , );
num.Width = ;
num.Dock = DockStyle.Left;
//设置鼠标滑轮事件,需将mouse_Wheel 值为true,在move里置,下面有,这里就不写了
//num.MouseWheel += new MouseEventHandler(OnMouseWheel); num_panel.Name = "Panel_" + i;
num_panel.Height = ;
num_panel.Margin = new Padding(, , , );
num_panel.BackColor = Color.SteelBlue;
num_panel.BorderStyle = BorderStyle.Fixed3D;
num_panel.Dock = DockStyle.Top;
num_panel.BorderStyle = System.Windows.Forms.BorderStyle.None;
num_panel.Controls.Add(num);
//设置鼠标滑轮事件,需将mouse_Wheel 值为true,在move里置,下面有,这里就不写了
//num_panel.MouseWheel += new MouseEventHandler(OnMouseWheel);
Content_panel.Controls.Add(num_panel); //将内容装入
//设置鼠标滑轮事件,需将mouse_Wheel 值为true,在move里置,下面有,这里就不写了
//Content_panel.MouseWheel += new MouseEventHandler(OnMouseWheel);
}
//装内容panel自动大小
Content_panel.AutoSize = true; set_x = ScrollHard_panel.Location.X; //固定左右位置为当前位置
limt = ScrollBar_panel.Height - ScrollHard_panel.Height; //滚动最大高度
ScrollHard_panel.Location = new Point(set_x,) ; //先将位置设置到最顶
vScrollBar1.Maximum = limt; //放了个vScrollBar组件,演示用的,和自定义的同步 //鼠标滑轮事件
ScrollBar_panel.MouseWheel += new MouseEventHandler(OnMouseWheel);
ScrollHard_panel.MouseWheel += new MouseEventHandler(OnMouseWheel);
vScrollBar1.MouseWheel += new MouseEventHandler(OnMouseWheel);
} //鼠标滑轮事件
private void OnMouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
{
int set_y = ; if (mouse_Wheel) //是否判断鼠标滑轮
{
if (e.Delta > ) //滑轮向上
{
set_y = ScrollHard_panel.Location.Y - ; //每次移动10
if (set_y < ) { set_y = ; } //超范围
}
if (e.Delta < ) //滑轮向下
{
set_y = ScrollHard_panel.Location.Y + ; //每次移动10
if (set_y > limt) { set_y = limt; } //超范围
}
ScrollHard_panel.Location = new Point(set_x, set_y); //滚动块的定位
vScrollBar1.Value = set_y; //演示用的滚动条,和自定义的同步 Content_panel.Top = -set_y; //装内容的panel滚动显示
} } //自定义滚动“块”框鼠标按下
private void ScrollHard_panel_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left) //鼠标左键
{
mouseOff.Y = e.Y; //取当前位置
mouse_Press = true; //鼠标按下
}
} //自定义滚动“块”鼠标放开
private void ScrollHard_panel_MouseUp(object sender, MouseEventArgs e)
{
mouse_Press = false; //鼠标放开
} //自定义滚动“块”鼠标离开范围
private void ScrollHard_panel_MouseLeave(object sender, EventArgs e)
{
mouse_Wheel = false; //滑轮不可用
} ////自定义滚动“块”鼠标在范围
private void ScrollHard_panel_MouseMove(object sender, MouseEventArgs e)
{
mouse_Wheel = true; //可以用滑轮
if (mouse_Press) //鼠标按下状态
{
int set_y = ScrollHard_panel.Top + e.Y - mouseOff.Y; //计算当前纵向坐标
if (set_y < ) { set_y = ; } //超范围
else if (set_y > limt) { set_y = limt; } //超范围
else { ScrollHard_panel.Location = new Point(set_x, set_y); } //滚动块的定位
vScrollBar1.Value = set_y; //演示的滚动条和自定义的同步
Content_panel.Top = -set_y; //装内容的panel滚动显示
}
} //在滚动“框”范围内
private void ScrollBar_panel_MouseMove(object sender, MouseEventArgs e)
{
mouse_Wheel = true; //可以使用滑轮
} //离开滚动“框”
private void ScrollBar_panel_MouseLeave(object sender, EventArgs e)
{
mouse_Wheel = false; //不可使用滑轮
} //自定义滚动“框”鼠标放开
private void ScrollBar_panel_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left) //鼠标左键
{
int set_y = e.Y; //当前纵坐标
if (set_y > limt) { set_y = limt; } //超范围
ScrollHard_panel.Location = new Point(set_x, set_y); //滚动块定位
vScrollBar1.Value = set_y; //演示的滚动条,和自定义的同步
Content_panel.Top = -set_y;//装内容的panel滚动显示
mouse_Press = false; //鼠标为放开状态
}
} //演示用的vScrollBar1组件,也可以控制装内容的panel滚动显示
private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
{
Content_panel.Top = -vScrollBar1.Value;
}
}
}

初学c# -- 学习笔记(五) winfrom自定义滚动条的更多相关文章

  1. 初学c# -- 学习笔记(一)

    初学c# -- 学习笔记(一) 学习C#了,参考许多资料,一步步学习.这一段学习ajax的工作原理,参照其他例子写了web版的群聊小程序,全部文件代码也就不到300行,很简单.使用时先输入用户名,点确 ...

  2. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  3. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  4. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  5. Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  6. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  7. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

  8. muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor

    目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...

  9. python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍

    python3.4学习笔记(五) IDLE显示行号问题,插件安装和其他开发工具介绍 IDLE默认不能显示行号,使用ALT+G 跳到对应行号,在右下角有显示光标所在行.列.pycharm免费社区版.Su ...

  10. Go语言学习笔记五: 条件语句

    Go语言学习笔记五: 条件语句 if语句 if 布尔表达式 { /* 在布尔表达式为 true 时执行 */ } 竟然没有括号,和python很像.但是有大括号,与python又不一样. 例子: pa ...

随机推荐

  1. Oracle 游标示例,带异常处理

    Oracle游标示例一则,带异常处理. DECLARE CURSOR c_dl IS SELECT ID, NSRSBH, WSPZXH, ZXYY_DM, HZRQ, SWJG_DM, GXSJ F ...

  2. Entity Framework 学习笔记

    1.自定义数据库链接字符串上下文 public class PetDbContext : DbContext { public PetDbContext() : base("name=Dem ...

  3. iOS开发 - OC - 苹果为大家提供的后台:CloudKit 的简单使用

    一.什么是cloudKit 移动开发中,网络请求数据是日常中用到的,我们习惯把一些用户改动的数据存在服务器,以便下次请求使用.或者开发者方通过服务器将编辑的数据发送给用户.但是这一切都建立在我们的AP ...

  4. AX 2012 中代码控制用户可查询哪些公司的数据

    关联table:UserDataAreaFilter, parm:dataareaid parm2:userid

  5. 3.2 ARM指令分类学习

    1 算术移位寄存器和逻辑指令 1.1 mov 传送(Move) Mov {条件} {S} <dest>, <op_1> MOV从另一个寄存器.被移位的寄存器.或者一个立即数装载 ...

  6. JS获取文本值

    var closeBtn=document.getElementById("close_btn"): closeBtn.innerHTML即是文本值,如果要的是数字parseInt ...

  7. 世界国家 的数据库sql

    , '中国', 'CHINA'); , '阿尔巴尼亚', 'ALB'); , '阿尔及利亚', 'DZA'); , '阿富汗', 'AFG'); , '阿根廷', 'ARG'); , '阿拉伯联合酋长 ...

  8. LR12.53—第7课:分析场景

    第7课:分析场景 在前面的课程中,您学习如何设计,控制和执行方案运行.一旦您已加载您的服务器,你要分析的运行,并确定需要被淘汰,以提高系统性能的问题. 在图表和报告中有关方案的性能您的分析会议上提出的 ...

  9. 使用python+pychram进行API测试(接口测试)初级STEP 1

    花了一天时间安装了解了下最基本的python+pychram进行API测试,下面这个可以指导自己以后入门:基本的开发级别还需要学习 1.python下载地址:https://www.python.or ...

  10. android activity的启动方式

    1.Standard正常启动,默认的启动方式,没什么说头 2.SingleTop 意思就是在栈顶只能存在一个相同的activity 不能叠加,如果再A上继续启动A的话,只会调用A的onNewInten ...