using Mesnac.Basic;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Mesnac.Controls.ChemicalWeighing
{
[Description("一个卡车控件,支持两种样式,支持车体升降操作")]
public class HslTruck : UserControl
{
private HslPipeTurnDirection directionStyle = HslPipeTurnDirection.Left;
private float widthDesign = 530f;
private float heightDesign = 325f;
private StringFormat sf = (StringFormat)null;
private float truckAngle = 0.0f;
private int styleMode = 1;
private Color themeColor = Color.FromArgb(235, 209, 159);
private Color boderColor = Color.Silver;
private Pen borderPen = new Pen(Color.FromArgb(150, 150, 150));
private Color edgeColor = Color.FromArgb(176, 176, 176);
private Color centerColor = Color.FromArgb(229, 229, 229);
/// 必需的设计器变量。
private IContainer components = (IContainer)null;
public HslTruck()
{
this.InitializeComponent();
this.sf = new StringFormat();
this.sf.Alignment = StringAlignment.Center;
this.sf.LineAlignment = StringAlignment.Center;
this.SetStyle(ControlStyles.UserPaint | ControlStyles.SupportsTransparentBackColor, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
}
/// 获取或设置控件的背景色
[Browsable(true)]
[Description("获取或设置控件的背景色")]
[Category("HslControls")]
[DefaultValue(typeof(Color), "Transparent")]
[EditorBrowsable(EditorBrowsableState.Always)]
public override Color BackColor
{
get => base.BackColor;
set => base.BackColor = value;
}
/// 获取或设置分类器控件的边缘颜色
[Browsable(true)]
[Description("获取或设置分类器控件的边缘颜色")]
[Category("HslControls")]
[DefaultValue(typeof(Color), "[176, 176, 176]")]
public Color EdgeColor
{
get => this.edgeColor;
set
{
this.edgeColor = value;
this.Invalidate();
}
}
/// 获取或设置当前的卡车的倾斜角度,合适范围为0-21
[Browsable(true)]
[Description("获取或设置当前的卡车的倾斜角度,合适范围为0-21")]
[Category("HslControls")]
[DefaultValue(0.0f)]
public float TruckAngle
{
get => this.truckAngle;
set
{
this.truckAngle = value;
this.Invalidate();
}
}
/// 获取或设置分类器控件的中心颜色
[Browsable(true)]
[Description("获取或设置分类器控件的中心颜色")]
[Category("HslControls")]
[DefaultValue(typeof(Color), "[229, 229, 229]")]
public Color CenterColor
{
get => this.centerColor;
set
{
this.centerColor = value;
this.Invalidate();
}
}
/// 获取或设置分类器控件的边缘颜色
[Browsable(true)]
[Description("获取或设置分类器控件的边缘颜色")]
[Category("HslControls")]
[DefaultValue(typeof(Color), "Silver")]
public Color BorderColor
{
get => this.boderColor;
set
{
this.boderColor = value;
this.borderPen.Dispose();
this.borderPen = new Pen(this.boderColor);
this.Invalidate();
}
}
/// 获取或设置卡车的主题颜色
[Browsable(true)]
[Description("获取或设置卡车的主题颜色")]
[Category("HslControls")]
[DefaultValue(typeof(Color), "[235, 209, 159]")]
public Color ThemeColor
{
get => this.themeColor;
set
{
this.themeColor = value;
this.Invalidate();
}
}
/// 获取或设置卡车的状态,有两个选择,1,2
[Browsable(true)]
[Description("获取或设置卡车的状态,有两个选择,1,2")]
[Category("HslControls")]
[DefaultValue(1)]
public int TruckStyle
{
get => this.styleMode;
set
{
this.styleMode = value;
this.Invalidate();
}
}
/// 获取或设置卡车的朝向,仅支持朝右边或是左边
[Browsable(true)]
[Description("获取或设置卡车的朝向,仅支持朝右边或是左边")]
[Category("HslControls")]
[DefaultValue(typeof(HslPipeTurnDirection), "Right")]
public HslPipeTurnDirection TurnDirection
{
get => this.directionStyle;
set
{
this.directionStyle = value;
this.Invalidate();
}
}
///
protected override void OnPaint(PaintEventArgs e)
{
Graphics graphics = e.Graphics;
graphics.SmoothingMode = SmoothingMode.HighQuality;
graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
this.PaintHslControls(graphics, this.Width, this.Height);
base.OnPaint(e);
}
///
public void PaintHslControls(Graphics g, int width, int height)
{
//if (!Authorization.iashdiadasbdnajsdhjaf())
// return;
if (this.directionStyle == HslPipeTurnDirection.Left)
{
g.ScaleTransform(-1f, 1f);
g.TranslateTransform((float)-width, 0.0f);
}
if (width > 15 && height > 15)
{
if ((double)width > (double)this.widthDesign / (double)this.heightDesign * (double)height)
this.PaintMain(g, this.widthDesign / this.heightDesign * (float)height, (float)height);
else
this.PaintMain(g, (float)width, this.heightDesign / this.widthDesign * (float)width);
}
if (this.directionStyle != HslPipeTurnDirection.Left)
return;
g.TranslateTransform((float)width, 0.0f);
g.ScaleTransform(-1f, 1f);
}
private RectangleF TransRectangleF(RectangleF rectangle, float width, float height) => new RectangleF(rectangle.X * width / this.widthDesign, rectangle.Y * height / this.heightDesign, rectangle.Width * width / this.widthDesign, rectangle.Height * height / this.heightDesign);
private PointF[] TransPoints(PointF[] points, float width, float height)
{
PointF[] pointFArray = new PointF[points.Length];
for (int index = 0; index < points.Length; ++index)
pointFArray[index] = new PointF(points[index].X * width / this.widthDesign, points[index].Y * height / this.heightDesign);
return pointFArray;
}
private void PaintPolygon(Graphics g, string points, Color color, float width, float height)
{
PointF[] pointsFrom = HslHelper.GetPointsFrom(points, this.widthDesign, this.heightDesign, width, height);
using (SolidBrush solidBrush = new SolidBrush(color))
g.FillPolygon((Brush)solidBrush, pointsFrom);
g.DrawPolygon(this.borderPen, pointsFrom);
}
private void PaintMain(Graphics g, float width, float height)
{
ColorBlend colorBlend = new ColorBlend();
colorBlend.Positions = new float[3] { 0.0f, 0.35f, 1f };
colorBlend.Colors = new Color[3]
{
this.edgeColor,
this.centerColor,
this.edgeColor
};
this.PaintPolygon(g, "244,274 410,274 410,283 244,283", this.themeColor, width, height);
this.PaintPolygon(g, "410,125 485,125 529,188 529,283 410,283 410,125", this.themeColor, width, height);
using (SolidBrush solidBrush = new SolidBrush(Color.FromArgb(251, 253, 252)))
g.FillPolygon((Brush)solidBrush, HslHelper.GetPointsFrom("430,137 482,137 509,180 509,195 430,195 430,137", this.widthDesign, this.heightDesign, width, height));
using (SolidBrush solidBrush = new SolidBrush(Color.FromArgb(232, 244, 237)))
g.FillPolygon((Brush)solidBrush, HslHelper.GetPointsFrom("430,137 482,137 454,195 430,195 430,137", this.widthDesign, this.heightDesign, width, height));
using (Pen pen = new Pen(Color.FromArgb(81, 81, 81), 3f))
g.DrawPolygon(pen, HslHelper.GetPointsFrom("430,137 482,137 509,180 509,195 430,195 430,137", this.widthDesign, this.heightDesign, width, height));
using (SolidBrush solidBrush = new SolidBrush(Color.FromArgb(81, 81, 81)))
g.FillEllipse((Brush)solidBrush, this.TransRectangleF((RectangleF)new Rectangle(511, 200, 6, 6), width, height));
using (Pen pen = new Pen(Color.FromArgb(212, 186, 137), 5f))
{
g.DrawLines(pen, HslHelper.GetPointsFrom("413,209 527,209 527,280 413,280 413,209", this.widthDesign, this.heightDesign, width, height));
g.DrawArc(pen, this.TransRectangleF(new RectangleF(430f, 258f, 58f, 52f), width, height), 180f, 180f);
g.DrawPolygon(pen, HslHelper.GetPointsFrom(string.Format("350,268 {0},{1}", (object)(Math.Cos((double)this.truckAngle * 2.0 * Math.PI / 360.0) * 298.0 + 52.0), (object)(258.0 - Math.Sin((double)this.truckAngle * 2.0 * Math.PI / 360.0) * 298.0)), this.widthDesign, this.heightDesign, width, height));
}
this.PaintPolygon(g, "510,179 516,179 516,194 510,194 510,179", Color.FromArgb(81, 81, 81), width, height);
this.PaintPolygon(g, "513,203 515,203 515,194 513,194 513,203", HslHelper.GetColorLight(Color.FromArgb(81, 81, 81)), width, height);
this.PaintPolygon(g, "52,260 396,260 396,275 52,275 52,260", Color.FromArgb(81, 81, 81), width, height);
this.PaintTair(g, 460f, 293f, width, height);
this.PaintTair(g, 102f, 293f, width, height);
this.PaintTair(g, 162f, 293f, width, height);
g.TranslateTransform(52f * width / this.widthDesign, 259f * height / this.heightDesign);
if ((double)this.truckAngle != 0.0)
g.RotateTransform(-this.truckAngle);
if (this.styleMode == 1)
{
this.PaintPolygon(g, "0,-139 348,-139 348,0 0,0 0,-139", Color.FromArgb(233, 233, 233), width, height);
this.PaintPolygon(g, "8,-131 340,-131 340,-8 8,-8 8,-131", this.themeColor, width, height);
float[] numArray = new float[15]
{
30f,
40f,
50f,
95f,
105f,
115f,
160f,
170f,
180f,
225f,
235f,
245f,
290f,
300f,
310f
};
for (int index = 0; index < numArray.Length; ++index)
this.PaintPolygon(g, string.Format("{0},-131 {1},-131 {2},-8 {3},-8 {4},-131", (object)numArray[index], (object)(float)((double)numArray[index] + 5.0), (object)(float)((double)numArray[index] + 5.0), (object)numArray[index], (object)numArray[index]), HslHelper.GetColorLight(this.themeColor), width, height);
}
else if (this.styleMode == 2)
{
RectangleF rect1 = this.TransRectangleF(new RectangleF(-10f, -130f, 20f, 121f), width, height);
LinearGradientBrush linearGradientBrush = new LinearGradientBrush(new PointF(rect1.X, rect1.Y), new PointF(rect1.X, rect1.Y + rect1.Height), Color.FromArgb(142, 196, 216), Color.FromArgb(240, 240, 240));
linearGradientBrush.InterpolationColors = colorBlend;
g.FillEllipse((Brush)linearGradientBrush, rect1);
using (Pen pen = new Pen(this.edgeColor, 1f))
g.DrawEllipse(pen, rect1);
g.FillPolygon((Brush)linearGradientBrush, HslHelper.GetPointsFrom("348,-130 355,-120 355,-10 348,0 348,-130", this.widthDesign, this.heightDesign, width, height));
g.DrawPolygon(this.borderPen, HslHelper.GetPointsFrom("348,-130 355,-120 355,-10 348,0 348,-130", this.widthDesign, this.heightDesign, width, height));
linearGradientBrush.Dispose();
RectangleF rect2 = this.TransRectangleF(new RectangleF(0.0f, -139f, 348f, 140f), width, height);
g.FillRectangle((Brush)new LinearGradientBrush(new PointF(rect2.X, rect2.Y), new PointF(rect2.X, rect2.Y + rect2.Height), Color.FromArgb(142, 196, 216), Color.FromArgb(240, 240, 240))
{
InterpolationColors = colorBlend
}, rect2);
g.DrawRectangle(this.borderPen, rect2.X, rect2.Y, rect2.Width, rect2.Height);
this.PaintPolygon(g, "0,-139 348,-139 348,-134 0,-134 0,-139", this.BorderColor, width, height);
this.PaintPolygon(g, "0,-75 348,-75 348,-65 0,-65 0,-75", this.themeColor, width, height);
this.PaintPolygon(g, "0,-50 348,-50 348,-40 0,-40 0,-50", this.themeColor, width, height);
}
if ((double)this.truckAngle != 0.0)
g.RotateTransform(this.truckAngle);
g.TranslateTransform(-52f * width / this.widthDesign, -259f * height / this.heightDesign);
}
private void PaintTair(Graphics g, float x, float y, float width, float height)
{
SolidBrush solidBrush = new SolidBrush(Color.FromArgb(55, 55, 55));
RectangleF rectangle = new RectangleF(x - 30f, y - 30f, 60f, 60f);
g.FillEllipse((Brush)solidBrush, this.TransRectangleF(rectangle, width, height));
rectangle = new RectangleF(x - 20f, y - 20f, 40f, 40f);
ColorBlend colorBlend = new ColorBlend();
colorBlend.Positions = new float[3] { 0.0f, 0.45f, 1f };
colorBlend.Colors = new Color[3]
{
Color.FromArgb(150, 150, 150),
Color.FromArgb(220, 220, 220),
Color.FromArgb(150, 150, 150)
};
PointF[] pointsFrom = HslHelper.GetPointsFrom(string.Format("{0},{1} {2},{3}", (object)(float)((double)x + 15.0), (object)(float)((double)y - 20.0), (object)(float)((double)x - 15.0), (object)(float)((double)y + 20.0)), this.widthDesign, this.heightDesign, width, height);
LinearGradientBrush linearGradientBrush = new LinearGradientBrush(pointsFrom[0], pointsFrom[1], Color.FromArgb(142, 196, 216), Color.FromArgb(240, 240, 240));
linearGradientBrush.InterpolationColors = colorBlend;
g.FillEllipse((Brush)linearGradientBrush, this.TransRectangleF(rectangle, width, height));
linearGradientBrush.Dispose();
rectangle = new RectangleF(x - 7f, y - 7f, 14f, 14f);
using (Pen pen = new Pen((Brush)solidBrush, 2f))
g.DrawEllipse(pen, this.TransRectangleF(rectangle, width, height));
rectangle = new RectangleF(x - 11f, y - 15f, 8f, 8f);
g.FillEllipse((Brush)solidBrush, this.TransRectangleF(rectangle, width, height));
rectangle = new RectangleF(x - 16f, y + 1f, 8f, 8f);
g.FillEllipse((Brush)solidBrush, this.TransRectangleF(rectangle, width, height));
rectangle = new RectangleF(x - 3f, y + 10f, 8f, 8f);
g.FillEllipse((Brush)solidBrush, this.TransRectangleF(rectangle, width, height));
rectangle = new RectangleF(x + 8f, y + 2f, 8f, 8f);
g.FillEllipse((Brush)solidBrush, this.TransRectangleF(rectangle, width, height));
rectangle = new RectangleF(x + 5f, y - 14f, 8f, 8f);
g.FillEllipse((Brush)solidBrush, this.TransRectangleF(rectangle, width, height));
solidBrush.Dispose();
}
/// 清理所有正在使用的资源。
/// 如果应释放托管资源,为 true;否则为 false。
protected override void Dispose(bool disposing)
{
if (disposing && this.components != null)
this.components.Dispose();
base.Dispose(disposing);
}
///
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
///
private void InitializeComponent()
{
this.SuspendLayout();
this.AutoScaleMode = AutoScaleMode.None;
this.BackColor = Color.Transparent;
this.Name = nameof(HslTruck);
this.Size = new Size(329, 185);
this.ResumeLayout(false);
}
}
}