(四十二)c#Winform自定義控制項-進度條擴展

来源:https://www.cnblogs.com/bfyx/archive/2019/08/22/11392351.html

前提 入行已經7,8年了,一直想做一套漂亮點的自定義控制項,於是就有了本系列文章。 GitHub:https://github.com/kwwwvagaa/NetWinformControl 碼雲:https://gitee.com/kwwwvagaa/net_winform_custom_contr ...


前提

入行已經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

用處及效果

準備工作

這個是基於(四十一)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 點個星星吧


您的分享是我們最大的動力!

更多相關文章
  • 1. RSA加密與解密 -- 使用公鑰加密、私鑰解密 測試: RSATool myRSA = new RSATool(); Dictionary<string, string> dictK = new Dictionary<string, string>(); dictK = myRSA.GetKe ...
  • (雙擊全屏播放) 1、安裝vsftpd yum install -y vsftpd 2、編輯ftp配置文件 vi /etc/vsftpd/vsftpd.conf anonymous_enable=NO #關閉匿名登錄 chroot_local_user=YES #用於指定用戶列表文件中的用戶是否允許 ...
  • 老師在講C#實戰項目時所使用的SqlHelper,使用的資料庫時SQL Server ...
  • 0x00.問題 netcoreapp2.2環境下, Startup.cs 代碼配置如下 運行輸出警告:“ConsoleLoggerExtensions.AddConsole(ILoggerFactory)”已過時:“This method is obsolete and will be remove ...
  • shanzm 2019年8月23日 19:59:46 [TOC] 1. 可空類型修飾符(T?) 強類型語言中引用類型可以為空,如: 而你若是定義一個值類型為空,則是會報錯的。 然而,在處理資料庫和其他包含可能未賦值的元素的數據類型時,我們希望可以將 null 賦值給數值類型或布爾型的功能特別有用。例 ...
一周排行
  • 首先給大家介紹一下序列化是用來乾什麼的,他為什麼出現 序列化這種技術說到底其實就是把臨時數據保存在電腦上。大家都知道對於程式而言對象是一種稍縱即逝的數據,不僅僅是程式重啟、電腦重啟,就連內部函數的變化也有可能導致對象的消失,但是總有一些對象是大家不想讓其隨意消失的並且想在下一次開啟程式的時候進行載入 ...
  • 一、前言 在.Net Framework框架有專門獲取webconfig配置的方法供我們使用,但是在.Net Core或者.Net Standard中沒有可以直接使用的方法來獲取配置文件信息,下麵就來實現獲取配置信息。 二、獲取配置信息的實現 在.Net Core中,他的配置信息的載體是一個json ...
  • 你一定看過這篇文章 《進擊的 Java ,雲原生時代的蛻變》, 本篇文章的靈感來自於這篇文章。北京時間9.24 就將正式發佈.NET Core 3.0, 所以寫下這篇文章讓大家全面認識.NET Core。.NET 生態系統是一個不斷變化的生態圈,我相信它正在朝著一個偉大的方向發展。正好 最近 Inf... ...
  • 參考文檔:Dapper one to many Table C Code pulic List GetPersons(){ var sql = @"SELECT 1 AS Id, 'Daniel Dennett' AS Name, 1942 AS Born, 1 AS CountryId, 'Uni ...
  • 非標設備多相機流水線模式緩存圖片(C/S客戶端,c 開發語言) ​ 本文所說流水線方式下存儲圖像是在軟體測量周期慢於圖片周期前提下講解的,如果軟體一直在等待圖片數據,邏輯就沒有那麼複雜。 1、非標設備項目,常規模式測量流程 常規模式下,相機採集圖像信號由上位機控制(無論軟觸發、硬觸發)。每個周期內的 ...
  • 簡單創建.NET Core WebApi:https://www.cnblogs.com/yanbigfeg/p/9197375.html 登陸驗證四種方式:https://www.cnblogs.com/zuowj/p/5123943.html 解決跨域的8種方法:https://blog.csd ...
  • 最近有個需求就是網頁表格裡面的數據導出到excel 於是從各位前輩的博客園搜了搜demo 大部分非為兩類 都是用的插件NPOI和Eppluse ,因此在這裡就介紹Eppluse 用法,還有就是在博客的時候 好多有留言說想看從資料庫裡面的數據進行導入 而不是寫死的,所以我就以我的案例給大家分享下用法( ...
  • 表達式樹練習實踐:C 值類型、引用類型、泛型、集合、調用函數 [TOC] 一,定義變數 C 表達式樹中,定義一個變數,使用 。 創建變數結點的方法有兩種, 兩種方式都是生成 類型 和 都具有兩個重載。他們創建一個 ParameterExpression節點,該節點可用於標識表達式樹中的參數或變數。 ...
  • 就像是.NET Framework WebApi與.NET Core WebApi一樣,.NET Framework MVC與.NET Core MVC的區別,也是框架的之間的區別。本系列先首先從.NET Framework MVC介紹,後面再去介紹.NET Core MVC 狹義MVC: MVC是 ...
  • 緩存的實現 我們不是做第三方比如Redis等的緩存實現,而是根據實際情況,基於C#上做一些環境變數的保存,方便項目使用。 1、系統全局變數 很多時候,在系統運行開始,需要對系統的運行參數進行保存,以便供全局使用。 代碼如下: 這裡使用一個靜態變數的Dictionary來進行保存,所有項目均可以直接獲 ...
x