
以下代碼實作自定義Button,繼承WinForm的Button,新增了邊框、圓角設定的相關屬性,
public class ZhmButton : Button
{
private int borderSize = 0; // 邊框
private Color borderColor = ColorTranslator.FromHtml("#5A6268"); // 邊框色
private int borderRadius = 25; //圓角角度
public ZhmButton()
{
// 去除系統默認樣式,并設定自定義樣式
this.FlatStyle = FlatStyle.Flat;
this.FlatAppearance.BorderSize = 0;
this.Size = new Size(150, 46);
this.BackColor = ColorTranslator.FromHtml("#23272B");
this.ForeColor = Color.White;
this.Resize += ZhmButton_Resize;
}
[Category("擴展屬性")]
public int BorderSize { get => borderSize; set { borderSize = value; this.Invalidate(); } }
[Category("擴展屬性")]
public Color BorderColor { get => borderColor; set { borderColor = value; this.Invalidate(); } }
[Category("擴展屬性")]
public int BorderRadius
{
get => borderRadius; set
{
borderRadius = value <= Height ? value : Height;
this.Invalidate();
}
}
private GraphicsPath DrawGraphicsPath(RectangleF rectangle, float radius)
{
GraphicsPath path = new GraphicsPath();
path.StartFigure();
// 從左上角開始按順時針方向 分別在空間的四個角追加一段圓弧
// 270°
// |
//180°----|-----0°
// |
// 90°
path.AddArc(rectangle.X, rectangle.Y, radius, radius, 180, 90);
path.AddArc(rectangle.Width - radius, rectangle.Y, radius, radius, 270, 90);
path.AddArc(rectangle.Width - radius, rectangle.Height - radius, radius, radius, 0, 90);
path.AddArc(rectangle.X, rectangle.Height - radius, radius, radius, 90, 90);
path.CloseFigure();
return path;
}
private void ZhmButton_Resize(object sender, EventArgs e)
{
if (borderRadius > this.Height)
borderRadius = this.Height;
}
protected override void OnPaint(PaintEventArgs pevent)
{
base.OnPaint(pevent);
pevent.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
RectangleF rectSurface = new RectangleF(0, 0, this.Width, this.Height);
RectangleF rectBorder = new RectangleF(1, 1, this.Width - 0.8F, this.Height - 1);
if (BorderRadius > 2)
{
using (var pathSurface = DrawGraphicsPath(rectSurface, BorderRadius))
using (var pathBorder = DrawGraphicsPath(rectBorder, BorderRadius - 1))
using (var penSurface = new Pen(this.Parent.BackColor, 2))
using (var penBorder = new Pen(BorderColor, BorderSize))
{
penBorder.Alignment = PenAlignment.Inset;
this.Region = new Region(pathSurface);
pevent.Graphics.DrawPath(penSurface, pathSurface);
if (BorderSize > 0)
pevent.Graphics.DrawPath(penBorder, pathBorder);
}
}
else
{
this.Region = new Region(rectSurface);
if (BorderSize > 0)
{
using (var penBorder = new Pen(BorderColor, BorderSize))
{
penBorder.Alignment = PenAlignment.Inset;
pevent.Graphics.DrawRectangle(penBorder, 0, 0, this.Width - 1, this.Height - 1);
}
}
}
}
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
this.Parent.BackColorChanged += Parent_BackColorChanged;
}
private void Parent_BackColorChanged(object sender, EventArgs e)
{
if(this.DesignMode)
this.Invalidate();
}
}
--------------------------------------------------------以下僅為湊字數---------------------------------------------------------------------------------
使用 .NET Framework 可以開發和實作新的控制元件, 可以通過繼承來擴展熟悉的用戶控制元件和現有控制元件的功能, 還可以撰寫自定義控制元件,這些控制元件執行自己的繪制,
基控制元件類
Control 類是 Windows 表單控制元件的基類, 它提供了在 Windows 表單應用程式中進行可視顯示所需的基礎結構,
Control 類執行下列任務,以便在 Windows 表單應用程式中提供可視顯示:
公開視窗句柄,
管理訊息路由,
提供滑鼠和鍵盤事件,以及許多其他用戶界面事件,
提供高級布局功能,
包含特定于可視化顯示的多個屬性,如 ForeColor、BackColor、Height 和 Width,
為 Windows 表單控制元件充當 Microsoft? ActiveX? 控制元件提供必需的安全性和執行緒支持,
由于基類提供了大量基礎結構,因此使開發自己的 Windows 表單控制元件變得相對簡單,
控制元件種類
Windows 表單支持三種用戶定義的控制元件:復合、擴展和自定義, 以下各節分別介紹各種控制元件,并就如何選擇專案中使用的控制元件種類提供建議,
復合控制元件
復合控制元件是封裝在公共容器內的 Windows 表單控制元件的集合, 這種控制元件有時稱為用戶控制元件, 其包含的控制元件稱為構成控制元件,
復合控制元件包含與每個包含的 Windows 表單控制元件相關聯的所有固有功能,允許選擇性地公開和系結它們的屬性, 復合控制元件還提供了大量的默認鍵盤處理功能,用戶不需要進行任何額外的開發,
例如,可以生成復合控制元件,以顯示來自資料庫的客戶地址資料, 此控制元件可包括用于顯示資料庫欄位的 DataGridView 控制元件、用于處理到資料源的系結的 BindingSource,以及用于在記錄之間移動的 BindingNavigator 控制元件, 可以選擇性地公開資料系結屬性,還可以將整個控制元件打包并在不同應用程式之間重復使用, 有關這種復合控制元件的示例,請參閱如何:應用 Windows 表單控制元件中的特性,
若要創作復合控制元件,請從 UserControl 類派生, 基類 UserControl 為子控制元件提供了鍵盤路由,并使子控制元件可以作為組進行作業, 有關詳細資訊,請參閱開發復合 Windows 表單控制元件,
建議
如果為以下情況,則從 UserControl 類繼承:
你想要將多個 Windows 表單控制元件的功能組合到單個可重用單元,
擴展控制元件
你可以從任何現有的 Windows 表單控制元件派生繼承的控制元件, 使用此方法,你可以保留 Windows 表單控制元件的所有固有功能,然后通過添加自定義屬性、方法或其他功能來擴展該功能, 可以使用此選項重寫基控制元件的繪制邏輯,然后通過更改該控制元件的外觀來擴展其用戶界面,
例如,可以創建一個由 Button 控制元件派生的控制元件,并用它來跟蹤用戶的單擊次數,
在某些控制元件中,也可以通過重寫基類的 OnPaint 方法為控制元件的圖形用戶界面添加自定義外觀, 對于跟蹤單擊次數的擴展按鈕,可以重寫 OnPaint 方法以呼叫 OnPaint 的基實作,然后在 Button 控制元件的作業區的一角繪制單擊計數,
建議
如果為以下情況,則從 Windows 表單控制元件繼承:
大部分所需功能與現有的 Windows 表單控制元件相同,
不需要自定義圖形用戶界面,或者想為現有控制元件設計一個新的圖形用戶界面,
自定義控制元件
創建控制元件的另一種方法是通過從 Control 繼承,從頭開始充分創建一個控制元件, Control 類提供控制元件所需的所有基本功能(包括滑鼠和鍵盤處理事件),但不提供特定于控制元件的功能或圖形界面,
相比從 UserControl 或現有 Windows 表單控制元件繼承來說,通過從 Control 類繼承來創建控制元件需要花費更多心思和精力, 由于用戶還需執行大量的實作,因此,控制元件可以具有比復合控制元件或擴展控制元件更好的靈活性,而且可以使控制元件完全滿足自己的需要,
若要實作自定義控制元件,必須撰寫該控制元件的 OnPaint 事件的代碼,以及所需的任何功能特定的代碼, 還可以重寫 WndProc 方法并直接處理視窗訊息, 這是創建控制元件的最強大的方法,但若要有效地使用此技術,需熟悉 Microsoft Win32? API,
時鐘控制元件即是一個自定義控制元件,它復制模擬時鐘的外觀和行為, 呼叫自定義繪制來使指標移動,以回應來自內部 Timer 組件的 Tick 事件, 有關詳細資訊,請參閱如何:開發簡單的 Windows 表單控制元件,
建議
如果為以下情況,則從 Control 類繼承:
你想要提供控制元件的自定義圖形表示形式,
你需要實作不能通過標準控制元件實作的自定義功能,
ActiveX 控制元件
盡管 Windows 表單基礎結構已為承載 Windows 表單控制元件進行了優化,但仍可以使用 ActiveX 控制元件, Visual Studio 中對此任務提供支持, 有關詳細資訊,請參閱如何:向 Windows 表單添加 ActiveX 控制元件,
無視窗控制元件
Microsoft Visual Basic? 6.0 和 ActiveX 技術支持無視窗控制元件, Windows 表單中不支持無視窗控制元件,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/487813.html
標籤:.NET技术
