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

相关推荐
1024奇点2 小时前
【仓颉语言入门 · 第二篇 第 22 课】
开发语言·ide·开源
Warren2Lynch2 小时前
C4 模型详解:利用 Visual Paradigm 可视化软件架构的综合指南
开发语言·uml
Knight_AL3 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
FRing034 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
吃一碗粉只付一碗钱4 小时前
16-SqlSugar多库ConfigId与按实体选连接
sqlserver·c#
by209994 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
砚底藏山河4 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
IT召唤狮4 小时前
开源企业级零信任项目Pangolin,零信任能挡住PHP核弹漏洞吗?
开发语言·开源·php
知已难寻4 小时前
03 · OpenStack的计算管理 Nova
运维·服务器·开发语言·云原生·云计算·openstack·开源软件
Rover Ramble5 小时前
C++ 用互斥锁实现读写锁
开发语言·c++