(三十八)c#Winform自定義控制項-圓形進度條

来源:https://www.cnblogs.com/bfyx/archive/2019/08/17/11369691.html
-Advertisement-
Play Games

前提 入行已經7,8年了,一直想做一套漂亮點的自定義控制項,於是就有了本系列文章。 開源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control 如果覺得寫的還行,請點個 star 支持一下吧 歡迎前來交流探討: 企鵝群568015492 目錄 ...


前提

入行已經7,8年了,一直想做一套漂亮點的自定義控制項,於是就有了本系列文章。

開源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control

如果覺得寫的還行,請點個 star 支持一下吧

歡迎前來交流探討: 企鵝群568015492 企鵝群568015492

目錄

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

準備工作

我們理一下思路,進度條支持圓環或扇形顯示,支持百分比和數值顯示

開始

添加一個用戶控制項,命名UCProcessEllipse

定義2個枚舉

 1  public enum ValueType
 2     {
 3         /// <summary>
 4         /// 百分比
 5         /// </summary>
 6         Percent,
 7         /// <summary>
 8         /// 數值
 9         /// </summary>
10         Absolute
11     }
12 
13     public enum ShowType
14     {
15         /// <summary>
16         /// 圓環
17         /// </summary>
18         Ring,
19         /// <summary>
20         /// 扇形
21         /// </summary>
22         Sector
23     }

 

添加屬性

  1  [Description("值改變事件"), Category("自定義")]
  2         public event EventHandler ValueChanged;
  3 
  4         private Color m_backEllipseColor = Color.FromArgb(22, 160, 133);
  5         /// <summary>
  6         /// 圓背景色
  7         /// </summary>
  8         [Description("圓背景色"), Category("自定義")]
  9         public Color BackEllipseColor
 10         {
 11             get { return m_backEllipseColor; }
 12             set
 13             {
 14                 m_backEllipseColor = value;
 15                 Refresh();
 16             }
 17         }
 18 
 19         private Color m_coreEllipseColor = Color.FromArgb(180, 180, 180);
 20         /// <summary>
 21         /// 內圓顏色,ShowType=Ring 有效
 22         /// </summary>
 23         [Description("內圓顏色,ShowType=Ring 有效"), Category("自定義")]
 24         public Color CoreEllipseColor
 25         {
 26             get { return m_coreEllipseColor; }
 27             set
 28             {
 29                 m_coreEllipseColor = value;
 30                 Refresh();
 31             }
 32         }
 33 
 34         private Color m_valueColor = Color.FromArgb(255, 77, 59);
 35 
 36         [Description("值圓顏色"), Category("自定義")]
 37         public Color ValueColor
 38         {
 39             get { return m_valueColor; }
 40             set
 41             {
 42                 m_valueColor = value;
 43                 Refresh();
 44             }
 45         }
 46 
 47         private bool m_isShowCoreEllipseBorder = true;
 48         /// <summary>
 49         /// 內圓是否顯示邊框,ShowType=Ring 有效
 50         /// </summary>
 51         [Description("內圓是否顯示邊框,ShowType=Ring 有效"), Category("自定義")]
 52         public bool IsShowCoreEllipseBorder
 53         {
 54             get { return m_isShowCoreEllipseBorder; }
 55             set
 56             {
 57                 m_isShowCoreEllipseBorder = value;
 58                 Refresh();
 59             }
 60         }
 61 
 62         private ValueType m_valueType = ValueType.Percent;
 63         /// <summary>
 64         /// 值文字類型
 65         /// </summary>
 66         [Description("值文字類型"), Category("自定義")]
 67         public ValueType ValueType
 68         {
 69             get { return m_valueType; }
 70             set
 71             {
 72                 m_valueType = value;
 73                 Refresh();
 74             }
 75         }
 76 
 77         private int m_valueWidth = 30;
 78         /// <summary>
 79         /// 外圓值寬度
 80         /// </summary>
 81         [Description("外圓值寬度,ShowType=Ring 有效"), Category("自定義")]
 82         public int ValueWidth
 83         {
 84             get { return m_valueWidth; }
 85             set
 86             {
 87                 if (value <= 0 || value > Math.Min(this.Width, this.Height))
 88                     return;
 89                 m_valueWidth = value;
 90                 Refresh();
 91             }
 92         }
 93 
 94         private int m_valueMargin = 5;
 95         /// <summary>
 96         /// 外圓值間距
 97         /// </summary>
 98         [Description("外圓值間距"), Category("自定義")]
 99         public int ValueMargin
