C# WinForm 三种自定义控件 + 完全自定义重绘控件知识点 📅 2026/7/24 21:45:03 一、控件继承层级必考Component组件→ Control控件→ ButtonBase → ButtonTimer直接继承 Component无界面组件可视化控件全部最终继承 Control二、C# 三种自定义控件方式1. 扩展控件继承原有控件继承系统原有控件例如Button、Label、TextBox。特点保留原有所有功能只拓展新增样式、逻辑。2. 用户控件UserControl继承UserControl新建自带设计器模板可以拖拽多个控件组合封装。特点适合多个控件组合复用快速封装模块。3. 完全自定义控件重点直接继承Control父类无任何自带样式所有界面全部手动绘制。报错处理修改继承为 Control 后需要手动注释掉// this.AutoScaleMode System.Windows.Forms.AutoScaleMode.Font;否则项目会编译报错。三、完全自定义控件开发标准步骤修改继承类将默认继承改为Control注释报错代码注释掉 AutoScaleMode 相关代码重写 OnPaint 方法手动绘制所有界面图形、文字开启双缓存解决界面刷新闪烁问题自定义公开属性暴露文本、样式属性供外部窗体设置四、界面闪烁问题原理 双缓存解决方案1. 闪烁原因界面刷新时先清空原有画面 → 再绘制新画面中间空白瞬间会产生白闪、抖动效果。2. 双缓存原理先将所有图形、文字绘制在内存缓存中绘制完成后一次性贴到界面上彻底消除中间空白闪烁。3. 固定三行配置必背代码// 开启用户自定义绘制、双缓存、忽略刷新闪烁消息 SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); UpdateStyles(); // 立即更新样式生效参数说明UserPaint允许开发者手动重写 OnPaint 绘制界面OptimizedDoubleBuffer开启双缓存内存预绘制AllPaintingInWmPaint屏蔽系统窗口刷新消息减少闪烁五、高质量绘图配置抗锯齿高清画质在 OnPaint 中配置绘图参数提升自定义控件画质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;抗锯齿、高清合成、高质量插补避免文字和图形毛边、模糊六、完整可运行自定义控件代码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 实现居中、禁止换行、超出省略