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

相关推荐
言乐62 小时前
Python游戏水平测试辅助系统
开发语言·python·游戏·django·pygame
yuhulkjv3357 小时前
Claude表格复制到word不再崩溃,AI导出鸭批量导出+格式无损一键搞定
人工智能·ai·c#·word·ai导出鸭
WWJA王文举9 小时前
I²C通信完整流程详解:START、地址、ACK、数据、Repeated START和STOP一次讲透
c语言·开发语言
zhanghaha131410 小时前
Python进阶教程:6_JSON 数据解析 —— 新手完全指南
开发语言·python·json
qq_4480111611 小时前
C语言中的动态内存分配
c语言·开发语言·php
汉字萌萌哒12 小时前
2024CSP-J入门级C++真题详解
开发语言·c++
arbboter12 小时前
【网络工具】NetProxy网络代理用户手册
开发语言·网络·c#·网络代理·网络异常·代理工具
微小冷13 小时前
海康威视相机C#二次开发环境配置
数码相机·c#·.net·海康威视·相机开发
汉字萌萌哒13 小时前
2019CCF-CSP入门级C++试题解析
java·开发语言·c++
叠层归一研究院13 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi