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示例)

