(四十二)c#Winform自定义控件-进度条扩展

南楼画角 提交于 2019-11-28 04:52:51

前提

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

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

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

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

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

NuGet

Install-Package HZH_Controls

目录

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

用处及效果

准备工作

这个是基于(四十一)c#Winform自定义控件-进度条 扩展的,如果你还没有了解,请先移步了解一下

开始

添加一个用户控件,命名UCProcessLineExt

属性

 1   [Description("值变更事件"), Category("自定义")]   2         public event EventHandler ValueChanged;   3    4         [Description("当前属性"), Category("自定义")]   5         public int Value   6         {   7             set   8             {   9                 ucProcessLine1.Value = value;  10                 Refresh();  11             }  12             get  13             {  14                 return ucProcessLine1.Value;  15             }  16         }  17   18   19   20         [Description("最大值"), Category("自定义")]  21         public int MaxValue  22         {  23             get { return ucProcessLine1.MaxValue; }  24             set  25             {  26                 ucProcessLine1.MaxValue = value;  27                 Refresh();  28             }  29         }  30   31   32         [Description("值进度条颜色"), Category("自定义")]  33         public Color ValueColor  34         {  35             get { return ucProcessLine1.ValueColor; }  36             set  37             {  38                 ucProcessLine1.ValueColor = value;  39                 Refresh();  40             }  41         }  42   43   44         [Description("值背景色"), Category("自定义")]  45         public Color ValueBGColor  46         {  47             get { return ucProcessLine1.ValueBGColor; }  48             set  49             {  50                 ucProcessLine1.ValueBGColor = value;  51                 Refresh();  52             }  53         }  54   55   56         [Description("边框颜色"), Category("自定义")]  57         public Color BorderColor  58         {  59             get { return ucProcessLine1.BorderColor; }  60             set  61             {  62                 ucProcessLine1.BorderColor = value;  63                 Refresh();  64             }  65         }  66   67         [Description("值字体"), Category("自定义")]  68         public override Font Font  69         {  70             get  71             {  72                 return ucProcessLine1.Font;  73             }  74             set  75             {  76                 ucProcessLine1.Font = value;  77                 Refresh();  78             }  79         }  80   81         [Description("值块颜色"), Category("自定义")]  82         public override System.Drawing.Color ForeColor  83         {  84             get  85             {  86                 return base.ForeColor;  87             }  88             set  89             {  90                 base.ForeColor = value;  91                 Refresh();  92             }  93         }

重绘

 1  protected override void OnPaint(PaintEventArgs e)   2         {   3             base.OnPaint(e);   4             e.Graphics.SetGDIHigh();   5             float fltIndex = (float)this.ucProcessLine1.Value / (float)this.ucProcessLine1.MaxValue;   6    7             int x = (int)(fltIndex * this.ucProcessLine1.Width + this.ucProcessLine1.Location.X - 15) - 2;   8             GraphicsPath path = new GraphicsPath();   9             Rectangle rect = new Rectangle(x, 1, 30, 20);  10             int cornerRadius = 2;  11             path.AddArc(rect.X, rect.Y, cornerRadius * 2, cornerRadius * 2, 180, 90);  12             path.AddLine(rect.X + cornerRadius, rect.Y, rect.Right - cornerRadius * 2, rect.Y);  13             path.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y, cornerRadius * 2, cornerRadius * 2, 270, 90);  14             path.AddLine(rect.Right, rect.Y + cornerRadius * 2, rect.Right, rect.Y + rect.Height - cornerRadius * 2);  15             path.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y + rect.Height - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 0, 90);  16             path.AddLine(rect.Right - cornerRadius * 2, rect.Bottom, rect.Right - cornerRadius * 2 - 5, rect.Bottom);//下  17             path.AddLine(rect.Right - cornerRadius * 2 - 5, 21, x + 15, ucProcessLine1.Location.Y);  18             path.AddLine(x + 15, ucProcessLine1.Location.Y, rect.X + cornerRadius * 2 + 5, 21);  19             path.AddLine(rect.X + cornerRadius * 2 + 5, 20, rect.X + cornerRadius * 2, rect.Bottom);//下  20             path.AddArc(rect.X, rect.Bottom - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 90, 90);  21             path.AddLine(rect.X, rect.Bottom - cornerRadius * 2, rect.X, rect.Y + cornerRadius * 2);//上  22             path.CloseFigure();  23   24             e.Graphics.FillPath(new SolidBrush(ForeColor), path);  25   26             string strValue = ((float)Value / (float)MaxValue).ToString("0%");  27             System.Drawing.SizeF sizeF = e.Graphics.MeasureString(strValue, Font);  28             e.Graphics.DrawString(strValue, Font, new SolidBrush(Color.White), new PointF(x + (30 - sizeF.Width) / 2+1, (20 - sizeF.Height) / 2 + 1));  29         }

全部代码

  1 using System;    2 using System.Collections.Generic;    3 using System.ComponentModel;    4 using System.Drawing;    5 using System.Data;    6 using System.Linq;    7 using System.Text;    8 using System.Windows.Forms;    9 using System.Drawing.Drawing2D;   10    11 namespace HZH_Controls.Controls   12 {   13     public partial class UCProcessLineExt : UserControl   14     {   15         [Description("值变更事件"), Category("自定义")]   16         public event EventHandler ValueChanged;   17    18         [Description("当前属性"), Category("自定义")]   19         public int Value   20         {   21             set   22             {   23                 ucProcessLine1.Value = value;   24                 Refresh();   25             }   26             get   27             {   28                 return ucProcessLine1.Value;   29             }   30         }   31    32    33    34         [Description("最大值"), Category("自定义")]   35         public int MaxValue   36         {   37             get { return ucProcessLine1.MaxValue; }   38             set   39             {   40                 ucProcessLine1.MaxValue = value;   41                 Refresh();   42             }   43         }   44    45    46         [Description("值进度条颜色"), Category("自定义")]   47         public Color ValueColor   48         {   49             get { return ucProcessLine1.ValueColor; }   50             set   51             {   52                 ucProcessLine1.ValueColor = value;   53                 Refresh();   54             }   55         }   56    57    58         [Description("值背景色"), Category("自定义")]   59         public Color ValueBGColor   60         {   61             get { return ucProcessLine1.ValueBGColor; }   62             set   63             {   64                 ucProcessLine1.ValueBGColor = value;   65                 Refresh();   66             }   67         }   68    69    70         [Description("边框颜色"), Category("自定义")]   71         public Color BorderColor   72         {   73             get { return ucProcessLine1.BorderColor; }   74             set   75             {   76                 ucProcessLine1.BorderColor = value;   77                 Refresh();   78             }   79         }   80    81         [Description("值字体"), Category("自定义")]   82         public override Font Font   83         {   84             get   85             {   86                 return ucProcessLine1.Font;   87             }   88             set   89             {   90                 ucProcessLine1.Font = value;   91                 Refresh();   92             }   93         }   94    95         [Description("值块颜色"), Category("自定义")]   96         public override System.Drawing.Color ForeColor   97         {   98             get   99             {  100                 return base.ForeColor;  101             }  102             set  103             {  104                 base.ForeColor = value;  105                 Refresh();  106             }  107         }  108   109         public UCProcessLineExt()  110         {  111             InitializeComponent();  112             this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);  113             this.SetStyle(ControlStyles.DoubleBuffer, true);  114             this.SetStyle(ControlStyles.ResizeRedraw, true);  115             this.SetStyle(ControlStyles.Selectable, true);  116             this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);  117             this.SetStyle(ControlStyles.UserPaint, true);  118             ucProcessLine1.ValueChanged += ucProcessLine1_ValueChanged;  119         }  120   121         void ucProcessLine1_ValueChanged(object sender, EventArgs e)  122         {  123             if (ValueChanged != null)  124             {  125                 ValueChanged(this, e);  126             }  127         }  128   129         protected override void OnPaint(PaintEventArgs e)  130         {  131             base.OnPaint(e);  132             e.Graphics.SetGDIHigh();  133             float fltIndex = (float)this.ucProcessLine1.Value / (float)this.ucProcessLine1.MaxValue;  134   135             int x = (int)(fltIndex * this.ucProcessLine1.Width + this.ucProcessLine1.Location.X - 15) - 2;  136             GraphicsPath path = new GraphicsPath();  137             Rectangle rect = new Rectangle(x, 1, 30, 20);  138             int cornerRadius = 2;  139             path.AddArc(rect.X, rect.Y, cornerRadius * 2, cornerRadius * 2, 180, 90);  140             path.AddLine(rect.X + cornerRadius, rect.Y, rect.Right - cornerRadius * 2, rect.Y);  141             path.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y, cornerRadius * 2, cornerRadius * 2, 270, 90);  142             path.AddLine(rect.Right, rect.Y + cornerRadius * 2, rect.Right, rect.Y + rect.Height - cornerRadius * 2);  143             path.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y + rect.Height - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 0, 90);  144             path.AddLine(rect.Right - cornerRadius * 2, rect.Bottom, rect.Right - cornerRadius * 2 - 5, rect.Bottom);//下  145             path.AddLine(rect.Right - cornerRadius * 2 - 5, 21, x + 15, ucProcessLine1.Location.Y);  146             path.AddLine(x + 15, ucProcessLine1.Location.Y, rect.X + cornerRadius * 2 + 5, 21);  147             path.AddLine(rect.X + cornerRadius * 2 + 5, 20, rect.X + cornerRadius * 2, rect.Bottom);//下  148             path.AddArc(rect.X, rect.Bottom - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 90, 90);  149             path.AddLine(rect.X, rect.Bottom - cornerRadius * 2, rect.X, rect.Y + cornerRadius * 2);//上  150             path.CloseFigure();  151   152             e.Graphics.FillPath(new SolidBrush(ForeColor), path);  153   154             string strValue = ((float)Value / (float)MaxValue).ToString("0%");  155             System.Drawing.SizeF sizeF = e.Graphics.MeasureString(strValue, Font);  156             e.Graphics.DrawString(strValue, Font, new SolidBrush(Color.White), new PointF(x + (30 - sizeF.Width) / 2+1, (20 - sizeF.Height) / 2 + 1));  157         }  158     }  159 }
