C# WinForm 三种自定义控件 + 完全自定义重绘控件知识点

一、控件继承层级(必考)

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;

否则项目会编译报错。


三、完全自定义控件开发标准步骤

  1. 修改继承类 :将默认继承改为 Control

  2. 注释报错代码:注释掉 AutoScaleMode 相关代码

  3. 重写 OnPaint 方法:手动绘制所有界面图形、文字

  4. 开启双缓存:解决界面刷新闪烁问题

  5. 自定义公开属性:暴露文本、样式属性,供外部窗体设置


四、界面闪烁问题原理 & 双缓存解决方案

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 实现居中、禁止换行、超出省略

相关推荐
学逆向的1 小时前
汇编——寻址方式
开发语言·汇编·网络安全
大模型码小白1 小时前
企业级检索增强后端集成:Java 服务如何管理知识库版本
java·服务器·开发语言·人工智能·python·microsoft
-银雾鸢尾-1 小时前
C#中的Dictionary相关方法
开发语言·c#
农村小镇哥1 小时前
Python3开发快速获取图片的文字
开发语言·python
geovindu2 小时前
go:Backtracking Algorithm
开发语言·后端·算法·golang·回溯算法
lzhdim2 小时前
C# 中读取CPU、硬盘和内存温度
开发语言·c#
Irene19912 小时前
Oracle PL/SQL Developer 版本差异(11g、14)实战总结
java·开发语言
qq_448011162 小时前
C语言中的getchar()
c语言·开发语言
肖志-AI全栈2 小时前
JavaScript 快速排序:从 pivot、双指针到分治思想
开发语言·javascript·排序算法