首页 > 编程语言 >【C#】【Winform】自定义控件、自定义事件

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

时间:2024-08-28 10:03:53浏览次数:8  
标签:控件 自定义 C# System 如果 using true

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引用,并在工具箱中添加引用。即可在其他项目中复用自定义控件

 

标签:控件,自定义,C#,System,如果,using,true
From: https://www.cnblogs.com/luyj00436/p/18382764

相关文章

  • C++学习随笔——什么是迭代器
    迭代器是C++标准模板库(STL)中用于遍历容器元素的对象或概念。它们提供了一种通用的方式来访问容器中的元素,而不需要了解容器的底层实现。迭代器在设计上类似于指针,但功能更为强大和灵活。 1.迭代器是什么?迭代器是一个抽象概念,它为容器(如vector、list等)提供了一种统......
  • BuildContext 是什么
    在 Flutter 中 BuildContext 可太常见了,不管是 StatelessWidget 还是 StatefulWidget 的 build() 函数参数都会带有 BuildContext,好像随处可见,就像我们的一位老朋友,但似乎又对其知之甚少(熟悉的陌生人),今天我们再来了解一下这位老朋友 BuildContext,看看它在 Flutter ......
  • 使用schroot在Ubuntu 22.04中安装“Ubuntu 16.04子系统
    新的高通SDK需要较新的Ubuntu版本,但老的高通SDK却不兼容,因为Ubuntu22.04的rootfs环境与16.04差异巨大,导致SDK中部分项目在编译时由于依赖不兼容导致编译出错。同时又因为服务器硬件升级导致安装旧版本的Ubuntu系统时,部分硬件由于驱动问题得不到支持,不得不将系统升级到新版本的Ubu......
  • C. Turtle and Good Pairs
    https://codeforces.com/contest/2003/problem/C题意:。。。思路:如果要使满足条件的有序对最多,那么首先如果两个字符相等,那么无论如何排列,最终的贡献值都不会变。再看字符不相等的情况,假如有aabbcc,那么abcabc总是优于aabbcc,因为如果一个字符出现了多次,那么像aab,bcc这种就会没......
  • Apache RocketMQ 中文社区全新升级丨阿里云云原生 7 月产品月报
    云原生月度动态云原生是企业数字创新的最短路径。《阿里云云原生每月动态》,从趋势热点、产品新功能、服务客户、开源与开发者动态等方面,为企业提供数字化的路径与指南。趋势热点......
  • 【Hot100】LeetCode—39. 组合总和
    目录1-思路2-实现⭐39.组合总和——题解思路3-ACM实现题目连接:39.组合总和1-思路注意如果借助startIndex实现,理解startIndex的含义在本题目中,由于同一个元素可以重复选取,因此startIndex在传递的过程中,不需要进行+1操作,传递的值为i2-实现⭐39......
  • 白骑士的CSS教学进阶篇之变形与过渡 3.1.3 动画
            CSS动画允许开发者在网页中创建复杂的动态效果,而不需要依赖JavaScript。通过使用‘@keyframes‘规则定义动画的关键帧,以及‘animation‘属性来控制动画的行为和效果,你可以实现从简单到复杂的各种动画效果。以下内容将详细讲解CSS动画的各个部分,包括‘......
  • 【Hot100】LeetCode—17. 电话号码的字母组合
    目录1-思路String数组(哈希表)+回溯2-实现⭐17.电话号码的字母组合——题解思路3-ACM实现题目连接:17.电话号码的字母组合1-思路String数组(哈希表)+回溯思路通过String数组实现哈希表,存储0-9的哈希表映射回溯三部曲①参数及返回值numToStr:Stri......
  • 白骑士的CSS教学进阶篇之变形与过渡 3.1.2 过渡效果
            在CSS中,过渡效果(transition)允许你在属性值发生变化时平滑过渡,使变更过程更加自然和动感。使用过渡效果可以改善用户体验,使页面在变化时看起来更加流畅。通过设置‘transition‘属性,你可以控制过渡的属性、持续时间、时间函数和延迟等。这一节将详细介绍‘......
  • CSEC:香港城市大学提出SOTA曝光矫正算法 | CVPR 2024
    在光照条件不佳下捕获的图像可能同时包含过曝和欠曝。目前的方法主要集中在调整图像亮度上,这可能会加剧欠曝区域的色调失真,并且无法恢复过曝区域的准确颜色。论文提出通过学习估计和校正这种色调偏移,来增强既有过曝又有欠曝的图像。先通过基于UNet的网络推导输入图像的增亮和变暗......