View Code
 1 namespace HZH_Controls.Controls   2 {   3     partial class UCProcessLineExt   4     {   5         /// <summary>    6         /// 必需的设计器变量。   7         /// </summary>   8         private System.ComponentModel.IContainer components = null;   9   10         /// <summary>   11         /// 清理所有正在使用的资源。  12         /// </summary>  13         /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>  14         protected override void Dispose(bool disposing)  15         {  16             if (disposing && (components != null))  17             {  18                 components.Dispose();  19             }  20             base.Dispose(disposing);  21         }  22   23         #region 组件设计器生成的代码  24   25         /// <summary>   26         /// 设计器支持所需的方法 - 不要  27         /// 使用代码编辑器修改此方法的内容。  28         /// </summary>  29         private void InitializeComponent()  30         {  31             this.ucProcessLine1 = new HZH_Controls.Controls.UCProcessLine();  32             this.SuspendLayout();  33             //   34             // ucProcessLine1  35             //   36             this.ucProcessLine1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)   37             | System.Windows.Forms.AnchorStyles.Left)   38             | System.Windows.Forms.AnchorStyles.Right)));  39             this.ucProcessLine1.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(192)))), ((int)(((byte)(192)))));  40             this.ucProcessLine1.Font = new System.Drawing.Font("Arial Unicode MS", 10F);  41             this.ucProcessLine1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(77)))), ((int)(((byte)(59)))));  42             this.ucProcessLine1.Location = new System.Drawing.Point(18, 33);  43             this.ucProcessLine1.MaxValue = 100;  44             this.ucProcessLine1.Name = "ucProcessLine1";  45             this.ucProcessLine1.Size = new System.Drawing.Size(399, 16);  46             this.ucProcessLine1.TabIndex = 0;  47             this.ucProcessLine1.Text = "ucProcessLine1";  48             this.ucProcessLine1.Value = 0;  49             this.ucProcessLine1.ValueBGColor = System.Drawing.Color.White;  50             this.ucProcessLine1.ValueColor = System.Drawing.Color.FromArgb(((int)(((byte)(73)))), ((int)(((byte)(119)))), ((int)(((byte)(232)))));  51             this.ucProcessLine1.ValueTextType = HZH_Controls.Controls.ValueTextType.None;  52             //   53             // UCProcessLineExt  54             //   55             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;  56             this.BackColor = System.Drawing.Color.Transparent;  57             this.Controls.Add(this.ucProcessLine1);  58             this.Name = "UCProcessLineExt";  59             this.Size = new System.Drawing.Size(434, 50);  60             this.ResumeLayout(false);  61   62         }  63   64         #endregion  65   66         private UCProcessLine ucProcessLine1;  67     }  68 }
View Code

最后的话

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!