以下是學習筆記:
參考:https://www.bilibili.com/video/BV1eQ4y1M7ZY?p=3
自定義控件開發的思路:屬性,事件,Paint(重寫),這三個不一定都要有的
效果:
用途:分類顯示內容的場景
一,自定義控件
1,添加“組件類”
,2,根據自定義控件的功能修改繼承
3,代碼如下:
namespace Jason_Controls { public partial class JasonPanel : Panel { public JasonPanel() { InitializeComponent(); } public JasonPanel(IContainer container) { container.Add(this); InitializeComponent(); } #region 屬性 private Color headBackColor=Color.LimeGreen; [Category("Jason控件自定義屬性")] [Description("標題的背景顏色")] public Color HeadBackColor { get { return headBackColor; } set { headBackColor = value; this.Invalidate(); } } private Color headForeColor = Color.Black; [Category("Jason控件自定義屬性")] [Description("標題的前景顏色")] public Color HeadForeColor { get { return headForeColor; } set { headForeColor = value; this.Invalidate(); } } private int headHeight = 30; [Category("Jason控件自定義屬性")] [Description("標題的高度")] public int HeadHeight { get { return headHeight; } set { headHeight = value; this.Invalidate(); } } private string headText = "標題名稱"; [Category("Jason控件自定義屬性")] [Description("標題的內容")] public string HeadText { get { return headText; } set { headText = value; this.Invalidate(); } } private float linearScale= 0.4f; [Category("Jason控件自定義屬性")] [Description("漸變的程度")] public float LinearScale { get { return linearScale; } set { linearScale = value; this.Invalidate(); } } #endregion #region 字段 //畫布 private Graphics g; //畫筆 private Pen p; //畫刷 private SolidBrush sb; #endregion #region 繪制過程 protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); //自定義繪制過程 //獲取畫布 g = e.Graphics; //設置畫布 SetGraphics(g); //繪制過程 //【1】畫標題框 //LinearGradientBrush漸變色的畫刷,有四個參數 //參數1:new PointF(0, 0)左上角 //參數2:new PointF(0, this.headHeight) 左下角 //參數1和參數2說是從上往下漸變 //參數3:漸變的第一個顏色 //參數4:漸變的第二個顏色 using (LinearGradientBrush brush = new LinearGradientBrush(new PointF(0, 0), new PointF(0, this.headHeight), setStartLinearColor(this.headBackColor), this.headBackColor)) { //填充矩形 g.FillRectangle(brush,new Rectangle(0,0,this.Width,this.headHeight));//參數1:畫刷 參數2:矩形 } //【2】繪制文字 StringFormat sf=new StringFormat();//格式 sf.Alignment = StringAlignment.Center;//水平居中 sf.LineAlignment = StringAlignment.Center;//垂直居中 using (SolidBrush sb=new SolidBrush(this.headForeColor)) { g.DrawString(this.headText,this.Font,sb, new Rectangle(0, 0, this.Width, this.headHeight),sf); } //【3】繪制邊框 using (Pen p =new Pen(this.headForeColor)) { //g.DrawRectangle(p, 0, 0, this.Width, this.Height);//只顯示一半,原因:默認的筆有1個像素的寬度,畫的矩形超過了控件的1個像素的,就畫出去啦 g.DrawRectangle(p, 0, 0, this.Width - 1, this.Height - 1); g.DrawLine(p,0,this.headHeight,this.Width-1,this.headHeight); } } private Color setStartLinearColor(Color EndLinearColor) { return Color.FromArgb((int)(EndLinearColor.R + (255 - EndLinearColor.R) * this.linearScale), (int)(EndLinearColor.G + (255 - EndLinearColor.G) * this.linearScale), (int) (EndLinearColor.B + (255 - EndLinearColor.B) * this.linearScale)); } #endregion #region 設置畫布屬性的方法 private void SetGraphics(Graphics g) { //設置畫布的屬性 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;//消除鋸齒 g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//高質量顯示 g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;//字體,是字體更加清晰 g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;//字體消除鋸齒 } #endregion } }
二,繪制過程講解
1,繪制過程
1,漸變方向的說明:
3,漸變顏色的通用算法
private Color setStartLinearColor(Color EndLinearColor) { return Color.FromArgb((int)(EndLinearColor.R + (255 - EndLinearColor.R) * this.linearScale), (int)(EndLinearColor.G + (255 - EndLinearColor.G) * this.linearScale), (int) (EndLinearColor.B + (255 - EndLinearColor.B) * this.linearScale)); }
漸變程度設置到0.6左右,漸變效果好看些
4,給整個控件畫邊框的說明: