全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

有些时候我们做的程序需要进度条,而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 


相关文章: 怀化网站制作公司,怀化新生儿上户网上办理流程?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  高防服务器:AI智能防御DDoS攻击与数据安全保障  如何通过WDCP绑定主域名及创建子域名站点?  如何快速搭建高效WAP手机网站吸引移动用户?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  利用JavaScript实现拖拽改变元素大小  定制建站流程步骤详解:一站式方案设计与开发指南  江苏网站制作公司有哪些,江苏书法考级官方网站?  如何快速生成专业多端适配建站电话?  javascript基本数据类型及类型检测常用方法小结  独立制作一个网站多少钱,建立网站需要花多少钱?  如何用美橙互联一键搭建多站合一网站?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  已有域名和空间如何搭建网站?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  学校为何禁止电信移动建设网站?  教学网站制作软件,学习*后期制作的网站有哪些?  ppt制作免费网站有哪些,ppt模板免费下载网站?  宝塔建站教程:一键部署配置流程与SEO优化实战指南  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  常州自助建站工具推荐:低成本搭建与模板选择技巧  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何在Windows 2008云服务器安全搭建网站?  百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?  建站主机选择指南:服务器配置与SEO优化实战技巧  如何选择适合PHP云建站的开源框架?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  成都网站制作报价公司,成都工业用气开户费用?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  制作宣传网站的软件,小红书可以宣传网站吗?  如何通过网站建站时间优化SEO与用户体验?  建站之星好吗?新手能否轻松上手建站?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  免费制作小说封面的网站有哪些,怎么接网站批量的封面单?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  建站之星如何保障用户数据免受黑客入侵?  如何通过FTP空间快速搭建安全高效网站?  5种Android数据存储方式汇总  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  网站制作服务平台,有什么网站可以发布本地服务信息?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  c# await 一个已经完成的Task会发生什么  如何设置并定期更换建站之星安全管理员密码?  如何使用Golang安装API文档生成工具_快速生成接口文档  建站之星CMS五站合一模板配置与SEO优化指南  如何在新浪SAE免费搭建个人博客?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  网页设计网站制作软件,microsoft office哪个可以创建网页? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。