第二阶段WinForm-11:自定义控件

发布于:2025-08-30 ⋅ 阅读:(20) ⋅ 点赞:(0)

1_继承链

(1)Form1的继承链:Form1==>Form==>ContainerControl==>ScrollableControl==>Control

(2)Button的继承链:Button==>ButtonBase==>Control==>Component

2_自定义控件

(1)C#中控件和组件的区别

一般组件派生于:Component类,所以从此类派生出的称之为组件。 一般用户控件派生于:Control类或UserControl类,所以从该类派生出的称之为用户控件。 他们之间的关系主要是:UserControl继承Control继承Component。

概括:组件包括控件,控件肯定是组件,但组件不一定是控件。

控件的突出特点:就是交互式组件(能动,能和客户交互),而用户控件则是将某些特定的组件或控件复合从而实现特定的业务功能。 c#组件和控件的区别-OK_c# 控件 组件 区别-CSDN博客

(2)控件包含两种

  • 官方控件:自带的,例如Button,Label等

  • 自定义控件:包含三种

    • 完全自定义控件:继承自Control类

    • 扩展控件:继承自某个具体的控件类,例如Button,Label

    • 复合控件:继承UserControl类,又称用户控件UserControl。即:把多个控件通过组合的形式,形成更大,功能更全的控件。

(3) 完全自定义控件继承Control,不是继承UserControl,VS2022中没有提供定义完全自定义控件的模板。

  • 方法1:通过用户控件,改写成完全自定义控件。

  • 方法2:通过组件,改写成完全自定义控件

  • 方法3: 通过类文件

  • 通过用户控件改写后,把错误修复一下即可。InitializeComponent()中的this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 去掉 添加 components = new System.ComponentModel.Container();即可!

3_自定义控件示例

(1)完全自定义控件:MyLable,继承自Control

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
​
namespace _02_自定义控件
{
    // 完全自定义控件继承Control,不是继承UserControl,VS2022中没有提供定义完全自定义控件的模板。
    // 1.方法1:通过用户控件,改写成完全自定义控件。
    // 2.方法2:通过组件,改写成完全自定义控件
    // 3.方法3: 通过类文件
​
    // 通过用户控件改写后,把错误修复一下即可。
    // InitializeComponent()中的this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 去掉  添加 components = new System.ComponentModel.Container();即可!
​
    public partial class MyLable : Control
    {
        public MyLable()
        {
            InitializeComponent();
            //鼠标移入的事件
            this.MouseEnter += MyLable_MouseEnter;
            //鼠标移出的事件
            this.MouseLeave += MyLable_MouseLeave;
        }
        private void MyLable_MouseLeave(object sender, EventArgs e)
        {
            TextColor= Color.FromArgb(22, 95, 160);
            //鼠标样式
            Cursor = Cursors.Arrow;
            Refresh();
        }
​
        private void MyLable_MouseEnter(object sender, EventArgs e)
        {
            TextColor = Color.Red;
            Refresh();//重绘页面
            Cursor = Cursors.No;
        }
​
​
        // <summary>
        /// 对画布的配置,让画面画出来的图像更清晰 质量更高
        /// </summary>
        /// <param name="g"></param>
        private void setGraphics(Graphics g)
        {
​
            //设置合成模式为源覆盖
            g.CompositingMode = CompositingMode.SourceOver;
            //合成图像的时候,使用高质量模式
            g.CompositingQuality = CompositingQuality.HighQuality;
            //抗锯齿(让画笔,画刷平滑些 更清晰)
            g.SmoothingMode = SmoothingMode.AntiAlias;
            //设置插值模式为高质量双三插值
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
​
        }
​
        //完全自定义控件要求:
        //1.必须继承Control类
        //2.需要重绘(开发者自己画控件),需要重写一个OnPaint();
        //3.考虑闪屏(双缓冲),固定配置
​
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);//调用基类OnPaint方法  可以省略 不省略建议写到第一行
​
            //如何画图: 使用GDI和GUI 后续详解
            //画板  画笔  画刷  画笔的颜色 画笔的粗细.....
            Graphics g = e.Graphics;//画布
            setGraphics(g);
​
            //
            SolidBrush brush = new SolidBrush(TextColor);
​
            //画矩形
            RectangleF rectf = new RectangleF(5, 5, this.Width - 10, this.Height - 10);
​
            //把矩形填充颜色
            g.FillRectangle(new SolidBrush(Color.Gray), rectf);
            g.DrawString(MyText, font, brush, rectf, Format);
​
        }
​
        private Font font = new Font("宋体", 9);
​
        private Color textColor = Color.FromArgb(22, 95, 160);
​
        [Description("文本颜色")]
        public Color TextColor
        {
            get { return textColor; }
            set { textColor = value; }
        }
​
        [Description("文本内容")]
        public string MyText
        {
            get { return Text; }
            set { Text = value; }
        }
​
        private StringFormat format = null;
​
        [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;
​
            }
​
        }
    }
}

(2)自定义MyTextBox控件

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
​
namespace _02_自定义控件
{
    //把一个用户控件改写成扩展控件, 只需要把用户控件 改成具体的控件类即可
    public partial class MyTextBox : TextBox
    {
        public MyTextBox()
        {
            InitializeComponent();
        }
​
​
        //
        [Description("文本框的背景颜色")]
        public Color MyBakcColor
        {
            get
            {
                return BackColor;
            }
            set
            {
                BackColor = value;
                Refresh();
            }
        }
    }
}
​