初学c# -- 学习笔记(五) winfrom自定义滚动条

找了些例子,要么庞大、要么搞个安装组件什么的,我要求能用就行了。实在找例子修改麻烦,就做了一个。其实实现挺简单,就是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 = 0; i < 25; i++)
            {
                Panel num_panel = new Panel();
                Label num = new Label();

                num.Text = i + ".";
                num.ForeColor = Color.FromArgb(255, 255, 255);
                num.Width = 30;
                num.Dock = DockStyle.Left;
                //设置鼠标滑轮事件,需将mouse_Wheel 值为true,在move里置,下面有,这里就不写了
                //num.MouseWheel += new MouseEventHandler(OnMouseWheel);

                num_panel.Name = "Panel_" + i;
                num_panel.Height = 35;
                num_panel.Margin = new Padding(0, 0, 0, 0);
                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,0) ; //先将位置设置到最顶
            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 = 0;

            if (mouse_Wheel) //是否判断鼠标滑轮
            {
                if (e.Delta > 0) //滑轮向上
                {
                    set_y = ScrollHard_panel.Location.Y - 10; //每次移动10
                    if (set_y < 0) { set_y = 0;  } //超范围
                }
                if (e.Delta < 0)  //滑轮向下
                {
                    set_y = ScrollHard_panel.Location.Y + 10; //每次移动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 < 0) { set_y = 0; } //超范围
                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;
        }
    }
}
时间: 2025-01-04 12:17:25

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

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

java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类装载器和安全管理器是可以被动态扩展的,或者说,他们是可以由用户自己定制的,今天我们就是动手试试,怎么做这部分的实践,当然,在阅读本篇之前,至少要阅读过笔记三. 下面我们先来动态扩展一个类装载器,当然这只是一个比较小的demo,旨在让大家有个比较形象的概念. 第一步,首先定义自己的类装载器,从Clas

Android学习笔记五之Service

Android学习笔记五之Service 1.什么是Service? 什么是Service?Service是Android系统的四大组件之一,官方文档是这样描述Service的: A Service is an application component that can perform long-running operations in the background and does not provide a user interface. Another application comp

jQuery源码学习笔记五 六 七 八 转

jQuery源码学习笔记五 六 七 八 转 Js代码   <p>在正式深入jQuery的核心功能选择器之前,还有一些方法,基本都是数组方法,用于遴选更具体的需求,如获得某个元素的所有祖选元素啦,等等.接着是其缓存机制data.</p> <pre class="brush:javascript;gutter:false;toolbar:false"> //@author  司徒正美|なさみ|cheng http://www.cnblogs.com/ru

laravel3学习笔记(五)

原作者博客:ieqi.net ==================================================================================================== 模型 在MVC模式的Web框架中,模型Model作为数据的抽象而存在,在Model层中,我们放置直接对数据的各种处理和操作,然后将抽象过的数据操作暴露为Model类给控制器,这样,在控制器中我们就不必拘泥于处理具体数据现实的各种细节中了,比如数据库如何连接,数据的类型

Caliburn.Micro学习笔记(五)----协同IResult

Caliburn.Micro学习笔记(五)----协同IResult 今天说一下协同IResult 看一下IResult接口 /// <summary> /// Allows custom code to execute after the return of a action. /// </summary> public interface IResult { /// <summary> /// Executes the result using the specif

Android学习笔记18:自定义Seekbar拖动条式样

Android学习笔记18:自定义Seekbar拖动条式样

angular学习笔记(五)-阶乘计算实例(1)

<!DOCTYPE html> <html ng-app> <head> <title>2.3.2计算阶乘实例1</title> <meta charset="utf-8"> <script src="../angular.js"></script> <script src="script.js"></script> </

NLTK学习笔记(五):分类和标注词汇

[TOC] 词性标注器 之后的很多工作都需要标注完的词汇.nltk自带英文标注器pos_tag import nltk text = nltk.word_tokenize("And now for something compleyely difference") print(text) print(nltk.pos_tag(text)) 标注语料库 表示已经标注的标识符:nltk.tag.str2tuple('word/类型') text = "The/AT grand/J

Linux System Programming 学习笔记(五) 进程管理

1. 进程是unix系统中两个最重要的基础抽象之一(另一个是文件) A process is a running program A thread is the unit of activity inside of a process the virtualization of memory is associated with the process, the threads all share the same memory address space 2. pid The idle pro

WEB前端学习笔记 五

接web前端学习笔记第四篇,此篇为web学习笔记 五,在此感谢您的采集和转发,但请注明文章出自网知博学. 2.0.3  html标签的属性格式 现在我们知道了两个双标签分别是,标题标签:<h1> - <h6>.和段落标签:<p></p>还知道了一个换行的单标签:<br />,现在我们给<p></p>标签添加一个属性,来改变段落是右对齐,还是左对齐,还是居中. 如上图,<p>标签中的 align(中文就是排列的意