1_繼承鏈
(1)Form1的繼承鏈:Form1==>Form==>ContainerControl==>ScrollableControl==>Control
(2)Button的繼承鏈:Button==>ButtonBase==>Control==>Component
2_自定義控件
(1)C#中控件和組件的區別
一般組件派生于:Component類,所以從此類派生出的稱之為組件。 一般用戶控件派生于:Control類或UserControl類,所以從該類派生出的稱之為用戶控件。 他們之間的關系主要是:UserControl繼承Control繼承Component。
概括:組件包括控件,控件肯定是組件,但組件不一定是控件。
控件的突出特點:就是交互式組件(能動,能和客戶交互),而用戶控件則是將某些特定的組件或控件復合從而實現特定的業務功能。 c#組件和控件的區別-OK_c# 控件 組件 區別-CSDN博客
(2)控件包含兩種
-
官方控件:自帶的,例如Button,Label等
-
自定義控件:包含三種
-
完全自定義控件:繼承自Control類
-
擴展控件:繼承自某個具體的控件類,例如Button,Label
-
復合控件:繼承UserControl類,又稱用戶控件UserControl。即:把多個控件通過組合的形式,形成更大,功能更全的控件。
-
(3) 完全自定義控件繼承Control,不是繼承UserControl,VS2022中沒有提供定義完全自定義控件的模板。
-
方法1:通過用戶控件,改寫成完全自定義控件。
-
方法2:通過組件,改寫成完全自定義控件
-
方法3: 通過類文件
-
通過用戶控件改寫后,把錯誤修復一下即可。InitializeComponent()中的this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 去掉 添加 components = new System.ComponentModel.Container();即可!
3_自定義控件示例
(1)完全自定義控件:MyLable,繼承自Control
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
?
namespace _02_自定義控件
{// 完全自定義控件繼承Control,不是繼承UserControl,VS2022中沒有提供定義完全自定義控件的模板。// 1.方法1:通過用戶控件,改寫成完全自定義控件。// 2.方法2:通過組件,改寫成完全自定義控件// 3.方法3: 通過類文件
?// 通過用戶控件改寫后,把錯誤修復一下即可。// InitializeComponent()中的this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 去掉 添加 components = new System.ComponentModel.Container();即可!
?public partial class MyLable : Control{public MyLable(){InitializeComponent();//鼠標移入的事件this.MouseEnter += MyLable_MouseEnter;//鼠標移出的事件this.MouseLeave += MyLable_MouseLeave;}private void MyLable_MouseLeave(object sender, EventArgs e){TextColor= Color.FromArgb(22, 95, 160);//鼠標樣式Cursor = Cursors.Arrow;Refresh();}
?private void MyLable_MouseEnter(object sender, EventArgs e){TextColor = Color.Red;Refresh();//重繪頁面Cursor = Cursors.No;}
?
?// <summary>/// 對畫布的配置,讓畫面畫出來的圖像更清晰 質量更高/// </summary>/// <param name="g"></param>private void setGraphics(Graphics g){
?//設置合成模式為源覆蓋g.CompositingMode = CompositingMode.SourceOver;//合成圖像的時候,使用高質量模式g.CompositingQuality = CompositingQuality.HighQuality;//抗鋸齒(讓畫筆,畫刷平滑些 更清晰)g.SmoothingMode = SmoothingMode.AntiAlias;//設置插值模式為高質量雙三插值g.InterpolationMode = InterpolationMode.HighQualityBicubic;
?}
?//完全自定義控件要求://1.必須繼承Control類//2.需要重繪(開發者自己畫控件),需要重寫一個OnPaint();//3.考慮閃屏(雙緩沖),固定配置
?protected override void OnPaint(PaintEventArgs e){base.OnPaint(e);//調用基類OnPaint方法 可以省略 不省略建議寫到第一行
?//如何畫圖: 使用GDI和GUI 后續詳解//畫板 畫筆 畫刷 畫筆的顏色 畫筆的粗細.....Graphics g = e.Graphics;//畫布setGraphics(g);
?//SolidBrush brush = new SolidBrush(TextColor);
?//畫矩形RectangleF rectf = new RectangleF(5, 5, this.Width - 10, this.Height - 10);
?//把矩形填充顏色g.FillRectangle(new SolidBrush(Color.Gray), rectf);g.DrawString(MyText, font, brush, rectf, Format);
?}
?private Font font = new Font("宋體", 9);
?private Color textColor = Color.FromArgb(22, 95, 160);
?[Description("文本顏色")]public Color TextColor{get { return textColor; }set { textColor = value; }}
?[Description("文本內容")]public string MyText{get { return Text; }set { Text = value; }}
?private StringFormat format = null;
?[Description("設置文本的對其格式")]public StringFormat Format{get{
?if (format == null){format = new StringFormat();format.Alignment = StringAlignment.Center;//水平居中format.LineAlignment = StringAlignment.Center;//垂直居中format.FormatFlags = StringFormatFlags.NoWrap;//不換行format.Trimming = StringTrimming.EllipsisCharacter;//超出的時候顯示成省略號...
?}
?return format;
?}
?}}
}
(2)自定義MyTextBox控件
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
?
namespace _02_自定義控件
{//把一個用戶控件改寫成擴展控件, 只需要把用戶控件 改成具體的控件類即可public partial class MyTextBox : TextBox{public MyTextBox(){InitializeComponent();}
?
?//[Description("文本框的背景顏色")]public Color MyBakcColor{get{return BackColor;}set{BackColor = value;Refresh();}}}
}
?