181 lines
5.6 KiB
C#
181 lines
5.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Drawing.Drawing2D;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
|
|
namespace CarManagerV3
|
|
{
|
|
public class AnimatedProgressBar : UserControl
|
|
{
|
|
private Timer animationTimer;
|
|
private float animationPosition = 0f;
|
|
private Color primaryColor = Color.FromArgb(0, 120, 215);
|
|
private Color secondaryColor = Color.FromArgb(100, 180, 255);
|
|
private Color backgroundColor = Color.FromArgb(240, 240, 240);
|
|
|
|
public AnimatedProgressBar()
|
|
{
|
|
this.SetStyle(
|
|
ControlStyles.AllPaintingInWmPaint |
|
|
ControlStyles.UserPaint |
|
|
ControlStyles.OptimizedDoubleBuffer |
|
|
ControlStyles.ResizeRedraw,
|
|
true);
|
|
|
|
this.Height = 8;
|
|
|
|
// Initialize animation timer
|
|
animationTimer = new Timer();
|
|
animationTimer.Interval = 20; // 50 FPS
|
|
animationTimer.Tick += AnimationTimer_Tick;
|
|
animationTimer.Start();
|
|
}
|
|
|
|
private void AnimationTimer_Tick(object sender, EventArgs e)
|
|
{
|
|
animationPosition += 2f;
|
|
if (animationPosition > this.Width + 100)
|
|
{
|
|
animationPosition = -100;
|
|
}
|
|
this.Invalidate();
|
|
}
|
|
|
|
protected override void OnPaint(PaintEventArgs e)
|
|
{
|
|
base.OnPaint(e);
|
|
|
|
Graphics g = e.Graphics;
|
|
g.SmoothingMode = SmoothingMode.AntiAlias;
|
|
g.PixelOffsetMode = PixelOffsetMode.HighQuality;
|
|
|
|
// Draw background with rounded corners
|
|
using (GraphicsPath path = GetRoundedRect(ClientRectangle, 4))
|
|
{
|
|
using (SolidBrush bgBrush = new SolidBrush(backgroundColor))
|
|
{
|
|
g.FillPath(bgBrush, path);
|
|
}
|
|
}
|
|
|
|
// Create animated gradient bar
|
|
float barWidth = 100f;
|
|
RectangleF barRect = new RectangleF(animationPosition, 0, barWidth, this.Height);
|
|
|
|
if (barRect.Right > 0 && barRect.Left < this.Width)
|
|
{
|
|
using (GraphicsPath barPath = GetRoundedRect(barRect, 4))
|
|
{
|
|
// Create gradient brush
|
|
using (LinearGradientBrush gradientBrush = new LinearGradientBrush(
|
|
barRect,
|
|
Color.Transparent,
|
|
Color.Transparent,
|
|
LinearGradientMode.Horizontal))
|
|
{
|
|
ColorBlend colorBlend = new ColorBlend();
|
|
colorBlend.Colors = new Color[] {
|
|
Color.FromArgb(0, primaryColor),
|
|
primaryColor,
|
|
secondaryColor,
|
|
primaryColor,
|
|
Color.FromArgb(0, primaryColor)
|
|
};
|
|
colorBlend.Positions = new float[] { 0f, 0.2f, 0.5f, 0.8f, 1f };
|
|
gradientBrush.InterpolationColors = colorBlend;
|
|
|
|
// Clip to control bounds
|
|
Region oldClip = g.Clip;
|
|
using (GraphicsPath clipPath = GetRoundedRect(ClientRectangle, 4))
|
|
{
|
|
g.SetClip(clipPath);
|
|
g.FillPath(gradientBrush, barPath);
|
|
g.Clip = oldClip;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Draw subtle border
|
|
using (GraphicsPath borderPath = GetRoundedRect(ClientRectangle, 4))
|
|
{
|
|
using (Pen borderPen = new Pen(Color.FromArgb(220, 220, 220), 1))
|
|
{
|
|
g.DrawPath(borderPen, borderPath);
|
|
}
|
|
}
|
|
}
|
|
|
|
private GraphicsPath GetRoundedRect(RectangleF rect, float radius)
|
|
{
|
|
GraphicsPath path = new GraphicsPath();
|
|
float diameter = radius * 2;
|
|
|
|
path.AddArc(rect.X, rect.Y, diameter, diameter, 180, 90);
|
|
path.AddArc(rect.Right - diameter, rect.Y, diameter, diameter, 270, 90);
|
|
path.AddArc(rect.Right - diameter, rect.Bottom - diameter, diameter, diameter, 0, 90);
|
|
path.AddArc(rect.X, rect.Bottom - diameter, diameter, diameter, 90, 90);
|
|
path.CloseFigure();
|
|
|
|
return path;
|
|
}
|
|
|
|
public void StartAnimation()
|
|
{
|
|
animationTimer.Start();
|
|
}
|
|
|
|
public void StopAnimation()
|
|
{
|
|
animationTimer.Stop();
|
|
}
|
|
|
|
//protected override void Dispose(bool disposing)
|
|
//{
|
|
// if (disposing)
|
|
// {
|
|
// animationTimer?.Stop();
|
|
// animationTimer?.Dispose();
|
|
// }
|
|
// base.Dispose(disposing);
|
|
//}
|
|
|
|
// Properties for customization
|
|
public Color PrimaryColor
|
|
{
|
|
get => primaryColor;
|
|
set
|
|
{
|
|
primaryColor = value;
|
|
this.Invalidate();
|
|
}
|
|
}
|
|
|
|
public Color SecondaryColor
|
|
{
|
|
get => secondaryColor;
|
|
set
|
|
{
|
|
secondaryColor = value;
|
|
this.Invalidate();
|
|
}
|
|
}
|
|
|
|
public Color ProgressBackColor
|
|
{
|
|
get => backgroundColor;
|
|
set
|
|
{
|
|
backgroundColor = value;
|
|
this.Invalidate();
|
|
}
|
|
}
|
|
}
|
|
}
|