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


相关推荐: Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  如何用wdcp快速搭建高效网站?  高防服务器租用首荐平台,企业级优惠套餐快速部署  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  Laravel PHP版本要求一览_Laravel各版本环境要求对照  七夕网站制作视频,七夕大促活动怎么报名?  如何在Windows虚拟主机上快速搭建网站?  Laravel如何实现API资源集合?(Resource Collection教程)  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  php485函数参数是什么意思_php485各参数详细说明【介绍】  网站制作软件免费下载安装,有哪些免费下载的软件网站?  如何用已有域名快速搭建网站?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  Laravel如何使用模型观察者?(Observer代码示例)  Laravel如何与Inertia.js和Vue/React构建现代单页应用  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  详解jQuery中的事件  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  JavaScript数据类型有哪些_如何准确判断一个变量的类型  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  LinuxCD持续部署教程_自动发布与回滚机制  Laravel如何创建自定义Artisan命令?(代码示例)  googleplay官方入口在哪里_Google Play官方商店快速入口指南  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  js代码实现下拉菜单【推荐】  如何快速上传建站程序避免常见错误?  简历在线制作网站免费版,如何创建个人简历?  使用豆包 AI 辅助进行简单网页 HTML 结构设计  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Laravel定时任务怎么设置_Laravel Crontab调度器配置  Laravel如何自定义错误页面(404, 500)?(代码示例)  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  Laravel如何使用Passport实现OAuth2?(完整配置步骤)