标签:des style class blog code http
public sealed class Clock : PictureBox
{
public Clock()
{
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.DoubleBuffer, true);
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.Selectable, true);
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
SetStyle(ControlStyles.UserPaint, true);
BackColor = Color.Black;
Timer = new Timer {Interval = Interval, Enabled = true};
Timer.Tick += Timer_Tick;
InitColors();
InitNumber();
}
///
///
///
private void Timer_Tick(object sender, EventArgs e)
{
var bmp = new Bitmap(Width, Height);
var g = Graphics.FromImage(bmp);
g.SmoothingMode = SmoothingMode.AntiAlias;
if (Type != TimeType.时分秒)
{
var year1 = Convert.ToInt32(DateTime.Now.Year.ToString("0000")[0].ToString(CultureInfo.InvariantCulture));
var year2 = Convert.ToInt32(DateTime.Now.Year.ToString("0000")[1].ToString(CultureInfo.InvariantCulture));
var year3 = Convert.ToInt32(DateTime.Now.Year.ToString("0000")[2].ToString(CultureInfo.InvariantCulture));
var year4 = Convert.ToInt32(DateTime.Now.Year.ToString("0000")[3].ToString(CultureInfo.InvariantCulture));
DrawNumber(g, 0, year1);
DrawNumber(g, 1, year2);
DrawNumber(g, 2, year3);
DrawNumber(g, 3, year4);
DrawNumber(g, 4, -1);
var month1 = Convert.ToInt32(DateTime.Now.Month.ToString("00")[0].ToString(CultureInfo.InvariantCulture));
var month2 = Convert.ToInt32(DateTime.Now.Month.ToString("00")[1].ToString(CultureInfo.InvariantCulture));
DrawNumber(g, 5, month1);
DrawNumber(g, 6, month2);
DrawNumber(g, 7, -1);
var day1 = Convert.ToInt32(DateTime.Now.Day.ToString("00")[0].ToString(CultureInfo.InvariantCulture));
var day2 = Convert.ToInt32(DateTime.Now.Day.ToString("00")[1].ToString(CultureInfo.InvariantCulture));
DrawNumber(g, 8, day1);
DrawNumber(g, 9, day2);
}
if (Type != TimeType.年月日)
{
var hour1 = Convert.ToInt32(DateTime.Now.Hour.ToString("00")[0].ToString(CultureInfo.InvariantCulture));
var hour2 = Convert.ToInt32(DateTime.Now.Hour.ToString("00")[1].ToString(CultureInfo.InvariantCulture));
DrawNumber(g, Type == TimeType.时分秒 ? 0 : 10, hour1);
DrawNumber(g, Type == TimeType.时分秒 ? 1 : 11, hour2);
DrawColon(g, 0);
var minute1 =
Convert.ToInt32(DateTime.Now.Minute.ToString("00")[0].ToString(CultureInfo.InvariantCulture));
var minute2 =
Convert.ToInt32(DateTime.Now.Minute.ToString("00")[1].ToString(CultureInfo.InvariantCulture));
DrawNumber(g, Type == TimeType.时分秒 ? 2 : 12, minute1);
DrawNumber(g, Type == TimeType.时分秒 ? 3 : 13, minute2);
DrawColon(g, 1);
var second1 =
Convert.ToInt32(DateTime.Now.Second.ToString("00")[0].ToString(CultureInfo.InvariantCulture));
var second2 =
Convert.ToInt32(DateTime.Now.Second.ToString("00")[1].ToString(CultureInfo.InvariantCulture));
DrawNumber(g, Type == TimeType.时分秒 ? 4 : 14, second1);
DrawNumber(g, Type == TimeType.时分秒 ? 5 : 15, second2);
}
BackgroundImage = bmp;
}
///
/// 绘制数字
///
/// GDI
/// 数字位置
/// 数值
private void DrawNumber(Graphics g, int index,int value)
{
if (_numbers.Length > index && WordColor.ContainsKey(value))
{
foreach (var key in _numbers[index].Keys)
{
var colors = WordColor[value].Where(s => s.Type == key).ToList();
if (colors.Any())
{
var c = colors[0].Color;
using (var brush = new SolidBrush(c))
{
g.FillPath(brush, _numbers[index][key]);
}
}
}
}
}
///
/// 绘制冒号
///
/// GDI
/// 绘制第几个
private void DrawColon(Graphics g, int index)
{
if (_colons.Length > index)
{
using (var brush = new SolidBrush(BrightColor))
{
g.FillRectangles(brush, _colons[index]);
}
}
}
#region 属性
private Timer Timer { set; get; }
private TimeType _type = TimeType.时分秒;
private int _interval = 1000;
[Description("时钟显示的时间类型"), DefaultValue(typeof(TimeType)), Browsable(true)]
public TimeType Type
{
set
{
Stop();
_type = value;
InitNumber();
Start();
Invalidate();
}
get { return _type; }
}
///
/// 数字路径
///
private Dictionary[] _numbers = new Dictionary[0];
///
/// 冒号
///
private readonly RectangleF[][] _colons = new RectangleF[2][];
///
/// 时钟跳动间隔
///
[Description("时钟的跳动间隔(毫秒)"),DefaultValue(typeof(Int32)),Browsable(true)]
public int Interval
{
set
{
_interval = value;
Invalidate();
}
get { return _interval; }
}
private readonly Color[] _colors = {Color.FromArgb(0, 255, 1), Color.FromArgb(0, 60, 0)};
///
/// 亮色
///
[Description("数字的颜色"), DefaultValue(typeof(Color)), Browsable(true)]
public Color BrightColor
{
set
{
_colors[0] = value;
InitColors();
Invalidate();
}
get { return _colors[0]; }
}
///
/// 暗色
///
[Description("数字的背景颜色"), DefaultValue(typeof(Color)), Browsable(true)]
public Color DarkColor
{
set
{
_colors[1] = value;
InitColors();
Invalidate();
}
get { return _colors[1]; }
}
///
/// 绘制路径
///
private Dictionary Paths { set; get; }
///
/// 字体颜色设置
///
private Dictionaryint, Word[]> WordColor { set; get; }
///
/// 初始化字体颜色
///
private void InitColors()
{
WordColor = new Dictionaryint, Word[]>
{
{
-1, new[]
{
new Word(WordType.TopHor, DarkColor),
new Word(WordType.LeftTopVer, DarkColor),
new Word(WordType.RightTopVer, DarkColor),
new Word(WordType.MiddleHor, BrightColor),
new Word(WordType.LeftBottomVer, DarkColor),
new Word(WordType.RightBottomVer, DarkColor),
new Word(WordType.BottomHor, DarkColor)
}
},
{
0, new[]
{
new Word(WordType.TopHor, BrightColor),
new Word(WordType.LeftTopVer, BrightColor),
new Word(WordType.RightTopVer, BrightColor),
new Word(WordType.MiddleHor, DarkColor),
new Word(WordType.LeftBottomVer, BrightColor),
new Word(WordType.RightBottomVer, BrightColor),
new Word(WordType.BottomHor, BrightColor)
}
},
{
1, new[]
{
new Word(WordType.TopHor, DarkColor),
new Word(WordType.LeftTopVer, DarkColor),
new Word(WordType.RightTopVer, BrightColor),
new Word(WordType.MiddleHor, DarkColor),
new Word(WordType.LeftBottomVer, DarkColor),
new Word(WordType.RightBottomVer, BrightColor),
new Word(WordType.BottomHor, DarkColor)
}
},
{
2, new[]
{
new Word(WordType.TopHor, BrightColor),
new Word(WordType.LeftTopVer, DarkColor),
new Word(WordType.RightTopVer, BrightColor),
new Word(WordType.MiddleHor, BrightColor),
new Word(WordType.LeftBottomVer, BrightColor),
new Word(WordType.RightBottomVer, DarkColor),
new Word(WordType.BottomHor, BrightColor)
}
},
{
3, new[]
{
new Word(WordType.TopHor, BrightColor),
new Word(WordType.LeftTopVer, DarkColor),
new Word(WordType.RightTopVer, BrightColor),
new Word(WordType.MiddleHor, BrightColor),
new Word(WordType.LeftBottomVer, DarkColor),
new Word(WordType.RightBottomVer, BrightColor),
new Word(WordType.BottomHor, BrightColor)
}
},
{
4, new[]
{
new Word(WordType.TopHor, DarkColor),
new Word(WordType.LeftTopVer, BrightColor),
new Word(WordType.RightTopVer, BrightColor),
new Word(WordType.MiddleHor, BrightColor),
new Word(WordType.LeftBottomVer, DarkColor),
new Word(WordType.RightBottomVer, BrightColor),
new Word(WordType.BottomHor, DarkColor)
}
},
{
5, new[]
{
new Word(WordType.TopHor, BrightColor),
new Word(WordType.LeftTopVer, BrightColor),
new Word(WordType.RightTopVer, DarkColor),
new Word(WordType.MiddleHor, BrightColor),
new Word(WordType.LeftBottomVer, DarkColor),
new Word(WordType.RightBottomVer, BrightColor),
new Word(WordType.BottomHor, BrightColor)
}
},
{
6, new[]
{
new Word(WordType.TopHor, BrightColor),
new Word(WordType.LeftTopVer, BrightColor),
new Word(WordType.RightTopVer, DarkColor),
new Word(WordType.MiddleHor, BrightColor),
new Word(WordType.LeftBottomVer, BrightColor),
new Word(WordType.RightBottomVer, BrightColor),
new Word(WordType.BottomHor, BrightColor)
}
},
{
7, new[]
{
new Word(WordType.TopHor, BrightColor),
new Word(WordType.LeftTopVer, DarkColor),
new Word(WordType.RightTopVer, BrightColor),
new Word(WordType.MiddleHor, DarkColor),
new Word(WordType.LeftBottomVer, DarkColor),
new Word(WordType.RightBottomVer, BrightColor),
new Word(WordType.BottomHor, DarkColor)
}
},
{
8, new[]
{
new Word(WordType.TopHor, BrightColor),
new Word(WordType.LeftTopVer, BrightColor),
new Word(WordType.RightTopVer, BrightColor),
new Word(WordType.MiddleHor, BrightColor),
new Word(WordType.LeftBottomVer, BrightColor),
new Word(WordType.RightBottomVer, BrightColor),
new Word(WordType.BottomHor, BrightColor)
}
},
{
9, new[]
{
new Word(WordType.TopHor, BrightColor),
new Word(WordType.LeftTopVer, BrightColor),
new Word(WordType.RightTopVer, BrightColor),
new Word(WordType.MiddleHor, BrightColor),
new Word(WordType.LeftBottomVer, DarkColor),
new Word(WordType.RightBottomVer, BrightColor),
new Word(WordType.BottomHor, DarkColor)
}
}
};
}
#endregion
///
/// 启动时钟
///
public void Start()
{
if (Timer != null)
{
Timer.Start();
}
}
///
/// 关闭时钟
///
public void Stop()
{
if (Timer != null)
{
Timer.Stop();
}
}
///
/// 初始化数字路径
///
private void InitNumber()
{
var length = 16;
switch (Type)
{
case TimeType.年月日:
_numbers = new Dictionary[10];
length = 10;
break;
case TimeType.年月日时分秒:
_numbers = new Dictionary[16];
length = 18;
break;
case TimeType.时分秒:
length = 8;
_numbers = new Dictionary[6];
break;
}
var w = Height/2;
int x = 5;
int index = 0;
for (int i = 0; i )
{
switch (Type)
{
case TimeType.时分秒:
if (i == 2 || i == 5)
_colons[i == 2 ? 0 : 1] = Colon(x, 5, Height - 10);
else
{
_numbers[index] = Number(x, 5, Height - 10);
index ++;
}
x = (i == 2 || i == 5) ? x + 15 : w + x + 5;
break;
case TimeType.年月日:
_numbers[i] = Number(x, 5, Height - 10);
x = w + x + 5;
break;
case TimeType.年月日时分秒:
if (i != 12 && i != 15)
{
_numbers[index] = Number(x, 5, Height - 10);
index++;
}
x = (i == 9) ? w*2 + x : (i == 12 || i == 15) ? x : w + x + 5;
if (i == 12 || i == 15)
{
_colons[i == 12 ? 0 : 1] = Colon(x, 5, Height - 10);
x = x + w/2;
}
break;
default:
x = w + x + 5;
_numbers[i] = Number(x, 5, Height - 10);
break;
}
}
}
#region 绘制图像方法
///
/// 绘制冒号
///
///
///
///
///
private RectangleF[] Colon(float x, float y, float height)
{
var h = height/20;
var r1 = new RectangleF(x, y + h*6, h*2, h*2);
var r2 = new RectangleF(x, y + h*12, h*2, h*2);
return new[] {r1, r2};
}
///
/// 绘制数字
///
/// 左上角X轴坐标
/// 左上角Y轴坐标
/// 数字高度
private Dictionary Number(float x, float y, float height)
{
Paths = new Dictionary();
var h = height/20;
var w = h;
var width = w*10;
var x1 = x;
var x2 = x + w;
var x3 = x + w*2;
var x4 = x + width - w*2;
var x5 = x + width-w;
var x6 = x + width;
var y1 = y;
var y2 = y + h;
var y3 = y + h*2;
var y4 = y + (height/2 - h);
var y5 = y + (height/2);
var y6 = y + (height/2 + h);
var y7 = y + height - h*2;
var y8 = y + height - h;
var y9 = y + height;
const float offset = 0.5f;
var hor1 = new GraphicsPath();
hor1.AddLines(new[]
{
new PointF(x2 + offset, y2 - offset),
new PointF(x3 + offset, y1 + offset),
new PointF(x4 - offset, y1 + offset),
new PointF(x5 - offset, y2 - offset),
new PointF(x4 - offset, y3 - offset),
new PointF(x3 + offset, y3 - offset),
new PointF(x2 + offset, y2 - offset)
});
hor1.CloseFigure();
Paths.Add(WordType.TopHor, hor1);
var hor2 = new GraphicsPath();
hor2.AddLines(new[]
{
new PointF(x2 +offset, y5),
new PointF(x3 + offset, y4 + offset),
new PointF(x4 - offset, y4 + offset),
new PointF(x5 - offset, y5),
new PointF(x4 - offset, y6 - offset),
new PointF(x3 + offset, y6 - offset),
new PointF(x2 + offset, y5)
});
hor2.CloseFigure();
Paths.Add(WordType.MiddleHor, hor2);
var hor3 = new GraphicsPath();
hor3.AddLines(new[]
{
new PointF(x2 + offset, y8),
new PointF(x3 + offset, y7),
new PointF(x4 - offset, y7),
new PointF(x5 - offset, y8),
new PointF(x4 - offset, y9),
new PointF(x3 + offset, y9),
new PointF(x2 + offset, y8)
});
hor3.CloseFigure();
Paths.Add(WordType.BottomHor, hor3);
var ver1 = new GraphicsPath();
ver1.AddLines(new[]
{
new PointF(x1, y3 + offset),
new PointF(x2, y2 + offset),
new PointF(x3, y3 + offset),
new PointF(x3, y4 - offset),
new PointF(x2, y5 - offset),
new PointF(x1, y4 - offset)
});
ver1.CloseFigure();
Paths.Add(WordType.LeftTopVer, ver1);
var ver2 = new GraphicsPath();
ver2.AddLines(new[]
{
new PointF(x4, y3 + offset),
new PointF(x5, y2 + offset),
new PointF(x6, y3 + offset),
new PointF(x6, y4 - offset),
new PointF(x5, y5 - offset),
new PointF(x4, y4 - offset)
});
ver2.CloseFigure();
Paths.Add(WordType.RightTopVer, ver2);
var ver3 = new GraphicsPath();
ver3.AddLines(new[]
{
new PointF(x1, y6 + offset),
new PointF(x2, y5 + offset),
new PointF(x3, y6 + offset),
new PointF(x3, y7 - offset),
new PointF(x2, y8 - offset),
new PointF(x1, y7 - offset)
});
ver3.CloseFigure();
Paths.Add(WordType.LeftBottomVer, ver3);
var ver4 = new GraphicsPath();
ver4.AddLines(new[]
{
new PointF(x4, y6 + offset),
new PointF(x5, y5 + offset),
new PointF(x6, y6 + offset),
new PointF(x6, y7 - offset),
new PointF(x5, y8 - offset),
new PointF(x4, y7 - offset)
});
ver4.CloseFigure();
Paths.Add(WordType.RightBottomVer, ver4);
return Paths;
}
#endregion
protected override void OnResize(EventArgs e)
{
InitNumber();
base.OnResize(e);
}
///
/// 数字线条结构
///
public struct Word
{
public Word(WordType type, Color color)
: this()
{
Type = type;
Color = color;
}
///
/// 线条类型
///
public WordType Type { set; get; }
///
/// 线条颜色
///
public Color Color { set; get; }
}
#region 隐藏的属性
[Description("背景图像"),DefaultValue(null),Browsable(false)]
public new Image BackgroundImage {get { return base.BackgroundImage; } set { base.BackgroundImage = value; } }
[Description("背景图像布局"), DefaultValue(typeof(ImageLayout)), Browsable(false)]
public new ImageLayout BackgroundImageLayout { get { return base.BackgroundImageLayout; } set { base.BackgroundImageLayout = value; } }
[Description("显示的图像"), DefaultValue(null), Browsable(false)]
public new Image Image{get { return base.Image; } set { base.Image = value; }}
[Description("加载错误时显示的图像"), DefaultValue(null), Browsable(false)]
public new Image ErrorImage{get { return base.ErrorImage; } set { base.ErrorImage = value; }}
[Description("加初始化时显示的图像"), DefaultValue(null), Browsable(false)]
public new Image InitialImage{set { base.InitialImage = value; } get { return base.InitialImage; }}
[Description("只是如何显示图像"), DefaultValue(typeof(PictureBoxSizeMode)), Browsable(false)]
public new PictureBoxSizeMode SizeMode {set { base.SizeMode = value; } get { return base.SizeMode; } }
#endregion
}
///
/// 数字线条枚举
///
public enum WordType
{
TopHor = 0,
LeftTopVer = 1,
RightTopVer = 2,
MiddleHor = 3,
LeftBottomVer = 4,
RightBottomVer = 5,
BottomHor = 6
}
public enum TimeType
{
年月日,
时分秒,
年月日时分秒
}
winfrom LED时钟,搜素材,soscw.com
winfrom LED时钟
标签:des style class blog code http
原文地址:http://www.cnblogs.com/rogation/p/3804479.html