C#自定义音乐播放器进度条

发布时间 - 2026-01-11 02:25:16    点击率:

有些时候我们做的程序需要进度条,而vs提供的控件不是我们想要的。先看效果图:

进度条闪烁动画,当然背景可设为Transparent

之前想手绘进度条线条的,结果控件运行时会闪烁,所以直接用了panel控件

源码:

[DefaultEvent("ProgressClick")]
  [ToolboxBitmap(typeof(TrackBar))]
  public partial class ProcessBar : UserControl
  {
    public ProcessBar()
    {
      //InitializeComponent();
      //this.SetStyle(ControlStyles.UserPaint, true);
      //this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
      //this.SetStyle(ControlStyles.DoubleBuffer, true);
    }

    private int locationX=0;
    [Description("单击时X的坐标")]
    public int LocationX
    {
      get { return locationX; }
    }
  
    private int current = 0;
    [Description("当前进度")]
    public int Current
    {
      get { return current; }
      set
      {
        if (value > 232 || value < 0)
          return;
        current = value;
        panelCurrent.Size = new Size(value, 1);
        picture.Location = new Point(value - 4, -3);
        Invalidate();
      }
    }

    private bool isPlay = false;
    [Description("是否播放")]
    public bool IsPlay
    {
      get { return isPlay; }
      set { isPlay = value; tmrCurrent.Enabled = isPlay; Invalidate(); }
    }

    public delegate void MouseHandle(object sender,EventArgs e);
    [Description("点下鼠标")]
    public event MouseHandle BarMouseDown;

    int picturetype = 0;
    private void tmrCurrent_Tick(object sender, EventArgs e)
    {
      if (picturetype == 0)
      { picture.Image = Properties.Resources.play_slider_thumb; picturetype = 1; }
      else
      { picture.Image = Properties.Resources.play_slider_thumb_animate; picturetype = 0; }
      GraphicsPath g = subGraphicsPath(picture.Image);
      if (g == null) return;
      picture.Region = new Region(g);
    }

    private unsafe static GraphicsPath subGraphicsPath(Image img)
    {
      if (img == null) return null;
      // 建立GraphicsPath, 给我们的位图路径计算使用  
      GraphicsPath g = new GraphicsPath(FillMode.Alternate);
      Bitmap bitmap = new Bitmap(img);
      int width = bitmap.Width;
      int height = bitmap.Height;
      BitmapData bmData = bitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
      byte* p = (byte*)bmData.Scan0;
      int offset = bmData.Stride - width * 3;
      int p0, p1, p2;     // 记录左上角0,0座标的颜色值 
      p0 = p[0];
      p1 = p[1];
      p2 = p[2];

      int start = -1;
      // 行座标 ( Y col )  
      for (int Y = 0; Y < height; Y++)
      {
        // 列座标 ( X row )  
        for (int X = 0; X < width; X++)
        {
          if (start == -1 && (p[0] != p0 || p[1] != p1 || p[2] != p2))   //如果 之前的点没有不透明 且 不透明  
          {
            start = X;              //记录这个点 
          }
          else if (start > -1 && (p[0] == p0 && p[1] == p1 && p[2] == p2))   //如果 之前的点是不透明 且 透明 
          {
            g.AddRectangle(new Rectangle(start, Y, X - start, 1));  //添加之前的矩形到 
            start = -1;
          }
          if (X == width - 1 && start > -1)    //如果 之前的点是不透明 且 是最后一个点 
          {
            g.AddRectangle(new Rectangle(start, Y, X - start + 1, 1));   //添加之前的矩形到 
            start = -1;
          }
          p += 3;                  //下一个内存地址 
        }
        p += offset;
      } bitmap.UnlockBits(bmData);
      bitmap.Dispose();
      // 返回计算出来的不透明图片路径  
      return g;
    }

    private void panelTotal_MouseDown(object sender, MouseEventArgs e)
    {
      Current = e.Location.X;
      locationX = e.Location.X;
      if (BarMouseDown != null)
      {
        BarMouseDown.Invoke(sender, e);
      }
    }

    private void panelCurrent_MouseDown(object sender, MouseEventArgs e)
    {
      Current = e.Location.X;
      locationX = e.Location.X;
      if (BarMouseDown != null)
      {
        BarMouseDown.Invoke(sender, e);
      }
    }
  }


用到的素材:

直接右键另存为图片,之所以用黑色背景是因为图片是白色的看不见,不用多说了。

提示:这里用到了unsafe关键字,需要设置项目的属性-----允许运行不安全的代码,没有设置的同学不要以为程序错了


# C#  # 进度条  # c# 实现圆形的进度条(ProgressBar)  # C#实现炫酷启动图-动态进度条效果  # C# Oracle批量插入数据进度条的实现代码  # C#实现带百分比的进度条功能示例  # C#实现带进度条的ListView  # C# Winform下载文件并显示进度条的实现代码  # c#根据文件大小显示文件复制进度条实例  # c#进度条 progressBar 使用方法的小例子  # C#中常使用进度条的代码  # Winform 实现进度条弹窗和任务控制  # C#使用winform实现进度条效果  # 不透明  # 是因为  # 鼠标  # 设为  # 给我们  # 右键  # 错了  # 用了  # 多说  # 另存为  # 手绘  # 不安全  # 先看  # 单击  # 不要以为  # Current 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Python文件流缓冲机制_IO性能解析【教程】  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  ,在苏州找工作,上哪个网站比较好?  Android Socket接口实现即时通讯实例代码  如何在橙子建站中快速调整背景颜色?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  三星网站视频制作教程下载,三星w23网页如何全屏?  Python3.6正式版新特性预览  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  Firefox Developer Edition开发者版本入口  Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践  在线教育网站制作平台,山西立德教育官网?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  什么是javascript作用域_全局和局部作用域有什么区别?  如何在阿里云完成域名注册与建站?  Python制作简易注册登录系统  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  JS碰撞运动实现方法详解  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  Laravel如何处理异常和错误?(Handler示例)  Laravel如何使用Gate和Policy进行授权?(权限控制)  Laravel中的Facade(门面)到底是什么原理  如何基于云服务器快速搭建网站及云盘系统?  如何用AI帮你把自己的生活经历写成一个有趣的故事?  免费视频制作网站,更新又快又好的免费电影网站?  Laravel怎么实现验证码(Captcha)功能  如何获取PHP WAP自助建站系统源码?  javascript基本数据类型及类型检测常用方法小结  北京网站制作的公司有哪些,北京白云观官方网站?  JavaScript模板引擎Template.js使用详解  Laravel如何配置Horizon来管理队列?(安装和使用)  音响网站制作视频教程,隆霸音响官方网站?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  佛山网站制作系统,佛山企业变更地址网上办理步骤?  JS中对数组元素进行增删改移的方法总结  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  详解Android图表 MPAndroidChart折线图  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  javascript日期怎么处理_如何格式化输出  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  如何在VPS电脑上快速搭建网站?  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)