You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

258 lines
11 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
/**************************************************************
*
* 一个显示时间的控件,用来显示当前的时间和额外的定制界面
*
*
*
*************************************************************/
namespace HslCommunication.Controls
{
/// <summary>
/// 一个时钟控件
/// </summary>
public partial class UserClock : UserControl
{
/// <summary>
/// 实例化一个时钟控件
/// </summary>
public UserClock()
{
InitializeComponent();
_Time1s.Interval=50;
_Time1s.Tick+=_Time1s_Tick;
DoubleBuffered = true;
}
private void ClockMy_Load(object sender, EventArgs e)
{
BackgroundImage = _BackGround();
_Time1s.Start();
}
//1秒的时钟
private Timer _Time1s = new Timer();
private void _Time1s_Tick(object sender,EventArgs e)
{
_NowTime = DateTime.Now;
this.Invalidate();
}
private Bitmap _BackGround()
{
int _Width = this.Width;
Bitmap temp = new Bitmap(_Width - 20, _Width - 20);
Graphics g = Graphics.FromImage(temp);
g.SmoothingMode = SmoothingMode.AntiAlias; //使绘图质量最高,即消除锯齿
//g.InterpolationMode = InterpolationMode.HighQualityBicubic;
//g.CompositingQuality = CompositingQuality.HighQuality;
Point _CenterPoint = new Point(temp.Width / 2, temp.Height / 2);
int _R = (temp.Width - 1) / 2;
Rectangle _Rec1 = new Rectangle(0, 0, temp.Width - 1, temp.Width - 1);
Rectangle _Rec2 = new Rectangle(2, 2, temp.Width - 5, temp.Width - 5);
Rectangle _Rec3 = new Rectangle(_CenterPoint.X - 4, _CenterPoint.Y - 4, 8, 8);
Rectangle _Rec4 = new Rectangle(5, 5, temp.Width - 11, temp.Width - 11);
Rectangle _Rec5 = new Rectangle(8, 8, temp.Width - 17, temp.Width - 17);
g.FillEllipse(Brushes.DarkGray, _Rec1);
g.FillEllipse(Brushes.White, _Rec2);
g.DrawEllipse(new Pen(Brushes.Black, (float)1.5), _Rec3);
g.TranslateTransform(_CenterPoint.X, _CenterPoint.Y);
for (int i = 0; i < 60; i++)
{
g.RotateTransform(6);
g.DrawLine(Pens.DarkGray, new Point(_R - 3, 0), new Point(_R - 1, 0));
}
for (int i = 0; i < 12; i++)
{
g.RotateTransform(30);
g.DrawLine(new Pen(Color.Chocolate, 2), new Point(_R - 6, 0), new Point(_R - 1, 0));
}
g.ResetTransform();
System.Drawing.Font FontTemp = new Font("Microsoft YaHei UI", 12);
int IntOffset_X = _R / 2;
int IntOffset_Y = (int)(_R * Math.Sqrt(3) / 2);
g.DrawString("1", FontTemp, Brushes.Green, new PointF(_R + IntOffset_X - 13, _R - IntOffset_Y + 4));
g.DrawString("2", FontTemp, Brushes.Green, new PointF(_R + IntOffset_Y - 17, _R - IntOffset_X - 2));
g.DrawString("3", FontTemp, Brushes.Green, new PointF(2 * _R - 18, _R - 8));
g.DrawString("4", FontTemp, Brushes.Green, new PointF(_R + IntOffset_Y - 18, _R + IntOffset_X - 14));
g.DrawString("5", FontTemp, Brushes.Green, new PointF(_R + IntOffset_X - 14, _R + IntOffset_Y - 19));
g.DrawString("6", FontTemp, Brushes.Green, new PointF(_R - 6, 2 * _R - 22));
g.DrawString("7", FontTemp, Brushes.Green, new PointF(_R - IntOffset_X + 2, _R + IntOffset_Y - 19));
g.DrawString("8", FontTemp, Brushes.Green, new PointF(_R - IntOffset_Y + 5, _R + IntOffset_X - 14));
g.DrawString("9", FontTemp, Brushes.Green, new PointF(8, _R - 9));
g.DrawString("10", FontTemp, Brushes.Green, new PointF(_R - IntOffset_Y + 4, _R - IntOffset_X - 2));
g.DrawString("11", FontTemp, Brushes.Green, new PointF(_R - IntOffset_X, _R - IntOffset_Y + 3));
g.DrawString("12", FontTemp, Brushes.Green, new PointF(_R - 10, 7));
// g.DrawString("Sweet", new Font("Courier New", 9), Brushes.Green, new PointF(_R - 18, _R/2));
Bitmap _temp = new Bitmap(this.Width, this.Height);
Graphics g1 = Graphics.FromImage(_temp);
g1.DrawImage(temp, new Point(10, 10));
temp.Dispose();
return _temp;
}
//#############################################################################################################
//属性设计器
//#############################################################################################################
//
//==================================================================================================
private DateTime _NowTime = DateTime.Now;
/// <summary>
/// 获取时钟的当前时间
/// </summary>
[Category("我的属性"), Description("设置边框的宽度")]
public DateTime
{
get { return _NowTime; }
}
//==================================================================================================
//小时的指针颜色
private Color _HourColor = Color.Chocolate;
/// <summary>
/// 获取或设置时钟指针的颜色
/// </summary>
[Category("我的属性"), Description("设置时钟的指针颜色")]
[DefaultValue(typeof(Color), "Chocolate")]
public Color
{
set { _HourColor = value; }
get { return _HourColor; }
}
//==================================================================================================
//分钟的指针颜色
private Color _MiniteColor = Color.Coral;
/// <summary>
/// 获取或设置时钟分钟指针颜色
/// </summary>
[Category("我的属性"), Description("设置分钟的指针颜色")]
[DefaultValue(typeof(Color), "Coral")]
public Color
{
set { _MiniteColor = value; }
get { return _MiniteColor; }
}
//==================================================================================================
//秒钟的指针颜色
private Color _SecondColor = Color.Green;
/// <summary>
/// 获取或设置秒钟指针颜色
/// </summary>
[Category("我的属性"), Description("设置秒钟的指针颜色")]
[DefaultValue(typeof(Color), "Green")]
public Color
{
set { _SecondColor = value; }
get { return _SecondColor; }
}
//==================================================================================================
//显示的文本
private string _ShowText = "Sweet";
/// <summary>
/// 获取或设置时钟的个性化文本
/// </summary>
[Category("我的属性"), Description("设置时钟显示的字符串")]
[DefaultValue(typeof(string), "Sweet")]
public string
{
set { _ShowText = value; }
get { return _ShowText; }
}
//==================================================================================================
//显示的文本字体
private string _ShowTextFont = "Courier New";
/// <summary>
/// 字体
/// </summary>
[Category("我的属性"), Description("设置时钟显示的字符串")]
[DefaultValue(typeof(string), "Courier New")]
public string
{
set { _ShowTextFont = value; }
get { return _ShowTextFont; }
}
/// <summary>
/// 重绘控件显示
/// </summary>
/// <param name="e"></param>
protected override void OnPaint(PaintEventArgs e)
{
if (!Authorization.nzugaydgwadawdibbas( )) return;
base.OnPaint(e);
int _R = (this.Width - 21) / 2;
int _Hour = _NowTime.Hour;
int _Minite = _NowTime.Minute;
float _Seconds = _NowTime.Second + (float)_NowTime.Millisecond / 1000;
int _ArcHour = _Hour * (30) + 270 + _Minite / 2;
int _ArcMinite = _Minite * 6 + 270;
float _ArcSeconds = _Seconds * 6 + 270;
Graphics g = e.Graphics;
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
System.Drawing.Font _font1 = new System.Drawing.Font(_ShowTextFont, 14);
System.Drawing.Size _SizeTemp = g.MeasureString(_ShowText, _font1).ToSize();
g.DrawString(_ShowText, _font1, Brushes.Green, new PointF(_R - _SizeTemp.Width / 2 + 10, _R / 2 + 12));
g.SmoothingMode = SmoothingMode.AntiAlias;
SizeF _Size = g.MeasureString(_NowTime.DayOfWeek.ToString(), new Font(_ShowTextFont, 10));
g.DrawString(_NowTime.DayOfWeek.ToString(),
new Font(_ShowTextFont, 10), Brushes.Chocolate, new PointF(_R - _Size.ToSize().Width / 2 + 10, _R * 3 / 2 - 2));
g.TranslateTransform(this.Width / 2, this.Width / 2);
g.RotateTransform(_ArcHour, MatrixOrder.Prepend);
g.DrawLine(new Pen(_HourColor, 2), new Point(4, 0), new Point(9, 0));
g.DrawClosedCurve(new Pen(_HourColor, 1), new Point[]{new Point(12,2),new Point(10,0),new Point(12,-2),new Point(_R/2,-2),
new Point(_R/2+6,0),new Point(_R/2,2)});
g.RotateTransform(-_ArcHour);
g.RotateTransform(_ArcMinite, MatrixOrder.Prepend);
g.DrawLine(new Pen(_MiniteColor, 2), new Point(4, 0), new Point(9, 0));
g.DrawClosedCurve(new Pen(_MiniteColor, 1), new Point[]{new Point(14,2),new Point(10,0),new Point(14,-2),new Point(_R-17,-2),
new Point(_R-10,0),new Point(_R-17,2)});
g.RotateTransform(-_ArcMinite);
g.RotateTransform(_ArcSeconds, MatrixOrder.Prepend);
g.DrawLine(new Pen(_SecondColor, 1), new Point(-13, 0), new Point(_R - 6, 0));
g.ResetTransform();
string _StrDate = _NowTime.Year + "-" + _NowTime.Month + "-" + _NowTime.Day;
System.Drawing.Size _Size2 = g.MeasureString(_StrDate, new Font(_ShowTextFont, 12)).ToSize();
g.DrawString(_StrDate, new Font(_ShowTextFont, 12), Brushes.Green, new PointF(_R - _Size2.Width / 2 + 10, _R * 2 + 15));
}
private void ClockMy_SizeChanged(object sender, EventArgs e)
{
this.BackgroundImage = _BackGround();
}
}
}