zoukankan      html  css  js  c++  java
  • (六十)c#Winform自定义控件-鼓风机(工业)-HZHControls

    官网

    http://www.hzhcontrols.com

    前提

    入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。

    GitHub:https://github.com/kwwwvagaa/NetWinformControl

    码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git

    如果觉得写的还行,请点个 star 支持一下吧

    欢迎前来交流探讨: 企鹅群568015492 企鹅群568015492

    麻烦博客下方点个【推荐】,谢谢

    NuGet

    Install-Package HZH_Controls

    目录

    https://www.cnblogs.com/bfyx/p/11364884.html

    用处及效果

    可用作水泵,风机,涡轮等

    准备工作

    GDI+画的,不懂的可以自行百度一下

    开始

    添加2个枚举,分别控制进出风口的位置

     1   /// <summary>
     2     /// Enum BlowerEntranceDirection
     3     /// </summary>
     4     public enum BlowerEntranceDirection
     5     {
     6         /// <summary>
     7         /// The none
     8         /// </summary>
     9         None,
    10         /// <summary>
    11         /// The left
    12         /// </summary>
    13         Left,
    14         /// <summary>
    15         /// The right
    16         /// </summary>
    17         Right,
    18         /// <summary>
    19         /// Up
    20         /// </summary>
    21         Up
    22     }
    23 
    24     /// <summary>
    25     /// Enum BlowerExitDirection
    26     /// </summary>
    27     public enum BlowerExitDirection
    28     {
    29         /// <summary>
    30         /// The left
    31         /// </summary>
    32         Left,
    33         /// <summary>
    34         /// The right
    35         /// </summary>
    36         Right,
    37         /// <summary>
    38         /// Up
    39         /// </summary>
    40         Up
    41     }

    属性

     1  /// <summary>
     2         /// The entrance direction
     3         /// </summary>
     4         private BlowerEntranceDirection entranceDirection = BlowerEntranceDirection.None;
     5 
     6         /// <summary>
     7         /// Gets or sets the entrance direction.
     8         /// </summary>
     9         /// <value>The entrance direction.</value>
    10         [Description("入口方向"), Category("自定义")]
    11         public BlowerEntranceDirection EntranceDirection
    12         {
    13             get { return entranceDirection; }
    14             set
    15             {
    16                 entranceDirection = value;
    17                 Refresh();
    18             }
    19         }
    20 
    21         /// <summary>
    22         /// The exit direction
    23         /// </summary>
    24         private BlowerExitDirection exitDirection = BlowerExitDirection.Right;
    25 
    26         /// <summary>
    27         /// Gets or sets the exit direction.
    28         /// </summary>
    29         /// <value>The exit direction.</value>
    30         [Description("出口方向"), Category("自定义")]
    31         public BlowerExitDirection ExitDirection
    32         {
    33             get { return exitDirection; }
    34             set
    35             {
    36                 exitDirection = value;
    37                 Refresh();
    38             }
    39         }
    40 
    41         /// <summary>
    42         /// The blower color
    43         /// </summary>
    44         private Color blowerColor = Color.FromArgb(255, 77, 59);
    45 
    46         /// <summary>
    47         /// Gets or sets the color of the blower.
    48         /// </summary>
    49         /// <value>The color of the blower.</value>
    50         [Description("风机颜色"), Category("自定义")]
    51         public Color BlowerColor
    52         {
    53             get { return blowerColor; }
    54             set
    55             {
    56                 blowerColor = value;
    57                 Refresh();
    58             }
    59         }
    60 
    61         /// <summary>
    62         /// The fan color
    63         /// </summary>
    64         private Color fanColor = Color.FromArgb(3, 169, 243);
    65 
    66         /// <summary>
    67         /// Gets or sets the color of the fan.
    68         /// </summary>
    69         /// <value>The color of the fan.</value>
    70         [Description("风叶颜色"), Category("自定义")]
    71         public Color FanColor
    72         {
    73             get { return fanColor; }
    74             set
    75             {
    76                 fanColor = value;
    77                 Refresh();
    78             }
    79         }
    80 
    81         /// <summary>
    82         /// The m rect working
    83         /// </summary>
    84         Rectangle m_rectWorking;

    重绘

      1 protected override void OnPaint(PaintEventArgs e)
      2         {
      3             base.OnPaint(e);
      4             var g = e.Graphics;
      5             g.SetGDIHigh();
      6             GraphicsPath pathLineIn = new GraphicsPath();
      7             GraphicsPath pathLineOut = new GraphicsPath();
      8             int intLinePenWidth = 0;
      9 
     10             switch (exitDirection)
     11             {
     12                 case BlowerExitDirection.Left:
     13                     g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(0, m_rectWorking.Top, this.Width / 2, m_rectWorking.Height / 2 - 5));
     14                     intLinePenWidth = m_rectWorking.Height / 2 - 5;
     15                     pathLineOut.AddLine(new Point(-10, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) / 2), new Point(m_rectWorking.Left + m_rectWorking.Width / 2, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) / 2));
     16                     g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(1, m_rectWorking.Top - 2), new Point(1, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) + 2));
     17                     break;
     18                 case BlowerExitDirection.Right:
     19                     g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(this.Width / 2, m_rectWorking.Top, this.Width / 2, m_rectWorking.Height / 2 - 5));
     20                     intLinePenWidth = m_rectWorking.Height / 2 - 5;
     21                     pathLineOut.AddLine(new Point(this.Width + 10, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) / 2), new Point(m_rectWorking.Left + m_rectWorking.Width / 2, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) / 2));
     22                     g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(this.Width - 2, m_rectWorking.Top - 2), new Point(this.Width - 2, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) + 2));
     23                     break;
     24                 case BlowerExitDirection.Up:
     25                     g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(m_rectWorking.Right - (m_rectWorking.Width / 2 - 5), 0, m_rectWorking.Width / 2 - 5, this.Height / 2));
     26                     intLinePenWidth = m_rectWorking.Width / 2 - 5;
     27                     pathLineOut.AddLine(new Point(m_rectWorking.Right - (m_rectWorking.Width / 2 - 5) / 2, -10), new Point(m_rectWorking.Right - (m_rectWorking.Width / 2 - 5) / 2, m_rectWorking.Top + m_rectWorking.Height / 2));
     28                     g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(m_rectWorking.Right + 2, 1), new Point(m_rectWorking.Right - (m_rectWorking.Width / 2 - 5) - 2, 1));
     29                     break;
     30             }
     31 
     32             switch (entranceDirection)
     33             {
     34                 case BlowerEntranceDirection.Left:
     35                     g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(0, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5, this.Width / 2, m_rectWorking.Height / 2 - 5));
     36                     pathLineIn.AddLine(new Point(-10, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) / 2), new Point(m_rectWorking.Left + m_rectWorking.Width / 2, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) / 2));
     37                     g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(1, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 - 2), new Point(1, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) + 2));
     38                     break;
     39                 case BlowerEntranceDirection.Right:
     40                     g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(this.Width / 2, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5, this.Width / 2, m_rectWorking.Height / 2 - 5));
     41                     pathLineIn.AddLine(new Point(this.Width + 10, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) / 2), new Point(m_rectWorking.Left + m_rectWorking.Width / 2, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) / 2));
     42                     g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(this.Width - 2, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 - 2), new Point(this.Width - 2, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) + 2));
     43                     break;
     44                 case BlowerEntranceDirection.Up:
     45                     g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(m_rectWorking.Left, 0, m_rectWorking.Width / 2 - 5, this.Height / 2));
     46                     pathLineIn.AddLine(new Point(m_rectWorking.Left + (m_rectWorking.Width / 2 - 5) / 2, -10), new Point(m_rectWorking.Left + (m_rectWorking.Width / 2 - 5) / 2, m_rectWorking.Top + m_rectWorking.Height / 2));
     47                     g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(m_rectWorking.Left - 2, 1), new Point(m_rectWorking.Left + (m_rectWorking.Width / 2 - 5) + 2, 1));
     48                     break;
     49             }
     50 
     51             //渐变色
     52             int _intPenWidth = intLinePenWidth;
     53             int intCount = _intPenWidth / 2 / 4;
     54             for (int i = 0; i < intCount; i++)
     55             {
     56                 int _penWidth = _intPenWidth / 2 - 4 * i;
     57                 if (_penWidth <= 0)
     58                     _penWidth = 1;
     59                 if (entranceDirection != BlowerEntranceDirection.None)
     60                     g.DrawPath(new Pen(new SolidBrush(Color.FromArgb(40, Color.White.R, Color.White.G, Color.White.B)), _penWidth), pathLineIn);
     61                 g.DrawPath(new Pen(new SolidBrush(Color.FromArgb(40, Color.White.R, Color.White.G, Color.White.B)), _penWidth), pathLineOut);
     62                 if (_penWidth == 1)
     63                     break;
     64             }
     65 
     66             //底座
     67             GraphicsPath gpDZ = new GraphicsPath();
     68             gpDZ.AddLines(new Point[] 
     69             {
     70                 new Point( m_rectWorking.Left+m_rectWorking.Width/2,m_rectWorking.Top+m_rectWorking.Height/2),
     71                 new Point(m_rectWorking.Left+2,this.Height),
     72                 new Point(m_rectWorking.Right-2,this.Height)
     73             });
     74             gpDZ.CloseAllFigures();
     75             g.FillPath(new SolidBrush(blowerColor), gpDZ);
     76             g.FillPath(new SolidBrush(Color.FromArgb(50, Color.White)), gpDZ);
     77             g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(m_rectWorking.Left, this.Height - 2), new Point(m_rectWorking.Right, this.Height - 2));
     78 
     79             //中心
     80             g.FillEllipse(new SolidBrush(blowerColor), m_rectWorking);
     81             g.FillEllipse(new SolidBrush(Color.FromArgb(20, Color.White)), m_rectWorking);
     82 
     83 
     84             //扇叶
     85             Rectangle _rect = new Rectangle(m_rectWorking.Left + (m_rectWorking.Width - (m_rectWorking.Width / 3 * 2)) / 2, m_rectWorking.Top + (m_rectWorking.Height - (m_rectWorking.Width / 3 * 2)) / 2, (m_rectWorking.Width / 3 * 2), (m_rectWorking.Width / 3 * 2));
     86 
     87             int _splitCount = 8;
     88             float fltSplitValue = 360F / (float)_splitCount;
     89             for (int i = 0; i <= _splitCount; i++)
     90             {
     91                 float fltAngle = (fltSplitValue * i - 180) % 360;
     92                 float fltY1 = (float)(_rect.Top + _rect.Width / 2 - ((_rect.Width / 2) * Math.Sin(Math.PI * (fltAngle / 180.00F))));
     93                 float fltX1 = (float)(_rect.Left + (_rect.Width / 2 - ((_rect.Width / 2) * Math.Cos(Math.PI * (fltAngle / 180.00F)))));
     94                 float fltY2 = 0;
     95                 float fltX2 = 0;
     96 
     97                 fltY2 = (float)(_rect.Top + _rect.Width / 2 - ((_rect.Width / 4) * Math.Sin(Math.PI * (fltAngle / 180.00F))));
     98                 fltX2 = (float)(_rect.Left + (_rect.Width / 2 - ((_rect.Width / 4) * Math.Cos(Math.PI * (fltAngle / 180.00F)))));
     99 
    100                 g.DrawLine(new Pen(new SolidBrush(fanColor), 2), new PointF(fltX1, fltY1), new PointF(fltX2, fltY2));
    101             }
    102 
    103             g.FillEllipse(new SolidBrush(fanColor), new Rectangle(_rect.Left + _rect.Width / 2 - _rect.Width / 4 + 2, _rect.Top + _rect.Width / 2 - _rect.Width / 4 + 2, _rect.Width / 2 - 4, _rect.Width / 2 - 4));
    104             g.FillEllipse(new SolidBrush(Color.FromArgb(50, Color.White)), new Rectangle(_rect.Left - 5, _rect.Top - 5, _rect.Width + 10, _rect.Height + 10));
    105         }

    全部代码

      1 // ***********************************************************************
      2 // Assembly         : HZH_Controls
      3 // Created          : 2019-09-09
      4 //
      5 // ***********************************************************************
      6 // <copyright file="UCBlower.cs">
      7 //     Copyright by Huang Zhenghui(黄正辉) All, QQ group:568015492 QQ:623128629 Email:623128629@qq.com
      8 // </copyright>
      9 //
     10 // Blog: https://www.cnblogs.com/bfyx
     11 // GitHub:https://github.com/kwwwvagaa/NetWinformControl
     12 // gitee:https://gitee.com/kwwwvagaa/net_winform_custom_control.git
     13 //
     14 // If you use this code, please keep this note.
     15 // ***********************************************************************
     16 using System;
     17 using System.Collections.Generic;
     18 using System.Linq;
     19 using System.Text;
     20 using System.Windows.Forms;
     21 using System.Drawing;
     22 using System.Drawing.Drawing2D;
     23 using System.ComponentModel;
     24 
     25 namespace HZH_Controls.Controls
     26 {
     27     /// <summary>
     28     /// Class UCBlower.
     29     /// Implements the <see cref="System.Windows.Forms.UserControl" />
     30     /// </summary>
     31     /// <seealso cref="System.Windows.Forms.UserControl" />
     32     public class UCBlower : UserControl
     33     {
     34         /// <summary>
     35         /// The entrance direction
     36         /// </summary>
     37         private BlowerEntranceDirection entranceDirection = BlowerEntranceDirection.None;
     38 
     39         /// <summary>
     40         /// Gets or sets the entrance direction.
     41         /// </summary>
     42         /// <value>The entrance direction.</value>
     43         [Description("入口方向"), Category("自定义")]
     44         public BlowerEntranceDirection EntranceDirection
     45         {
     46             get { return entranceDirection; }
     47             set
     48             {
     49                 entranceDirection = value;
     50                 Refresh();
     51             }
     52         }
     53 
     54         /// <summary>
     55         /// The exit direction
     56         /// </summary>
     57         private BlowerExitDirection exitDirection = BlowerExitDirection.Right;
     58 
     59         /// <summary>
     60         /// Gets or sets the exit direction.
     61         /// </summary>
     62         /// <value>The exit direction.</value>
     63         [Description("出口方向"), Category("自定义")]
     64         public BlowerExitDirection ExitDirection
     65         {
     66             get { return exitDirection; }
     67             set
     68             {
     69                 exitDirection = value;
     70                 Refresh();
     71             }
     72         }
     73 
     74         /// <summary>
     75         /// The blower color
     76         /// </summary>
     77         private Color blowerColor = Color.FromArgb(255, 77, 59);
     78 
     79         /// <summary>
     80         /// Gets or sets the color of the blower.
     81         /// </summary>
     82         /// <value>The color of the blower.</value>
     83         [Description("风机颜色"), Category("自定义")]
     84         public Color BlowerColor
     85         {
     86             get { return blowerColor; }
     87             set
     88             {
     89                 blowerColor = value;
     90                 Refresh();
     91             }
     92         }
     93 
     94         /// <summary>
     95         /// The fan color
     96         /// </summary>
     97         private Color fanColor = Color.FromArgb(3, 169, 243);
     98 
     99         /// <summary>
    100         /// Gets or sets the color of the fan.
    101         /// </summary>
    102         /// <value>The color of the fan.</value>
    103         [Description("风叶颜色"), Category("自定义")]
    104         public Color FanColor
    105         {
    106             get { return fanColor; }
    107             set
    108             {
    109                 fanColor = value;
    110                 Refresh();
    111             }
    112         }
    113 
    114         /// <summary>
    115         /// The m rect working
    116         /// </summary>
    117         Rectangle m_rectWorking;
    118 
    119         /// <summary>
    120         /// Initializes a new instance of the <see cref="UCBlower"/> class.
    121         /// </summary>
    122         public UCBlower()
    123         {
    124             this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
    125             this.SetStyle(ControlStyles.DoubleBuffer, true);
    126             this.SetStyle(ControlStyles.ResizeRedraw, true);
    127             this.SetStyle(ControlStyles.Selectable, true);
    128             this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
    129             this.SetStyle(ControlStyles.UserPaint, true);
    130             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
    131             this.SizeChanged += UCBlower_SizeChanged;
    132             this.Size = new Size(120, 120);
    133 
    134         }
    135 
    136         /// <summary>
    137         /// Handles the SizeChanged event of the UCBlower control.
    138         /// </summary>
    139         /// <param name="sender">The source of the event.</param>
    140         /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param>
    141         void UCBlower_SizeChanged(object sender, EventArgs e)
    142         {
    143             int intMin = Math.Min(this.Width, this.Height);
    144             m_rectWorking = new Rectangle((this.Width - (intMin / 3 * 2)) / 2, (this.Height - (intMin / 3 * 2)) / 2, (intMin / 3 * 2), (intMin / 3 * 2));
    145         }
    146 
    147         /// <summary>
    148         /// 引发 <see cref="E:System.Windows.Forms.Control.Paint" /> 事件。
    149         /// </summary>
    150         /// <param name="e">包含事件数据的 <see cref="T:System.Windows.Forms.PaintEventArgs" /></param>
    151         protected override void OnPaint(PaintEventArgs e)
    152         {
    153             base.OnPaint(e);
    154             var g = e.Graphics;
    155             g.SetGDIHigh();
    156             GraphicsPath pathLineIn = new GraphicsPath();
    157             GraphicsPath pathLineOut = new GraphicsPath();
    158             int intLinePenWidth = 0;
    159 
    160             switch (exitDirection)
    161             {
    162                 case BlowerExitDirection.Left:
    163                     g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(0, m_rectWorking.Top, this.Width / 2, m_rectWorking.Height / 2 - 5));
    164                     intLinePenWidth = m_rectWorking.Height / 2 - 5;
    165                     pathLineOut.AddLine(new Point(-10, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) / 2), new Point(m_rectWorking.Left + m_rectWorking.Width / 2, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) / 2));
    166                     g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(1, m_rectWorking.Top - 2), new Point(1, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) + 2));
    167                     break;
    168                 case BlowerExitDirection.Right:
    169                     g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(this.Width / 2, m_rectWorking.Top, this.Width / 2, m_rectWorking.Height / 2 - 5));
    170                     intLinePenWidth = m_rectWorking.Height / 2 - 5;
    171                     pathLineOut.AddLine(new Point(this.Width + 10, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) / 2), new Point(m_rectWorking.Left + m_rectWorking.Width / 2, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) / 2));
    172                     g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(this.Width - 2, m_rectWorking.Top - 2), new Point(this.Width - 2, m_rectWorking.Top + (m_rectWorking.Height / 2 - 5) + 2));
    173                     break;
    174                 case BlowerExitDirection.Up:
    175                     g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(m_rectWorking.Right - (m_rectWorking.Width / 2 - 5), 0, m_rectWorking.Width / 2 - 5, this.Height / 2));
    176                     intLinePenWidth = m_rectWorking.Width / 2 - 5;
    177                     pathLineOut.AddLine(new Point(m_rectWorking.Right - (m_rectWorking.Width / 2 - 5) / 2, -10), new Point(m_rectWorking.Right - (m_rectWorking.Width / 2 - 5) / 2, m_rectWorking.Top + m_rectWorking.Height / 2));
    178                     g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(m_rectWorking.Right + 2, 1), new Point(m_rectWorking.Right - (m_rectWorking.Width / 2 - 5) - 2, 1));
    179                     break;
    180             }
    181 
    182             switch (entranceDirection)
    183             {
    184                 case BlowerEntranceDirection.Left:
    185                     g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(0, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5, this.Width / 2, m_rectWorking.Height / 2 - 5));
    186                     pathLineIn.AddLine(new Point(-10, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) / 2), new Point(m_rectWorking.Left + m_rectWorking.Width / 2, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) / 2));
    187                     g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(1, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 - 2), new Point(1, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) + 2));
    188                     break;
    189                 case BlowerEntranceDirection.Right:
    190                     g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(this.Width / 2, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5, this.Width / 2, m_rectWorking.Height / 2 - 5));
    191                     pathLineIn.AddLine(new Point(this.Width + 10, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) / 2), new Point(m_rectWorking.Left + m_rectWorking.Width / 2, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) / 2));
    192                     g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(this.Width - 2, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 - 2), new Point(this.Width - 2, m_rectWorking.Bottom - m_rectWorking.Height / 2 + 5 + (m_rectWorking.Height / 2 - 5) + 2));
    193                     break;
    194                 case BlowerEntranceDirection.Up:
    195                     g.FillRectangle(new SolidBrush(blowerColor), new Rectangle(m_rectWorking.Left, 0, m_rectWorking.Width / 2 - 5, this.Height / 2));
    196                     pathLineIn.AddLine(new Point(m_rectWorking.Left + (m_rectWorking.Width / 2 - 5) / 2, -10), new Point(m_rectWorking.Left + (m_rectWorking.Width / 2 - 5) / 2, m_rectWorking.Top + m_rectWorking.Height / 2));
    197                     g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(m_rectWorking.Left - 2, 1), new Point(m_rectWorking.Left + (m_rectWorking.Width / 2 - 5) + 2, 1));
    198                     break;
    199             }
    200 
    201             //渐变色
    202             int _intPenWidth = intLinePenWidth;
    203             int intCount = _intPenWidth / 2 / 4;
    204             for (int i = 0; i < intCount; i++)
    205             {
    206                 int _penWidth = _intPenWidth / 2 - 4 * i;
    207                 if (_penWidth <= 0)
    208                     _penWidth = 1;
    209                 if (entranceDirection != BlowerEntranceDirection.None)
    210                     g.DrawPath(new Pen(new SolidBrush(Color.FromArgb(40, Color.White.R, Color.White.G, Color.White.B)), _penWidth), pathLineIn);
    211                 g.DrawPath(new Pen(new SolidBrush(Color.FromArgb(40, Color.White.R, Color.White.G, Color.White.B)), _penWidth), pathLineOut);
    212                 if (_penWidth == 1)
    213                     break;
    214             }
    215 
    216             //底座
    217             GraphicsPath gpDZ = new GraphicsPath();
    218             gpDZ.AddLines(new Point[] 
    219             {
    220                 new Point( m_rectWorking.Left+m_rectWorking.Width/2,m_rectWorking.Top+m_rectWorking.Height/2),
    221                 new Point(m_rectWorking.Left+2,this.Height),
    222                 new Point(m_rectWorking.Right-2,this.Height)
    223             });
    224             gpDZ.CloseAllFigures();
    225             g.FillPath(new SolidBrush(blowerColor), gpDZ);
    226             g.FillPath(new SolidBrush(Color.FromArgb(50, Color.White)), gpDZ);
    227             g.DrawLine(new Pen(new SolidBrush(blowerColor), 3), new Point(m_rectWorking.Left, this.Height - 2), new Point(m_rectWorking.Right, this.Height - 2));
    228 
    229             //中心
    230             g.FillEllipse(new SolidBrush(blowerColor), m_rectWorking);
    231             g.FillEllipse(new SolidBrush(Color.FromArgb(20, Color.White)), m_rectWorking);
    232 
    233 
    234             //扇叶
    235             Rectangle _rect = new Rectangle(m_rectWorking.Left + (m_rectWorking.Width - (m_rectWorking.Width / 3 * 2)) / 2, m_rectWorking.Top + (m_rectWorking.Height - (m_rectWorking.Width / 3 * 2)) / 2, (m_rectWorking.Width / 3 * 2), (m_rectWorking.Width / 3 * 2));
    236 
    237             int _splitCount = 8;
    238             float fltSplitValue = 360F / (float)_splitCount;
    239             for (int i = 0; i <= _splitCount; i++)
    240             {
    241                 float fltAngle = (fltSplitValue * i - 180) % 360;
    242                 float fltY1 = (float)(_rect.Top + _rect.Width / 2 - ((_rect.Width / 2) * Math.Sin(Math.PI * (fltAngle / 180.00F))));
    243                 float fltX1 = (float)(_rect.Left + (_rect.Width / 2 - ((_rect.Width / 2) * Math.Cos(Math.PI * (fltAngle / 180.00F)))));
    244                 float fltY2 = 0;
    245                 float fltX2 = 0;
    246 
    247                 fltY2 = (float)(_rect.Top + _rect.Width / 2 - ((_rect.Width / 4) * Math.Sin(Math.PI * (fltAngle / 180.00F))));
    248                 fltX2 = (float)(_rect.Left + (_rect.Width / 2 - ((_rect.Width / 4) * Math.Cos(Math.PI * (fltAngle / 180.00F)))));
    249 
    250                 g.DrawLine(new Pen(new SolidBrush(fanColor), 2), new PointF(fltX1, fltY1), new PointF(fltX2, fltY2));
    251             }
    252 
    253             g.FillEllipse(new SolidBrush(fanColor), new Rectangle(_rect.Left + _rect.Width / 2 - _rect.Width / 4 + 2, _rect.Top + _rect.Width / 2 - _rect.Width / 4 + 2, _rect.Width / 2 - 4, _rect.Width / 2 - 4));
    254             g.FillEllipse(new SolidBrush(Color.FromArgb(50, Color.White)), new Rectangle(_rect.Left - 5, _rect.Top - 5, _rect.Width + 10, _rect.Height + 10));
    255         }
    256     }
    257     /// <summary>
    258     /// Enum BlowerEntranceDirection
    259     /// </summary>
    260     public enum BlowerEntranceDirection
    261     {
    262         /// <summary>
    263         /// The none
    264         /// </summary>
    265         None,
    266         /// <summary>
    267         /// The left
    268         /// </summary>
    269         Left,
    270         /// <summary>
    271         /// The right
    272         /// </summary>
    273         Right,
    274         /// <summary>
    275         /// Up
    276         /// </summary>
    277         Up
    278     }
    279 
    280     /// <summary>
    281     /// Enum BlowerExitDirection
    282     /// </summary>
    283     public enum BlowerExitDirection
    284     {
    285         /// <summary>
    286         /// The left
    287         /// </summary>
    288         Left,
    289         /// <summary>
    290         /// The right
    291         /// </summary>
    292         Right,
    293         /// <summary>
    294         /// Up
    295         /// </summary>
    296         Up
    297     }
    298 }
    View Code

    添加一个类UCBlower ,继承UserControl

    最后的话

    如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧

  • 相关阅读:
    生成器
    ELK出现unassigned_shards解决办法
    ElK集群 采集 redis 数据
    postgresql-12编译安装
    openshift 3.11安装部署
    Linux TCP漏洞 CVE-2019-11477 CentOS7 修复方法
    zabbix-server安装部署配置
    zabbix-proxy安装部署
    harbor镜像仓库-02-https访问配置
    harbor镜像仓库-01-搭建部署
  • 原文地址:https://www.cnblogs.com/bfyx/p/11491253.html
Copyright © 2011-2022 走看看