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

第二阶段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.xdnf.cn/news/19160.html

相关文章:

  • Java全栈工程师的面试实战:从技术细节到业务场景
  • 在八月点燃AI智慧之火:CSDN创作之星挑战赛开启灵感盛宴
  • 04.《VLAN基础与配置实践指南》
  • Django Admin 管理工具
  • NSSCTF-[NISACTF 2022]string_WP
  • 身份证实名认证API集成—身份核验接口-网络平台安全合规
  • mitmproxy的使用初试
  • windows中Qwen3‑Coder 与 Claude Code 搭配使用
  • 《UE5_C++多人TPS完整教程》学习笔记45 ——《P46 待机与跳跃动画(Idle And Jumps)》
  • 【完整源码+数据集+部署教程】植物病害检测系统源码和数据集:改进yolo11-EMSCP
  • Lombok vs Java Record:谁才是未来?
  • week5-[二维数组]翻转
  • Node.js 的流(Stream)是什么?有哪些类型?
  • DBeaver 的 PostgreSQL 驱动包默认存储位置
  • 计算机网络知识--对称加密、非对称加密和数字证书详解
  • “上门做饭”平台的核心技术栈与运营壁垒是什么?
  • OpenCV之霍夫变换
  • Linux系统部署:Certbot 实现 Nginx 自动续期部署 Let‘s Encrypt 免费 SSL 证书
  • css三角形
  • 万字解析RAG(检索增强生成)系统的构建与优化,从基础架构逐步深入到高级技术
  • 深度学习入门Day10:深度强化学习原理与实战全解析
  • 虚拟机快照对内存与磁盘空间的影响
  • Git 合并冲突
  • C++ 编译和运行 LibCurl 动态库和静态库
  • 32.String str=aaa与 String str=new String(aaa)一样吗?new String(“aaa”);创建了几个字符串对象
  • Linux按键驱动开发
  • 明远智睿 RK3568 核心板:以硬核性能解锁多领域应用新可能
  • 手写一个Spring框架
  • 【活动回顾】“智驱未来,智领安全” AI+汽车质量与安全论坛
  • Labview邪修01:贪吃蛇