非常喜欢Metro风格的界面,所以想模仿一下一些UI效果的实现,网上找到了很多,但都是CSS3,WPF等实现,对于XAML和CSS3一窍不通,无奈下只有自己开始写。
下面是源码:
LoadingCircle.cs
using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Threading;
using System.Windows.Forms;
using ThreadingTimer = System.Threading.Timer;
using UITimer = System.Windows.Forms.Timer;
namespace LoadingCircle
{
/// <summary>
/// 表示一个加载圆圈动画
/// </summary>
[ToolboxBitmap(typeof (LoadingCircle), "LoadingCircleIcon.png")]
public partial class LoadingCircle : UserControl
{
#region 构造
public LoadingCircle()
{
InitializeComponent();
//双缓冲,禁擦背景
SetStyle(
ControlStyles.AllPaintingInWmPaint |
ControlStyles.UserPaint |
ControlStyles.OptimizedDoubleBuffer,
true);
//初始化绘图timer
_graphicsTmr = new UITimer {Interval = 1};
//Invalidate()强制重绘,绘图操作在OnPaint中实现
_graphicsTmr.Tick += (sender1, e1) => Invalidate(false);
_dotSize = Width/10f;
//初始化"点"
_dots = new Dot[5];
Color = Color.White;
}
#endregion 构造
#region 属性
/// <summary>
/// 圆心
/// </summary>
[Browsable(false)]
public PointF CircleCenter
{
get { return new PointF(Width/2f, Height/2f); }
}
/// <summary>
/// 半径
/// </summary>
[Browsable(false)]
public float CircleRadius
{
get { return Width/2f - _dotSize; }
}
/// <summary>
/// 颜色
/// </summary>
[Browsable(true), Category("Appearance"), Description("设置\"点\"的前景色")]
public Color Color { get; set; }
#endregion 属性
#region 字段
//点数组
private readonly Dot[] _dots;
//Timers
private readonly UITimer _graphicsTmr;
private ThreadingTimer _actionTmr;
//点大小
private float _dotSize;
//是否活动