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?(完整配置步骤)

