一、控件继承层级(必考)
Component(组件)→ Control(控件)→ ButtonBase → Button
Timer:直接继承 Component(无界面组件)
可视化控件:全部最终继承 Control
二、C# 三种自定义控件方式
1. 扩展控件(继承原有控件)
继承系统原有控件,例如 Button、Label、TextBox。
特点:保留原有所有功能,只拓展新增样式、逻辑。
2. 用户控件(UserControl)
继承 UserControl,新建自带设计器模板,可以拖拽多个控件组合封装。
特点:适合多个控件组合复用,快速封装模块。
3. 完全自定义控件(重点)
直接继承 Control 父类,无任何自带样式,所有界面全部手动绘制。
报错处理:修改继承为 Control 后,需要手动注释掉:
cs
// this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
否则项目会编译报错。
三、完全自定义控件开发标准步骤
-
修改继承类 :将默认继承改为
Control -
注释报错代码:注释掉 AutoScaleMode 相关代码
-
重写 OnPaint 方法:手动绘制所有界面图形、文字
-
开启双缓存:解决界面刷新闪烁问题
-
自定义公开属性:暴露文本、样式属性,供外部窗体设置
四、界面闪烁问题原理 & 双缓存解决方案
1. 闪烁原因
界面刷新时:先清空原有画面 → 再绘制新画面,中间空白瞬间会产生白闪、抖动效果。
2. 双缓存原理
先将所有图形、文字绘制在内存缓存中,绘制完成后一次性贴到界面上,彻底消除中间空白闪烁。
3. 固定三行配置(必背代码)
cs
// 开启用户自定义绘制、双缓存、忽略刷新闪烁消息
SetStyle(ControlStyles.UserPaint |
ControlStyles.OptimizedDoubleBuffer |
ControlStyles.AllPaintingInWmPaint, true);
UpdateStyles(); // 立即更新样式生效
参数说明
-
UserPaint:允许开发者手动重写 OnPaint 绘制界面
-
OptimizedDoubleBuffer:开启双缓存,内存预绘制
-
AllPaintingInWmPaint:屏蔽系统窗口刷新消息,减少闪烁
五、高质量绘图配置(抗锯齿+高清画质)
在 OnPaint 中配置绘图参数,提升自定义控件画质:
cs
Graphics g = e.Graphics;
g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBilinear;
- 抗锯齿、高清合成、高质量插补,避免文字和图形毛边、模糊
六、完整可运行自定义控件代码
cs
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
namespace _04自定义控件
{
public partial class UserControl1 : Control
{
// 定义字体
private Font font = new Font("宋体", 19);
private StringFormat format = null;
public UserControl1()
{
InitializeComponent();
// 核心:开启双缓存、自定义绘制模式
SetStyle(ControlStyles.UserPaint |
ControlStyles.OptimizedDoubleBuffer |
ControlStyles.AllPaintingInWmPaint, true);
UpdateStyles();
}
// 自定义文本属性(属性窗口可显示)
[Description("文本内容")]
public string MyText
{
get { return Text; }
set { Text = value; }
}
// 文本居中样式配置
[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;
}
}
// 重写绘制方法
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
// 高清绘图配置
g.CompositingMode = CompositingMode.SourceOver;
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.AntiAlias;
g.InterpolationMode = InterpolationMode.HighQualityBilinear;
// 绘制区域(留边距)
RectangleF rtf = new RectangleF(5, 5, this.Width - 10, this.Height - 10);
// 绘制灰色背景 + 红色文字
using (SolidBrush txtBrush = new SolidBrush(Color.Red))
using (SolidBrush backBrush = new SolidBrush(Color.Gray))
{
g.FillRectangle(backBrush, rtf);
g.DrawString(MyText, font, txtBrush, rtf, Format);
}
}
}
}
七、核心考点总结(背诵版)
-
三种自定义控件:扩展控件(继承原有)、用户控件(UserControl组合)、完全自定义(继承Control)
-
完全自定义必改:继承Control、注释AutoScaleMode报错代码
-
闪屏解决核心:三样式开启双缓存,内存预绘制一次性渲染
-
绘制核心方法:重写 OnPaint,通过 Graphics 画布手动绘图
-
画质优化:开启抗锯齿、高质量插值,解决模糊毛边
-
自定义属性:搭配 Description 特性,属性窗口可视化修改
-
文本样式:StringFormat 实现居中、禁止换行、超出省略