当前位置: 首页 > news >正文

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

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();}}}
}
​

http://www.dtcms.com/a/356332.html

相关文章:

  • 嵌入式Linux驱动开发:i.MX6ULL中断处理
  • 深入解析Qt节点编辑器框架:交互逻辑与样式系统(二)
  • C++基础(⑤删除链表中的重复节点(链表 + 遍历))
  • 储能变流器之LLC
  • MySQL数据库精研之旅第十四期:索引的 “潜规则”(上)
  • Unity、Unreal Engine与Godot中纹理元数据管理的比较分析
  • 嵌入式Linux LED驱动开发
  • Ubuntu22.04系统安装Opencv,无法定位包libjasper-dev libdc1394-22-dev的解决办法
  • 【C++】C++入门——(上)
  • GTSAM中gtsam::LinearContainerFactor因子详解
  • 【C++八股文】计算机网络篇
  • 【YOLO学习笔记】数据增强mosaic、Mixup、透视放射变换
  • flutter-使用url_launcher打开链接/应用/短信/邮件和评分跳转等
  • leetcode 338 比特位计数
  • rockchip温控及cpu降频配置
  • 事务和锁(进阶)
  • 使用 Docker 部署 Squid 为 Kubernetes 中的 Nexus3 提供公网代理访问
  • Windows12概念曝光,巧用远程控制工具抢先体验
  • 人脸识别“不备案“有哪些后果?
  • 公司内网部署离线deepseek+docker+ragflow本地模型实战
  • Day15 Logurs框架学习
  • Elasticsearch核心配置与性能优化
  • Linux 线程调度核心要点
  • 期权合约作废了怎么处理?
  • AI共链·智存未来 | 绿算技术受邀出席华为AI SSD发布会
  • 若依微服务一键部署(RuoYi-Cloud):Nacos/Redis/MySQL + Gateway + Robot 接入(踩坑与修复全记录)
  • 吱吱企业通讯软件可私有化部署,构建安全可控的通讯办公平台
  • C++异常处理指南:构建健壮程序的错误处理机制
  • 2025年渗透测试面试题总结-39(题目+回答)
  • FDTD_mie散射_仿真学习(2)