123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803 |
- // ***********************************************************************
- // Assembly : HZH_Controls
- // Created : 2019-09-04
- //
- // ***********************************************************************
- // <copyright file="UCConduit.cs">
- // Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com
- // </copyright>
- //
- // Blog: https://www.cnblogs.com/bfyx
- // GitHub:https://github.com/kwwwvagaa/NetWinformControl
- // gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
- //
- // If you use this code, please keep this note.
- // ***********************************************************************
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- using System.Drawing;
- using System.Drawing.Drawing2D;
- using System.ComponentModel;
- namespace HZH_Controls.Controls
- {
- /// <summary>
- /// Class UCConduit.
- /// Implements the <see cref="System.Windows.Forms.UserControl" />
- /// </summary>
- /// <seealso cref="System.Windows.Forms.UserControl" />
- public class UCConduit : UserControl
- {
- /// <summary>
- /// The conduit style
- /// </summary>
- private ConduitStyle conduitStyle = ConduitStyle.Horizontal_None_None;
- /// <summary>
- /// Gets or sets the conduit style.
- /// </summary>
- /// <value>The conduit style.</value>
- [Description("样式"), Category("自定义")]
- public ConduitStyle ConduitStyle
- {
- get { return conduitStyle; }
- set
- {
- string strOld = conduitStyle.ToString().Substring(0, 1);
- string strNew = value.ToString().Substring(0, 1);
- conduitStyle = value;
- if (strOld != strNew)
- {
- this.Size = new Size(this.Size.Height, this.Size.Width);
- }
- Refresh();
- }
- }
- /// <summary>
- /// The conduit color
- /// </summary>
- private Color conduitColor = Color.FromArgb(255, 77, 59);
- [Description("颜色"), Category("自定义")]
- /// <summary>
- /// Gets or sets the color of the conduit.
- /// </summary>
- /// <value>The color of the conduit.</value>
- public Color ConduitColor
- {
- get { return conduitColor; }
- set
- {
- conduitColor = value;
- Refresh();
- }
- }
- /// <summary>
- /// The liquid color
- /// </summary>
- private Color liquidColor = Color.FromArgb(3, 169, 243);
- /// <summary>
- /// Gets or sets the color of the liquid.
- /// </summary>
- /// <value>The color of the liquid.</value>
- [Description("液体颜色"), Category("自定义")]
- public Color LiquidColor
- {
- get { return liquidColor; }
- set
- {
- liquidColor = value;
- if (liquidDirection != LiquidDirection.None)
- Refresh();
- }
- }
- /// <summary>
- /// The liquid direction
- /// </summary>
- private LiquidDirection liquidDirection = LiquidDirection.Forward;
- /// <summary>
- /// Gets or sets the liquid direction.
- /// </summary>
- /// <value>The liquid direction.</value>
- [Description("液体流动方向"), Category("自定义")]
- public LiquidDirection LiquidDirection
- {
- get { return liquidDirection; }
- set
- {
- liquidDirection = value;
- if (value == LiquidDirection.None)
- m_timer.Enabled = false;
- else
- m_timer.Enabled = true;
- Refresh();
- }
- }
- /// <summary>
- /// The liquid speed
- /// </summary>
- private int liquidSpeed = 100;
- /// <summary>
- /// 液体流速,越小,速度越快Gets or sets the liquid speed.
- /// </summary>
- /// <value>The liquid speed.</value>
- [Description("液体流速,越小,速度越快"), Category("自定义")]
- public int LiquidSpeed
- {
- get { return liquidSpeed; }
- set
- {
- if (value <= 0)
- return;
- liquidSpeed = value;
- m_timer.Interval = value;
- }
- }
- /// <summary>
- /// The conduit width
- /// </summary>
- int conduitWidth = 50;
- /// <summary>
- /// Gets or sets the width of the conduit.
- /// </summary>
- /// <value>The width of the conduit.</value>
- [Description("管道宽度,当ConduitStyle的值是Horizontal_Tilt_Up,Horizontal_Tilt_Down,Vertical_Tilt_Left,Vertical_Tilt_Right时有效,其他时候将根据管道大小使用自动宽度"), Category("自定义")]
- public int ConduitWidth
- {
- get { return conduitWidth; }
- set
- {
- conduitWidth = value;
- Refresh();
- }
- }
- /// <summary>
- /// The int pen width
- /// </summary>
- int intPenWidth = 0;
- /// <summary>
- /// The int line left
- /// </summary>
- int intLineLeft = 0;
- /// <summary>
- /// The m timer
- /// </summary>
- Timer m_timer;
- /// <summary>
- /// Initializes a new instance of the <see cref="UCConduit" /> class.
- /// </summary>
- public UCConduit()
- {
- this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
- this.SetStyle(ControlStyles.DoubleBuffer, true);
- this.SetStyle(ControlStyles.ResizeRedraw, true);
- this.SetStyle(ControlStyles.Selectable, true);
- this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
- this.SetStyle(ControlStyles.UserPaint, true);
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
- this.SizeChanged += UCConduit_SizeChanged;
- this.Size = new Size(200, 50);
- m_timer = new Timer();
- m_timer.Interval = 100;
- m_timer.Tick += timer_Tick;
- m_timer.Enabled = true;
- }
- /// <summary>
- /// Handles the Tick event of the timer control.
- /// </summary>
- /// <param name="sender">The source of the event.</param>
- /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
- void timer_Tick(object sender, EventArgs e)
- {
- intLineLeft += 2;
- if (intLineLeft > 12)
- intLineLeft = 0;
- Refresh();
- }
- /// <summary>
- /// Handles the SizeChanged event of the UCConduit control.
- /// </summary>
- /// <param name="sender">The source of the event.</param>
- /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
- void UCConduit_SizeChanged(object sender, EventArgs e)
- {
- intPenWidth = conduitStyle.ToString().StartsWith("H") ? this.Height : this.Width;
- }
- /// <summary>
- /// 引发 <see cref="E:System.Windows.Forms.Control.Paint" /> 事件。
- /// </summary>
- /// <param name="e">包含事件数据的 <see cref="T:System.Windows.Forms.PaintEventArgs" />。</param>
- protected override void OnPaint(PaintEventArgs e)
- {
- base.OnPaint(e);
- Graphics g = e.Graphics;
- List<ArcEntity> lstArcs = new List<ArcEntity>();
- GraphicsPath path = new GraphicsPath();
- GraphicsPath linePath = new GraphicsPath();
- List<Point[]> tileLine = new List<Point[]>();
- switch (conduitStyle)
- {
- #region H English:H
- case ConduitStyle.Horizontal_None_None:
- path.AddLines(new PointF[]
- {
- new PointF(0, 0),
- new PointF(this.ClientRectangle.Right, 0),
- new PointF(this.ClientRectangle.Right, this.Height),
- new PointF(0, this.Height)
- });
- path.CloseAllFigures();
- linePath.AddLine(0, this.Height / 2, this.Width, this.Height / 2);
- break;
- case ConduitStyle.Horizontal_Up_None:
- path.AddLines(new PointF[]
- {
- new PointF(0, 0),
- new PointF(this.ClientRectangle.Right, 0),
- new PointF(this.ClientRectangle.Right, this.Height),
- new PointF(0+intPenWidth, this.Height)
- });
- path.AddArc(new Rectangle(0, intPenWidth * -1, intPenWidth * 2, intPenWidth * 2), 90, 90);
- path.CloseAllFigures();
- linePath.AddArc(new Rectangle(intPenWidth / 2 + 1, -1 * intPenWidth / 2 - 1, intPenWidth, intPenWidth), 181, -91);
- linePath.AddLine(intPenWidth, this.Height / 2, this.Width, this.Height / 2);
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(0, intPenWidth * -1, intPenWidth * 2, intPenWidth * 2), startAngle = 90, sweepAngle = 90 });
- break;
- case ConduitStyle.Horizontal_Down_None:
- path.AddLines(new PointF[]
- {
- new PointF(intPenWidth, 0),
- new PointF(this.ClientRectangle.Right, 0),
- new PointF(this.ClientRectangle.Right, this.Height),
- new PointF(0, this.Height)
- });
- path.AddArc(new Rectangle(0, -1, intPenWidth * 2, intPenWidth * 2), 180, 90);
- path.CloseAllFigures();
- linePath.AddArc(new Rectangle(intPenWidth / 2 + 1, this.Height / 2, intPenWidth, intPenWidth), 179, 91);
- linePath.AddLine(intPenWidth + 1, this.Height / 2, this.Width, this.Height / 2);
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(0, -1, intPenWidth * 2, intPenWidth * 2), startAngle = 180, sweepAngle = 90 });
- break;
- case ConduitStyle.Horizontal_None_Up:
- path.AddLines(new PointF[]
- {
- new PointF(this.ClientRectangle.Right-intPenWidth, this.Height),
- new PointF(0, this.Height),
- new PointF(0, 0),
- new PointF(this.ClientRectangle.Right-intPenWidth, 0)
- });
- path.AddArc(new Rectangle(this.ClientRectangle.Right - intPenWidth * 2, intPenWidth * -1, intPenWidth * 2, intPenWidth * 2), 0, 90);
- path.CloseAllFigures();
- linePath.AddLine(0, this.Height / 2, this.Width - intPenWidth, this.Height / 2);
- linePath.AddArc(new Rectangle(this.ClientRectangle.Right - intPenWidth - intPenWidth / 2 - 1, -1 * intPenWidth / 2 - 1, intPenWidth, intPenWidth), 91, -91);
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(this.ClientRectangle.Right - intPenWidth * 2, intPenWidth * -1, intPenWidth * 2, intPenWidth * 2), startAngle = 0, sweepAngle = 90 });
- break;
- case ConduitStyle.Horizontal_None_Down:
- path.AddLines(new PointF[]
- {
- new PointF(this.ClientRectangle.Right, this.Height),
- new PointF(0, this.Height),
- new PointF(0, 0),
- new PointF(this.ClientRectangle.Right-intPenWidth, 0)
- });
- path.AddArc(new Rectangle(this.ClientRectangle.Right - intPenWidth * 2, -1, intPenWidth * 2, intPenWidth * 2), 270, 90);
- path.CloseAllFigures();
- linePath.AddLine(0, this.Height / 2, this.Width - intPenWidth - 1, this.Height / 2);
- linePath.AddArc(new Rectangle(this.ClientRectangle.Right - intPenWidth - intPenWidth / 2 - 1, intPenWidth / 2, intPenWidth, intPenWidth), 269, 91);
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(this.ClientRectangle.Right - intPenWidth * 2, -1, intPenWidth * 2, intPenWidth * 2), startAngle = 270, sweepAngle = 90 });
- break;
- case ConduitStyle.Horizontal_Down_Up:
- path.AddLine(new Point(intPenWidth, 0), new Point(this.Width, 0));
- path.AddArc(new Rectangle(this.ClientRectangle.Right - intPenWidth * 2, intPenWidth * -1, intPenWidth * 2, intPenWidth * 2), 0, 90);
- path.AddLine(new Point(this.Width - intPenWidth, this.Height), new Point(0, this.Height));
- path.AddArc(new Rectangle(0, -1, intPenWidth * 2, intPenWidth * 2), 180, 90);
- path.CloseAllFigures();
- linePath.AddArc(new Rectangle(intPenWidth / 2 + 1, this.Height / 2, intPenWidth, intPenWidth), 179, 91);
- //linePath.AddLine(intPenWidth, this.Height / 2, this.Width - intPenWidth, this.Height / 2);
- linePath.AddArc(new Rectangle(this.ClientRectangle.Right - intPenWidth - intPenWidth / 2 - 1, -1 * intPenWidth / 2 - 1, intPenWidth, intPenWidth), 91, -91);
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(0, -1, intPenWidth * 2, intPenWidth * 2), startAngle = 180, sweepAngle = 90 });
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(this.ClientRectangle.Right - intPenWidth * 2, intPenWidth * -1, intPenWidth * 2, intPenWidth * 2), startAngle = 0, sweepAngle = 90 });
- break;
- case ConduitStyle.Horizontal_Up_Down:
- path.AddLine(new Point(0, 0), new Point(this.Width - intPenWidth, 0));
- path.AddArc(new Rectangle(this.ClientRectangle.Right - intPenWidth * 2, -1, intPenWidth * 2, intPenWidth * 2), 270, 90);
- path.AddLine(new Point(this.Width, this.Height), new Point(intPenWidth, this.Height));
- path.AddArc(new Rectangle(0, intPenWidth * -1, intPenWidth * 2, intPenWidth * 2), 90, 90);
- path.CloseAllFigures();
- linePath.AddArc(new Rectangle(intPenWidth / 2 + 1, -1 * intPenWidth / 2 - 1, intPenWidth, intPenWidth), 181, -91);
- linePath.AddLine(intPenWidth, this.Height / 2, this.Width - intPenWidth - 1, this.Height / 2);
- linePath.AddArc(new Rectangle(this.ClientRectangle.Right - intPenWidth - intPenWidth / 2 - 1, intPenWidth / 2, intPenWidth, intPenWidth), 269, 91);
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(0, intPenWidth * -1, intPenWidth * 2, intPenWidth * 2), startAngle = 90, sweepAngle = 90 });
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(this.ClientRectangle.Right - intPenWidth * 2, -1, intPenWidth * 2, intPenWidth * 2), startAngle = 270, sweepAngle = 90 });
- break;
- case ConduitStyle.Horizontal_Up_Up:
- path.AddLine(new Point(0, 0), new Point(this.Width, 0));
- path.AddArc(new Rectangle(this.ClientRectangle.Right - intPenWidth * 2, intPenWidth * -1, intPenWidth * 2, intPenWidth * 2), 0, 90);
- path.AddLine(new Point(this.Width - intPenWidth, this.Height), new Point(intPenWidth, this.Height));
- path.AddArc(new Rectangle(0, intPenWidth * -1, intPenWidth * 2, intPenWidth * 2), 90, 90);
- path.CloseAllFigures();
- linePath.AddArc(new Rectangle(intPenWidth / 2 + 1, -1 * intPenWidth / 2 - 1, intPenWidth, intPenWidth), 181, -91);
- //linePath.AddLine(intPenWidth, this.Height / 2, this.Width - intPenWidth, this.Height / 2);
- linePath.AddArc(new Rectangle(this.ClientRectangle.Right - intPenWidth - intPenWidth / 2 - 1, -1 * intPenWidth / 2 - 1, intPenWidth, intPenWidth), 91, -91);
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(0, intPenWidth * -1, intPenWidth * 2, intPenWidth * 2), startAngle = 90, sweepAngle = 90 });
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(this.ClientRectangle.Right - intPenWidth * 2, intPenWidth * -1, intPenWidth * 2, intPenWidth * 2), startAngle = 0, sweepAngle = 90 });
- break;
- case ConduitStyle.Horizontal_Down_Down:
- path.AddLine(new Point(intPenWidth, 0), new Point(this.Width - intPenWidth, 0));
- path.AddArc(new Rectangle(this.ClientRectangle.Right - intPenWidth * 2, -1, intPenWidth * 2, intPenWidth * 2), 270, 90);
- path.AddLine(new Point(this.Width, this.Height), new Point(0, this.Height));
- path.AddArc(new Rectangle(0, -1, intPenWidth * 2, intPenWidth * 2), 180, 90);
- path.CloseAllFigures();
- linePath.AddArc(new Rectangle(intPenWidth / 2 + 1, this.Height / 2, intPenWidth, intPenWidth), 179, 91);
- linePath.AddLine(intPenWidth + 1, this.Height / 2, this.Width - intPenWidth - 1, this.Height / 2);
- linePath.AddArc(new Rectangle(this.ClientRectangle.Right - intPenWidth - intPenWidth / 2 - 1, intPenWidth / 2, intPenWidth, intPenWidth), 269, 91);
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(0, -1, intPenWidth * 2, intPenWidth * 2), startAngle = 180, sweepAngle = 90 });
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(this.ClientRectangle.Right - intPenWidth * 2, -1, intPenWidth * 2, intPenWidth * 2), startAngle = 270, sweepAngle = 90 });
- break;
- case ConduitStyle.Horizontal_Tilt_Up:
- double angleUp = Math.Atan((this.ClientRectangle.Height - conduitWidth) / (double)this.ClientRectangle.Width);
- angleUp = angleUp / Math.PI * 180f;
- path.AddArc(new Rectangle(this.ClientRectangle.Left - conduitWidth, this.ClientRectangle.Bottom - conduitWidth * 2, conduitWidth * 2, conduitWidth * 2), 90, -1 * (float)angleUp);
- path.AddLine(new Point(this.ClientRectangle.Right, this.ClientRectangle.Top + conduitWidth), new Point(this.ClientRectangle.Right, this.ClientRectangle.Top));
- path.AddArc(new Rectangle(this.ClientRectangle.Right - conduitWidth, this.ClientRectangle.Top, conduitWidth * 2, conduitWidth * 2), 270, -1 * (float)angleUp);
- path.AddLine(new Point(this.ClientRectangle.Left, this.ClientRectangle.Bottom - conduitWidth), new Point(this.ClientRectangle.Left, this.ClientRectangle.Bottom));
- path.CloseAllFigures();
- linePath.AddArc(new Rectangle(this.ClientRectangle.Right - conduitWidth / 2, this.ClientRectangle.Top + conduitWidth / 2, conduitWidth, conduitWidth), 270, -1 * (float)angleUp);
- linePath.AddArc(new Rectangle(this.ClientRectangle.Left - conduitWidth / 2, this.ClientRectangle.Bottom - 1 - conduitWidth - conduitWidth / 2, conduitWidth, conduitWidth), 95 - (float)angleUp, (float)angleUp + 5);
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(this.ClientRectangle.Left - conduitWidth, this.ClientRectangle.Bottom - conduitWidth * 2, conduitWidth * 2, conduitWidth * 2), startAngle = 90, sweepAngle = -1 * (float)angleUp });
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(this.ClientRectangle.Right - conduitWidth, this.ClientRectangle.Top, conduitWidth * 2, conduitWidth * 2), startAngle = 270, sweepAngle = -1 * (float)angleUp });
- tileLine.Add(new Point[]
- {
- new Point((int)(this.ClientRectangle.Right+1 - Math.Sin(Math.PI * (angleUp / 180.00F)) * conduitWidth),(int)( this.ClientRectangle.Top + conduitWidth - Math.Cos(Math.PI * (angleUp / 180.00F)) * conduitWidth)),
- new Point(this.ClientRectangle.Left,this.ClientRectangle.Bottom-conduitWidth-1)
- });
- tileLine.Add(new Point[]
- {
- new Point((int)(this.ClientRectangle.Left+1 + Math.Sin(Math.PI * (angleUp / 180.00F)) * conduitWidth),(int)( this.ClientRectangle.Bottom - conduitWidth + Math.Cos(Math.PI * (angleUp / 180.00F)) * conduitWidth)),
- new Point(this.ClientRectangle.Right,this.ClientRectangle.Top+conduitWidth)
- });
- break;
- case ConduitStyle.Horizontal_Tilt_Down:
- double angleDown = Math.Atan((this.ClientRectangle.Height - conduitWidth) / (double)this.ClientRectangle.Width);
- angleDown = angleDown / Math.PI * 180f;
- path.AddArc(new Rectangle(this.ClientRectangle.Left - conduitWidth, this.ClientRectangle.Top, conduitWidth * 2, conduitWidth * 2), 270, (float)angleDown);
- path.AddLine(new Point(this.ClientRectangle.Right, this.ClientRectangle.Bottom - conduitWidth), new Point(this.ClientRectangle.Right, this.ClientRectangle.Bottom));
- path.AddArc(new Rectangle(this.ClientRectangle.Right - conduitWidth, this.ClientRectangle.Bottom - conduitWidth * 2, conduitWidth * 2, conduitWidth * 2), 90, (float)angleDown);
- path.AddLine(new Point(this.ClientRectangle.Left, this.ClientRectangle.Top + conduitWidth), new Point(this.ClientRectangle.Left, this.ClientRectangle.Top));
- path.CloseAllFigures();
- linePath.AddArc(new Rectangle(this.ClientRectangle.Left - conduitWidth / 2, this.ClientRectangle.Top + conduitWidth / 2, conduitWidth, conduitWidth), 265, (float)angleDown + 5);
- linePath.AddArc(new Rectangle(this.ClientRectangle.Right - conduitWidth / 2, this.ClientRectangle.Bottom - conduitWidth - conduitWidth / 2 - 1, conduitWidth, conduitWidth), 90 + (float)angleDown, -1 * (float)angleDown - 5);
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(this.ClientRectangle.Left - conduitWidth, this.ClientRectangle.Top, conduitWidth * 2, conduitWidth * 2), startAngle = 270, sweepAngle = (float)angleDown });
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(this.ClientRectangle.Right - conduitWidth, this.ClientRectangle.Bottom - conduitWidth * 2, conduitWidth * 2, conduitWidth * 2), startAngle = 90, sweepAngle = (float)angleDown });
- tileLine.Add(new Point[]
- {
- new Point((int)(this.ClientRectangle.Left + Math.Sin(Math.PI * (angleDown / 180.00F)) * conduitWidth),(int)( this.ClientRectangle.Top + conduitWidth - Math.Cos(Math.PI * (angleDown / 180.00F)) * conduitWidth)),
- new Point(this.ClientRectangle.Right-1,this.ClientRectangle.Bottom-conduitWidth-1)
- });
- tileLine.Add(new Point[]
- {
- new Point((int)(this.ClientRectangle.Right - Math.Sin(Math.PI * (angleDown / 180.00F)) * conduitWidth),(int)( this.ClientRectangle.Bottom - conduitWidth + Math.Cos(Math.PI * (angleDown / 180.00F)) * conduitWidth)),
- new Point(this.ClientRectangle.Left,this.ClientRectangle.Top+conduitWidth)
- });
- break;
- #endregion
- #region V English:V
- case ConduitStyle.Vertical_None_None:
- path.AddLines(new PointF[]
- {
- new PointF(0, 0),
- new PointF(this.ClientRectangle.Right, 0),
- new PointF(this.ClientRectangle.Right, this.Height),
- new PointF(0, this.Height)
- });
- path.CloseAllFigures();
- linePath.AddLine(this.Width / 2, 0, this.Width / 2, this.Height);
- break;
- case ConduitStyle.Vertical_Left_None:
- path.AddLines(new PointF[]
- {
- new PointF(this.ClientRectangle.Right, intPenWidth),
- new PointF(this.ClientRectangle.Right, this.Height),
- new PointF(0, this.Height),
- new PointF(0, 0)
- });
- path.AddArc(new Rectangle(-1 * intPenWidth, 0, intPenWidth * 2, intPenWidth * 2), 270, 90);
- path.CloseAllFigures();
- linePath.AddArc(new Rectangle(-1 * intPenWidth / 2 - 1, intPenWidth / 2 + 1, intPenWidth, intPenWidth), 269, 91);
- linePath.AddLine(intPenWidth / 2, intPenWidth, intPenWidth / 2, this.Height);
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(-1 * intPenWidth, 0, intPenWidth * 2, intPenWidth * 2), startAngle = 270, sweepAngle = 90 });
- break;
- case ConduitStyle.Vertical_Right_None:
- path.AddLines(new PointF[]
- {
- new PointF(this.ClientRectangle.Right, 0),
- new PointF(this.ClientRectangle.Right, this.Height),
- new PointF(0, this.Height),
- new PointF(0, intPenWidth)
- });
- path.AddArc(new Rectangle(-1, 0, intPenWidth * 2, intPenWidth * 2), 180, 90);
- path.CloseAllFigures();
- linePath.AddArc(new Rectangle(intPenWidth / 2, intPenWidth / 2 + 1, intPenWidth, intPenWidth), 271, -91);
- linePath.AddLine(intPenWidth / 2, intPenWidth + 1, intPenWidth / 2, this.Height);
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(-1, 0, intPenWidth * 2, intPenWidth * 2), startAngle = 180, sweepAngle = 90 });
- break;
- case ConduitStyle.Vertical_None_Left:
- path.AddLines(new PointF[]
- {
- new PointF(0, this.Height),
- new PointF(0, 0),
- new PointF(this.ClientRectangle.Right, 0),
- new PointF(this.ClientRectangle.Right, this.Height-intPenWidth),
- });
- path.AddArc(new Rectangle(-1 * intPenWidth, this.Height - intPenWidth * 2, intPenWidth * 2, intPenWidth * 2), 0, 90);
- path.CloseAllFigures();
- linePath.AddLine(this.Width / 2, 0, this.Width / 2, this.Height - intPenWidth);
- linePath.AddArc(new Rectangle(-1 * intPenWidth / 2 - 1, this.Height - intPenWidth - intPenWidth / 2 - 1, intPenWidth, intPenWidth), -1, 91);
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(-1 * intPenWidth, this.Height - intPenWidth * 2, intPenWidth * 2, intPenWidth * 2), startAngle = 0, sweepAngle = 90 });
- break;
- case ConduitStyle.Vertical_None_Right:
- path.AddLines(new PointF[]
- {
- new PointF(0, this.Height-intPenWidth),
- new PointF(0, 0),
- new PointF(this.ClientRectangle.Right, 0),
- new PointF(this.ClientRectangle.Right, this.Height),
- });
- path.AddArc(new Rectangle(-1, this.Height - intPenWidth * 2, intPenWidth * 2, intPenWidth * 2), 90, 90);
- path.CloseAllFigures();
- linePath.AddLine(this.Width / 2, 0, this.Width / 2, this.Height - intPenWidth - 1);
- linePath.AddArc(new Rectangle(intPenWidth / 2, this.Height - intPenWidth - intPenWidth / 2 - 1, intPenWidth, intPenWidth), 181, -91);
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(-1, this.Height - intPenWidth * 2, intPenWidth * 2, intPenWidth * 2), startAngle = 90, sweepAngle = 90 });
- break;
- case ConduitStyle.Vertical_Left_Right:
- path.AddLine(this.Width, intPenWidth, this.Width, this.Height);
- path.AddArc(new Rectangle(-1, this.Height - intPenWidth * 2, intPenWidth * 2, intPenWidth * 2), 90, 90);
- path.AddLine(0, this.Height - intPenWidth, 0, 0);
- path.AddArc(new Rectangle(-1 * intPenWidth, 0, intPenWidth * 2, intPenWidth * 2), 270, 90);
- path.CloseAllFigures();
- linePath.AddArc(new Rectangle(-1 * intPenWidth / 2 - 1, intPenWidth / 2 + 1, intPenWidth, intPenWidth), 269, 91);
- //linePath.AddLine(intPenWidth / 2, intPenWidth, intPenWidth / 2, this.Height - intPenWidth);
- linePath.AddArc(new Rectangle(intPenWidth / 2, this.Height - intPenWidth - intPenWidth / 2 - 1, intPenWidth, intPenWidth), 181, -91);
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(-1 * intPenWidth, 0, intPenWidth * 2, intPenWidth * 2), startAngle = 270, sweepAngle = 90 });
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(-1, this.Height - intPenWidth * 2, intPenWidth * 2, intPenWidth * 2), startAngle = 90, sweepAngle = 90 });
- break;
- case ConduitStyle.Vertical_Right_Left:
- path.AddLine(this.Width, 0, this.Width, this.Height - intPenWidth);
- path.AddArc(new Rectangle(-1 * intPenWidth, this.Height - intPenWidth * 2, intPenWidth * 2, intPenWidth * 2), 0, 90);
- path.AddLine(0, this.Height, 0, intPenWidth);
- path.AddArc(new Rectangle(-1, 0, intPenWidth * 2, intPenWidth * 2), 180, 90);
- path.CloseAllFigures();
- linePath.AddArc(new Rectangle(intPenWidth / 2, intPenWidth / 2 + 1, intPenWidth, intPenWidth), 271, -91);
- //linePath.AddLine(intPenWidth / 2, intPenWidth, intPenWidth / 2, this.Height - intPenWidth);
- linePath.AddArc(new Rectangle(-1 * intPenWidth / 2 - 1, this.Height - intPenWidth - intPenWidth / 2 - 1, intPenWidth, intPenWidth), -1, 91);
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(-1, 0, intPenWidth * 2, intPenWidth * 2), startAngle = 180, sweepAngle = 90 });
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(-1 * intPenWidth, this.Height - intPenWidth * 2, intPenWidth * 2, intPenWidth * 2), startAngle = 0, sweepAngle = 90 });
- break;
- case ConduitStyle.Vertical_Left_Left:
- path.AddLine(this.Width, intPenWidth, this.Width, this.Height - intPenWidth);
- path.AddArc(new Rectangle(-1 * intPenWidth, this.Height - intPenWidth * 2, intPenWidth * 2, intPenWidth * 2), 0, 90);
- path.AddLine(0, this.Height, 0, 0);
- path.AddArc(new Rectangle(-1 * intPenWidth, 0, intPenWidth * 2, intPenWidth * 2), 270, 90);
- path.CloseAllFigures();
- linePath.AddArc(new Rectangle(-1 * intPenWidth / 2 - 1, intPenWidth / 2 + 1, intPenWidth, intPenWidth), 269, 91);
- //linePath.AddLine(intPenWidth / 2, intPenWidth, intPenWidth / 2, this.Height - intPenWidth);
- linePath.AddArc(new Rectangle(-1 * intPenWidth / 2 - 1, this.Height - intPenWidth - intPenWidth / 2 - 1, intPenWidth, intPenWidth), -1, 91);
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(-1 * intPenWidth, 0, intPenWidth * 2, intPenWidth * 2), startAngle = 270, sweepAngle = 90 });
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(-1 * intPenWidth, this.Height - intPenWidth * 2, intPenWidth * 2, intPenWidth * 2), startAngle = 0, sweepAngle = 90 });
- break;
- case ConduitStyle.Vertical_Right_Right:
- path.AddLine(this.Width, 0, this.Width, this.Height);
- path.AddArc(new Rectangle(-1, this.Height - intPenWidth * 2, intPenWidth * 2, intPenWidth * 2), 90, 90);
- path.AddLine(0, this.Height - intPenWidth, 0, intPenWidth);
- path.AddArc(new Rectangle(-1, 0, intPenWidth * 2, intPenWidth * 2), 180, 90);
- path.CloseAllFigures();
- linePath.AddArc(new Rectangle(intPenWidth / 2, intPenWidth / 2 + 1, intPenWidth, intPenWidth), 271, -91);
- //linePath.AddLine(intPenWidth / 2, intPenWidth, intPenWidth / 2, this.Height - intPenWidth);
- linePath.AddArc(new Rectangle(intPenWidth / 2, this.Height - intPenWidth - intPenWidth / 2 - 1, intPenWidth, intPenWidth), 180, -91);
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(-1, 0, intPenWidth * 2, intPenWidth * 2), startAngle = 180, sweepAngle = 90 });
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(-1, this.Height - intPenWidth * 2, intPenWidth * 2, intPenWidth * 2), startAngle = 90, sweepAngle = 90 });
- break;
- case ConduitStyle.Vertical_Tilt_Left:
- double angleLeft = Math.Atan((this.ClientRectangle.Width - conduitWidth) / (double)this.ClientRectangle.Height);
- angleLeft = angleLeft / Math.PI * 180f;
- path.AddArc(new Rectangle(this.ClientRectangle.Left - 1, ClientRectangle.Top - conduitWidth, conduitWidth * 2, conduitWidth * 2), 180, -1 * (float)angleLeft);
- path.AddLine(new Point(this.ClientRectangle.Right - conduitWidth, this.ClientRectangle.Bottom), new Point(this.ClientRectangle.Right, this.ClientRectangle.Bottom));
- path.AddArc(new Rectangle(this.ClientRectangle.Right - conduitWidth * 2, this.ClientRectangle.Bottom - conduitWidth, conduitWidth * 2, conduitWidth * 2), 0, -1 * (float)angleLeft);
- path.AddLine(new Point(this.ClientRectangle.Left + conduitWidth, this.ClientRectangle.Top), new Point(this.ClientRectangle.Left, this.ClientRectangle.Top));
- path.CloseAllFigures();
- linePath.AddArc(new Rectangle(this.ClientRectangle.Left + conduitWidth / 2, this.ClientRectangle.Top - conduitWidth / 2, conduitWidth, conduitWidth), 185, -1 * (float)angleLeft - 5);
- linePath.AddArc(new Rectangle(this.ClientRectangle.Right - conduitWidth - conduitWidth / 2, this.ClientRectangle.Bottom - conduitWidth / 2, conduitWidth, conduitWidth), -1 * (float)angleLeft, (float)angleLeft);
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(this.ClientRectangle.Left - 1, ClientRectangle.Top - conduitWidth, conduitWidth * 2, conduitWidth * 2), startAngle = 180, sweepAngle = -1 * (float)angleLeft });
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(this.ClientRectangle.Right - conduitWidth * 2, this.ClientRectangle.Bottom - conduitWidth, conduitWidth * 2, conduitWidth * 2), startAngle = 0, sweepAngle = -1 * (float)angleLeft });
- tileLine.Add(new Point[]
- {
- new Point((int)(this.ClientRectangle.Left + conduitWidth),this.ClientRectangle.Top),
- new Point((int)(this.ClientRectangle.Right-conduitWidth+Math.Cos(Math.PI * (angleLeft / 180.00F)) * conduitWidth),(int)(this.ClientRectangle.Bottom-Math.Sin(Math.PI * (angleLeft / 180.00F)) * conduitWidth))
- });
- tileLine.Add(new Point[]
- {
- new Point((int)(this.ClientRectangle.Left-1+conduitWidth-Math.Cos(Math.PI * (angleLeft / 180.00F)) * conduitWidth),(int)(this.ClientRectangle.Top+Math.Sin(Math.PI * (angleLeft / 180.00F)) * conduitWidth)),
- new Point(this.ClientRectangle.Right-conduitWidth,this.ClientRectangle.Bottom)
- });
- break;
- case ConduitStyle.Vertical_Tilt_Right:
- double angleRight = Math.Atan((this.ClientRectangle.Width - conduitWidth) / (double)this.ClientRectangle.Height);
- angleRight = angleRight / Math.PI * 180f;
- path.AddArc(new Rectangle(this.ClientRectangle.Right - conduitWidth * 2, ClientRectangle.Top - conduitWidth, conduitWidth * 2, conduitWidth * 2), 0, (float)angleRight);
- path.AddLine(new Point(this.ClientRectangle.Left + conduitWidth, this.ClientRectangle.Bottom), new Point(this.ClientRectangle.Left, this.ClientRectangle.Bottom));
- path.AddArc(new Rectangle(this.ClientRectangle.Left - 1, this.ClientRectangle.Bottom - conduitWidth, conduitWidth * 2, conduitWidth * 2), 180, (float)angleRight);
- path.AddLine(new Point(this.ClientRectangle.Right - conduitWidth, this.ClientRectangle.Top), new Point(this.ClientRectangle.Right, this.ClientRectangle.Top));
- path.CloseAllFigures();
- linePath.AddArc(new Rectangle(this.ClientRectangle.Right - conduitWidth - conduitWidth / 2, this.ClientRectangle.Top - conduitWidth / 2, conduitWidth, conduitWidth), -5, (float)angleRight + 5);
- linePath.AddArc(new Rectangle(this.ClientRectangle.Left + conduitWidth / 2, this.ClientRectangle.Bottom - conduitWidth / 2, conduitWidth, conduitWidth), 180 + (float)angleRight, -1 * (float)angleRight);
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(this.ClientRectangle.Right - conduitWidth * 2, ClientRectangle.Top - conduitWidth, conduitWidth * 2, conduitWidth * 2), startAngle = 0, sweepAngle = (float)angleRight });
- lstArcs.Add(new ArcEntity() { rect = new Rectangle(this.ClientRectangle.Left - 1, this.ClientRectangle.Bottom - conduitWidth, conduitWidth * 2, conduitWidth * 2), startAngle = 180, sweepAngle = (float)angleRight });
- tileLine.Add(new Point[]
- {
- new Point((int)(this.ClientRectangle.Right - conduitWidth),this.ClientRectangle.Top),
- new Point((int)(this.ClientRectangle.Left + conduitWidth - Math.Cos(Math.PI * (angleRight / 180.00F)) * conduitWidth),(int)(this.ClientRectangle.Bottom-Math.Sin(Math.PI * (angleRight / 180.00F)) * conduitWidth))
- });
- tileLine.Add(new Point[]
- {
- new Point((int)(this.ClientRectangle.Right - conduitWidth+Math.Cos(Math.PI * (angleRight / 180.00F)) * conduitWidth),(int)(this.ClientRectangle.Top+Math.Sin(Math.PI * (angleRight / 180.00F)) * conduitWidth)),
- new Point(this.ClientRectangle.Left + conduitWidth,this.ClientRectangle.Bottom)
- });
- break;
- #endregion
- }
- base.Region = new Region(path);
- g.FillPath(new SolidBrush(conduitColor), path);
- //渐变色
- int _intPenWidth = intPenWidth;
- if (conduitStyle.ToString().Contains("Tilt"))
- {
- _intPenWidth = conduitWidth;
- }
- int intCount = _intPenWidth / 2 / 4;
- for (int i = 0; i < intCount; i++)
- {
- int _penWidth = _intPenWidth / 2 - 4 * i;
- if (_penWidth <= 0)
- _penWidth = 1;
- g.DrawPath(new Pen(new SolidBrush(Color.FromArgb(40, Color.White.R, Color.White.G, Color.White.B)), _penWidth), linePath);
- if (_penWidth == 1)
- break;
- }
- g.SetGDIHigh();
- //使用抗锯齿画圆角
- foreach (var item in lstArcs)
- {
- g.DrawArc(new Pen(new SolidBrush(this.BackColor)), item.rect, item.startAngle, item.sweepAngle);
- }
- if (tileLine.Count > 0)
- {
- foreach (var item in tileLine)
- {
- g.DrawLine(new Pen(new SolidBrush(this.BackColor)), item[0], item[1]);
- }
- }
- //液体流动
- if (LiquidDirection != LiquidDirection.None)
- {
- Pen p = new Pen(new SolidBrush(liquidColor), 4);
- p.DashPattern = new float[] { 6, 6 };
- p.DashOffset = intLineLeft * (LiquidDirection == LiquidDirection.Forward ? -1 : 1);
- g.DrawPath(p, linePath);
- }
- }
- /// <summary>
- /// Class ArcEntity.
- /// </summary>
- class ArcEntity
- {
- /// <summary>
- /// Gets or sets the rect.
- /// </summary>
- /// <value>The rect.</value>
- public Rectangle rect { get; set; }
- /// <summary>
- /// Gets or sets the start angle.
- /// </summary>
- /// <value>The start angle.</value>
- public float startAngle { get; set; }
- /// <summary>
- /// Gets or sets the sweep angle.
- /// </summary>
- /// <value>The sweep angle.</value>
- public float sweepAngle { get; set; }
- }
- }
- /// <summary>
- /// Enum LiquidDirection
- /// </summary>
- public enum LiquidDirection
- {
- /// <summary>
- /// The none
- /// </summary>
- None,
- /// <summary>
- /// The forward
- /// </summary>
- Forward,
- /// <summary>
- /// The backward
- /// </summary>
- Backward
- }
- /// <summary>
- /// 管道样式Enum ConduitStyle
- /// </summary>
- public enum ConduitStyle
- {
- /// <summary>
- /// 直线 The horizontal none none
- /// </summary>
- Horizontal_None_None,
- /// <summary>
- /// 左上The horizontal up none
- /// </summary>
- Horizontal_Up_None,
- /// <summary>
- /// 左下The horizontal down none
- /// </summary>
- Horizontal_Down_None,
- /// <summary>
- /// 右上The horizontal none up
- /// </summary>
- Horizontal_None_Up,
- /// <summary>
- /// 右下The horizontal none down
- /// </summary>
- Horizontal_None_Down,
- /// <summary>
- /// 左下右上The horizontal down up
- /// </summary>
- Horizontal_Down_Up,
- /// <summary>
- /// 左上右下The horizontal up down
- /// </summary>
- Horizontal_Up_Down,
- /// <summary>
- /// 左上,右上The horizontal up up
- /// </summary>
- Horizontal_Up_Up,
- /// <summary>
- /// 左下右下The horizontal down down
- /// </summary>
- Horizontal_Down_Down,
- /// <summary>
- /// 向上倾斜The horizontal tilt up
- /// </summary>
- Horizontal_Tilt_Up,
- /// <summary>
- /// 向下倾斜The horizontal tilt down
- /// </summary>
- Horizontal_Tilt_Down,
- /// <summary>
- /// 竖线The vertical none none
- /// </summary>
- Vertical_None_None,
- /// <summary>
- /// 上左The vertical left none
- /// </summary>
- Vertical_Left_None,
- /// <summary>
- /// 上右The vertical right none
- /// </summary>
- Vertical_Right_None,
- /// <summary>
- /// 下左The vertical none left
- /// </summary>
- Vertical_None_Left,
- /// <summary>
- /// 下右The vertical none right
- /// </summary>
- Vertical_None_Right,
- /// <summary>
- /// 上左下右The vertical left right
- /// </summary>
- Vertical_Left_Right,
- /// <summary>
- /// 上右下左The vertical right left
- /// </summary>
- Vertical_Right_Left,
- /// <summary>
- /// 上左下左The vertical left left
- /// </summary>
- Vertical_Left_Left,
- /// <summary>
- /// 上右下右The vertical right left
- /// </summary>
- Vertical_Right_Right,
- /// <summary>
- /// 向左倾斜The vertical tilt
- /// </summary>
- Vertical_Tilt_Left,
- /// <summary>
- /// 向右倾斜The vertical tilt right
- /// </summary>
- Vertical_Tilt_Right
- }
- }
|