【C#】【Winform】自定义控件、自定义事件

news/2024/11/15 22:58:05/文章来源:https://www.cnblogs.com/luyj00436/p/18382764

https://blog.csdn.net/m0_62366581/article/details/139553373

在开发桌面的过程中,有时候自带的控件样式或者功能上可能不一定能够满足我们的所有要求。这时候,我们需要自定义控件。

  1. 创建类库项目
  2. 把图标拖放到资源文件中
  3. 添加用户控件
  4. 设置样式尺寸
  5. 修改代码视图
  6. 其他项目中复用自定义控件

1.创建类库项目

新建类库项目。注意选择“.NET Framework”。创建完成后,删除默认的Class1。

2.把全部项目拖放到资源文件中

在类库中添加图标文件(这里是png结尾的两个文件)。右击项目的【属性】→【资源】,打开资源文件。

 将图片拖拽到资源文件,并保存,即可添加到Resources资源文件中。

3.添加用户控件

右击【添加】→【新建项】,选择【用户窗体控件】。这里将命名BaseValue.cs。

4.设置样式尺寸

右击【属性】,设置大小尺寸等。

这里,添加了一个 PictureBox 和 Label 控件。并设置及基础样式。

5.修改代码

按F7进入代码修改页面。自定义属性和事件。

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Threading.Tasks;
 9 using System.Windows.Forms;
10 
11 namespace MyControlLib
12 {
13     public partial class BaseValue : UserControl
14     {
15         public BaseValue()
16         {
17             InitializeComponent();
18         }
19 
20         private bool isRun;
21         [Category("自定义属性")]
22         [Description("阀门启动或关闭")]
23         public bool IsRun
24         {
25             get { return isRun; }
26             set {
27                 if (value != isRun){
28                     isRun = value;
29                     if (isRun)
30                     {
31                         this.lb.Text = "已打开";
32                         this.pictureBox1.Image = Properties.Resources.face;
33                     }
34                     else
35                     {
36                         this.lb.Text = "已关闭";
37                         this.pictureBox1.Image = Properties.Resources.proof;
38                     }
39                 }
40             }
41         }
42 
43         public event Action<bool> IsRunChanged;
44         [Category("自定义事件")]
45         [Description("阀门双击事件")]
46         private void picValue_DoubleClick(object sender, EventArgs e)
47         {
48             if(IsRunChanged == null)
49             {
50                 IsRunChanged(isRun);
51             }
52         }
53     }
54 }
BaseValue

 设置样式属性,减少控件使用的闪烁。

1 this.SetStyle(ControlStyles.UserPaint, true);
2 this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
3 this.SetStyle(ControlStyles.DoubleBuffer, true);
4 this.SetStyle(ControlStyles.ResizeRedraw, true);
5 this.SetStyle(ControlStyles.Selectable, true);
6 this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
AllPaintingInWmPaint  如果为 true,则控件忽略窗口消息 WM_ERASEBKGND 以减少闪烁。 仅当将 UserPaint 位设置为 true 时,才应用此样式。 
CacheText 如果为 true,则控件将保留文本的副本,而不是每次必需时从 Handle 中获取。 此样式默认为 false。 此行为可提高性能,但很难保持文本同步。
 ContainerControl  如果为 true,则控件是类容器控件。
DoubleBuffer 如果为 true,则在缓冲区中进行绘制,并且完成后将结果输出到屏幕。 双缓冲可以防止因重绘控件而引起的闪烁。 如果将 DoubleBuffer 设置为 true,则还应将 UserPaint 和 AllPaintingInWmPaint 设置为 true。
EnableNotifyMessage 如果为 true,则将对发送到控件的 WndProc(Message) 的每个消息调用 OnNotifyMessage(Message) 方法。 此样式默认为 false。 EnableNotifyMessage 在部分信任中不起作用。
FixedHeight 如果为 true,则控件在自动缩放时具有固定高度。 例如,如果布局操作尝试重新缩放控件以适应新的 Font,则控件的 Height 保持不变。
FixedWidth 如果为 true,则控件在自动缩放时具有固定宽度。 例如,如果布局操作尝试重新缩放控件以适应新的 Font,则控件的 Width 保持不变。
Opaque 如果为 true,则控件会绘制为不透明,且不绘制背景。
OptimizedDoubleBuffer 如果为 true,则控件将首先绘制到缓冲区而不是直接绘制到屏幕,这可以减少闪烁。 如果将此属性设置为 true,则还应将 AllPaintingInWmPaint 设置为 true。
ResizeRedraw 如果为 true,则控件会在调整大小时进行重绘。
Selectable 如果为 true,则控件可以接收焦点。
StandardClick 如果为 true,则控件实现标准 Click 行为。
StandardDoubleClick 如果为 true,则控件实现标准 DoubleClick 行为。 如果未将 StandardClick 位设置为 true,则忽略此样式。
SupportsTransparentBackColor 如果为 true,则控件接受 alpha 组件数小于 255 个的 BackColor 来模拟透明度。 仅当将 UserPaint 位设置为 true 且父控件从 Control 派生时,才会模拟透明度。
UserMouse 如果为 true,则将由控件而不是操作系统处理其自身的鼠标事件。
UserPaint 如果为 true,则会由控件而不是由操作系统来绘制控件自身。 如果 false,则不会引发 Paint 事件。 此样式仅适用于从 Control 派生的类。
UseTextForAccessibility 指定控件的 Text 属性的值,若设置,则确定控件的默认 Active Accessibility 名称和快捷键。