100         {
101             get { return m_valueMargin; }
102             set
103             {
104                 if (value < 0 || m_valueMargin >= m_valueWidth)
105                     return;
106                 m_valueMargin = value;
107                 Refresh();
108             }
109         }
110 
111         private int m_maxValue = 100;
112         /// <summary>
113         /// 最大值
114         /// </summary>
115         [Description("最大值"), Category("自定義")]
116         public int MaxValue
117         {
118             get { return m_maxValue; }
119             set
120             {
121                 if (value > m_value || value <= 0)
122                     return;
123                 m_maxValue = value;
124                 Refresh();
125             }
126         }
127 
128         private int m_value = 0;
129         /// <summary>
130         /// 當前值
131         /// </summary>
132         [Description("當前值"), Category("自定義")]
133         public int Value
134         {
135             get { return m_value; }
136             set
137             {
138                 if (m_maxValue < value || value <= 0)
139                     return;
140                 m_value = value;
141                 if (ValueChanged != null)
142                 {
143                     ValueChanged(this, null);
144                 }
145                 Refresh();
146             }
147         }
148         private Font m_font = new Font("Arial Unicode MS", 20);
149         [Description("文字字體"), Category("自定義")]
150         public override Font Font
151         {
152             get
153             {
154                 return m_font;
155             }
156             set
157             {
158                 m_font = value;
159                 Refresh();
160             }
161         }
162         Color m_foreColor = Color.White;
163         [Description("文字顏色"), Category("自定義")]
164         public override Color ForeColor
165         {
166             get
167             {
168                 return m_foreColor;
169             }
170             set
171             {
172                 m_foreColor = value;
173                 Refresh();
174             }
175         }
176 
177         private ShowType m_showType = ShowType.Ring;
178 
179         [Description("顯示類型"), Category("自定義")]
180         public ShowType ShowType
181         {
182             get { return m_showType; }
183             set
184             {
185                 m_showType = value;
186                 Refresh();
187             }
188         }

重繪

 1   protected override void OnPaint(PaintEventArgs e)
 2         {
 3             base.OnPaint(e);
 4 
 5             var g = e.Graphics;
 6             g.SmoothingMode = SmoothingMode.AntiAlias;  //使繪圖質量最高,即消除鋸齒
 7             g.InterpolationMode = InterpolationMode.HighQualityBicubic;
 8             g.CompositingQuality = CompositingQuality.HighQuality;
 9 
10             int intWidth = Math.Min(this.Size.Width, this.Size.Height);
11             //底圓
12             g.FillEllipse(new SolidBrush(m_backEllipseColor), new Rectangle(new Point(0, 0), new Size(intWidth, intWidth)));
13             if (m_showType == HZH_Controls.Controls.ShowType.Ring)
14             {
15                 //中心圓
16                 int intCore = intWidth - m_valueWidth * 2;
17                 g.FillEllipse(new SolidBrush(m_coreEllipseColor), new Rectangle(new Point(m_valueWidth, m_valueWidth), new Size(intCore, intCore)));
18                 //中心圓邊框
19                 if (m_isShowCoreEllipseBorder)
20                 {
21                     g.DrawEllipse(new Pen(m_valueColor, 2), new Rectangle(new Point(m_valueWidth + 1, m_valueWidth + 1), new Size(intCore - 1, intCore - 1)));
22                 }
23                 if (m_value > 0 && m_maxValue > 0)
24                 {
25                     float fltPercent = (float)m_value / (float)m_maxValue;
26                     if (fltPercent > 1)
27                     {
28                         fltPercent = 1;
29                     }
30 
31                     g.DrawArc(new Pen(m_valueColor, m_valueWidth - m_valueMargin * 2), new RectangleF(new Point(m_valueWidth / 2 + m_valueMargin / 4, m_valueWidth / 2 + m_valueMargin / 4), new SizeF(intWidth - m_valueWidth - m_valueMargin / 2 + (m_valueMargin == 0 ? 0 : 1), intWidth - m_valueWidth - m_valueMargin / 2 + (m_valueMargin == 0 ? 0 : 1))), -90, fltPercent * 360);
32 
33                     string strValueText = m_valueType == HZH_Controls.Controls.ValueType.Percent ? fltPercent.ToString("0%") : m_value.ToString();
34                     System.Drawing.SizeF _txtSize = g.MeasureString(strValueText, this.Font);
35                     g.DrawString(strValueText, this.Font, new SolidBrush(this.ForeColor), new PointF((intWidth - _txtSize.Width) / 2 + 1, (intWidth - _txtSize.Height) / 2 + 1));
36                 }
37             }
38             else
39             {
40                 if (m_value > 0 && m_maxValue > 0)
41                 {
42                     float fltPercent = (float)m_value / (float)m_maxValue;
43                     if (fltPercent > 1)
44                     {
45                         fltPercent = 1;
46                     }
47 
48                     g.FillPie(new SolidBrush(m_valueColor), new Rectangle(m_valueMargin, m_valueMargin, intWidth - m_valueMargin * 2, intWidth - m_valueMargin * 2), -90, fltPercent * 360);
49 
50                     string strValueText = m_valueType == HZH_Controls.Controls.ValueType.Percent ? fltPercent.ToString("0%") : m_value.ToString();
51                     System.Drawing.SizeF _txtSize = g.MeasureString(strValueText, this.Font);
52                     g.DrawString(strValueText, this.Font, new SolidBrush(this.ForeColor), new PointF((intWidth - _txtSize.Width) / 2 + 1, (intWidth - _txtSize.Height) / 2 + 1));
53                 }
54             }
55 
56         }

完整代碼如下

  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 UCProcessEllipse : UserControl
 14     {
 15         [Description("值改變事件"), Category("自定義")]
 16         public event EventHandler ValueChanged;
 17 
 18         private Color m_backEllipseColor = Color.FromArgb(22, 160, 133);
 19         /// <summary>
 20         /// 圓背景色
 21         /// </summary>
 22         [Description("圓背景色"), Category("自定義")]
 23         public Color BackEllipseColor
 24         {
 25             get { return m_backEllipseColor; }
 26             set
 27             {
 28                 m_backEllipseColor = value;
 29                 Refresh();
 30             }
 31         }
 32 
 33         private Color m_coreEllipseColor = Color.FromArgb(180, 180, 180);
 34         /// <summary>
 35         /// 內圓顏色,ShowType=Ring 有效
 36         /// </summary>
 37         [Description("內圓顏色,ShowType=Ring 有效"), Category("自定義")]
 38         public Color CoreEllipseColor
 39         {
 40             get { return m_coreEllipseColor; }
 41             set
 42             {
 43                 m_coreEllipseColor = value;
 44                 Refresh();
 45             }
 46         }
 47 
 48         private Color m_valueColor = Color.FromArgb(255, 77, 59);
 49 
 50         [Description("值圓顏色"), Category("自定義")]
 51         public Color ValueColor
 52         {
 53             get { return m_valueColor; }
 54             set
 55             {
 56                 m_valueColor = value;
 57                 Refresh();
 58             }
 59         }
 60 
 61         private bool m_isShowCoreEllipseBorder = true;
 62         /// <summary>
 63         /// 內圓是否顯示邊框,ShowType=Ring 有效
 64         /// </summary>
 65         [Description("內圓是否顯示邊框,ShowType=Ring 有效"), Category("自定義")]
 66         public bool IsShowCoreEllipseBorder
 67         {
 68             get { return m_isShowCoreEllipseBorder; }
 69             set
 70             {
 71                 m_isShowCoreEllipseBorder = value;
 72                 Refresh();
 73             }
 74         }
 75 
 76         private ValueType m_valueType = ValueType.Percent;
 77         /// <summary>
 78         /// 值文字類型
 79         /// </summary>
 80         [Description("值文字類型"), Category("自定義")]
 81         public ValueType ValueType
 82         {
 83             get { return m_valueType; }
 84             set
 85             {
 86                 m_valueType = value;
 87                 Refresh();
 88             }
 89         }
 90 
 91         private int m_valueWidth = 30;
 92         /// <summary>
 93         /// 外圓值寬度
 94         /// </summary>
 95         [Description("外圓值寬度,ShowType=Ring 有效"), Category("自定義")]
 96         public int ValueWidth
 97         {
 98             get { return m_valueWidth; }
 99             set
100             {
101                 if (value <= 0 || value > Math.Min(this.Width, this.Height))
102                     return;
103                 m_valueWidth = value;
104                 Refresh();
105             }
106         }
107 
108         private int m_valueMargin = 5;
109         /// <summary>
110         /// 外圓值間距
111         /// </summary>
112         [Description("外圓值間距"), Category("自定義")]
113         public int ValueMargin
114         {
115             get { return m_valueMargin; }
116             set
117             {
118                 if (value < 0 || m_valueMargin >= m_valueWidth)
119                     return;
120                 m_valueMargin = value;
121                 Refresh();
122             }
123         }
124 
125         private int m_maxValue = 100;
126         /// <summary>
127         /// 最大值
128         /// </summary>
129         [Description("最大值"), Category("自定義")]
130         public int MaxValue
131         {
132             get { return m_maxValue; }
133             set
134             {
135                 if (value > m_value || value <= 0)
136                     return;
137                 m_maxValue = value;
138                 Refresh();
139             }
140         }
141 
142         private int m_value = 0;
143         /// <summary>
144         /// 當前值
145         /// </summary>
146         [Description("當前值"), Category("自定義")]
147         public int Value
148         {
149             get { return m_value; }
150             set
151             {
152                 if (m_maxValue < value || value <= 0)
153                     return;
154                 m_value = value;
155                 	   

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

-Advertisement-
Play Games
更多相關文章
  • 一、Config簡介 在微服務系統中,服務較多,相同的配置:如資料庫信息、緩存、參數等,會出現在不同的服務上,如果一個配置發生變化,需要修改很多的服務配置。spring cloud提供配置中心,來解決這個場景問題。 系統中的通用配置存儲在相同的地址:GitHub,Gitee,本地配置服務等,然後配置 ...
  • # os模塊是與操作系統交互的一個介面 import os print(os.getcwd()) # 獲取當前工作目錄,當前python文件的目錄路徑 # os.chdir('02random模塊.py') print(os.curdir)# 返回當前目錄: ('.') print(os.pardi... ...
  • 本文主要以一個簡單的小例子,簡述SpringMVC開發中,Json的相關應用,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 自動掃雷一般分為兩種,一種是讀取記憶體數據,而另一種是通過分析圖片獲得數據,並通過模擬滑鼠操作,這裡我用的是第二種方式。 一、準備工作 1.掃雷游戲 我是win10,沒有預設的掃雷,所以去掃雷網下載 http://www.saolei.net/BBS/ 2.python 3 我的版本是 python ...
  • 由於執行的xss攻擊請求他多了,初步估計要執行83次,而且還要執行3篇,如果手工一個一個去執行,說出去,我還配叫自動化大師嗎; 有鑒於此,邊打算自己編寫一個腳本進行批量執行; 而短腳本的編寫,非shell莫屬,想到做到; 首先附上xss跨站攻擊的請求報文: 看到沒有如果一個一個執行,我的天,這要猴年 ...
  • python中如何調用函數交換兩個變數的值 所有代碼來在python3.7.1版本實現 以下實例通過用戶輸入兩個變數,並相互交換: 方法一: def swap(a,b): # 創建臨時變數,並交換 temp = a a = b b = temp print(a,b) 以上實例中,我們創建了臨時變數 ...
  • 1、類屬性與實例屬性 類屬性就相當與全局變數,實例對象共有的屬性,實例對象的屬性為實例對象自己私有。 類屬性就是類對象(Tool)所擁有的屬性,它被所有類對象的實例對象(實例方法)所共有,在記憶體中只存在一個副本,這個和C++中類的靜態成員變數有點類似。對於公有的類屬性,在類外可以通過類對象和實例對象 ...
  • 本章主要和大家分享下我們的ASP.NET Core Web 應用程式在開發期間是如何部署到我們的IIS自定義主機功能變數名稱並附加到進程進行調試的。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...