6.其他项目中复用自定义控件

其他项目,添加dll引用,并在工具箱中添加引用。即可在其他项目中复用自定义控件

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/788387.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浪潮5468M7,英伟达4090,安装ubuntu18.04 使用ubuntu做运算

浪潮5468M7, 配置6块英伟达4090 使用ubuntu做运算 1.制作安装镜像,使用ventoy刻录U盘,下载ubuntu18.04 ,直接拷贝进入镜像 装系统方法此处省略,参见官方技术网站,浪潮信息技术网 – 360专家服务 (4008600011.com) 2.机器制作raid,此处步骤省略,默认启动模式为UEFI。 ri…

自我介绍+软工五问

| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/ | | ----------------- |--------------- | | 这个作业要求在哪里| https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13228 | | 这个作业的目标 | <开通博客、Github账号。熟悉博客…

CSEC:香港城市大学提出SOTA曝光矫正算法 | CVPR 2024

在光照条件不佳下捕获的图像可能同时包含过曝和欠曝。目前的方法主要集中在调整图像亮度上,这可能会加剧欠曝区域的色调失真,并且无法恢复过曝区域的准确颜色。论文提出通过学习估计和校正这种色调偏移,来增强既有过曝又有欠曝的图像。先通过基于UNet的网络推导输入图像的增…

FlexAttention:解决二次复杂度问题,将大型视觉语言模型的输入提升至1008 | ECCV 2024

\({\tt FlexAttention}\) 是一种旨在增强大型视觉语言模型的方法,通过利用动态高分辨率特征选择和分层自注意机制,使其能够有效地处理并从高分辨率图像输入中获得优势, \({\tt FlexAttention}\) 在性能和效率方面超越了现有的高分辨率方法。 来源:晓飞的算法工程笔记 公众号…

折腾 Quickwit,Rust 编写的分布式搜索引擎 - 从不同的来源摄取数据

摄取 API 在这节教程中,我们将介绍如何使用 Ingest API 向 Quickwit 发送数据。 要跟随这节教程,您需要有一个本地的 Quickwit 实例正在运行。https://quickwit.io/docs/get-started/installation要启动它,请在终端中运行 ./quickwit run。 创建索引 首先,我们创建一个无模…

Git环境配置与安装

一:Git下载与安装 二:基础配置 三:配置SSH密钥一:Git下载与安装 Git - Downloading Package (git-scm.com) 下载Git到本地双击点击安装 一直点击“Next”安装完成点击右键发现有两个“Open Git GUI here”与“Open Git Bash here”的选项 Open Git GUI here:图形化界面 O…

HR人力资源OKR示例

==尝试将Tita 做为您的OKR解决方案== O:提高内部员工敬业度和工作满意度 KR1: 开展9月每周五全体员工的会议与励志演讲主题 KR2: 采访36名员工,了解他们改善工作文化的需求 KR3: 在所有16个部门中使用OKR和Tita软件实施 KR4: 达到至少每周员工的满意度:4.7分 O:招聘工作推…

Apache RocketMQ 中文社区全新升级丨阿里云云原生 7 月产品月报

《阿里云云原生每月动态》,从趋势热点、产品新功能、服务客户、开源与开发者动态等方面,为企业提供数字化的路径与指南。云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》,从趋势热点、产品新功能、服务客户、开源与开发者动态等方面,为企业提供…

Odoo17.0 送货运费对比

运费对比 前面讲了如何在odoo中使用各种承运商来完成运费查询和发货等操作,一个很自然的场景就出来了,当我们同时启用了多个物流方式的时候,我们自然希望在发货的时候能够选择性价比最高的那个进行发货。因此,我们需要有一个物流方式对比的功能。在我们的欧姆物流解决方案中…

还在担心报表不好做?不用怕,试试这个方法(五)

前言 在上一篇文章《GcExcel 模板系列教程四-分组与扩展》中,小编为大家分享了如何使用 GcExcel 实现模板的分组与扩展,本文小编将为大家主要介绍如何在模板中进行全局设置。 GcExcel 模板中的全局设置是针对整个模板定义的设置。当需要在多个字段上应用相同属性时,全局设置…

潜力大,可创业的Plan B自由副业

本文由 ChatMoney团队出品人生永远要有Plan B,在当下的市场经济环境中,工作收入和日常支出完全不能平衡,导致生活质量越来越不理想。如果觉得实在撑不下去,也许可以换个思路。我在工作之余,也研究了AI领域如何变现。最近对比发现一款Chatmoney全能知识库AI,在整个使用过程…

ChatMoney是你创业自由副业的plan B!

本文由 ChatMoney团队出品人生永远要有Plan B,在当下的市场经济环境中,工作收入和日常支出完全不能平衡,导致生活质量越来越不理想。如果觉得实在撑不下去,也许可以换个思路。我在工作之余,也研究了AI领域如何变现。最近对比发现一款Chatmoney全能知识库AI,在整个使用过程…