一、前言

技术没有先进与落后,只有合适与不合适。

自定义控件可以分为三类:

一类是“无中生有”。就如之前文章中的的那些控件,都是继承基类Control,来实现特定的功能效果;

一类是“有则改之”。是对原生控件的改造,以达到特定的功能效果;

一类是“用户控件”。是将多个控件进行组合,以实现比较复杂的功能效果。

本篇将实现第二类“有则改之”,通过改造最常用的控件:Label,来讲解一下实现的基本流程。

相信看完的你,一定会有所收获。

本文地址:https://www.cnblogs.com/lesliexin/p/14165466.html


二、前期分析

(一)为什么要改造原生控件

之所以要改造原生控件,是因为原生控件在某些方面不符合自己的需要。

对于Label而言,当Label的属性:AutoEllipsis=True,AutoSize=False,且文本长度超过Label宽度时(此时Label文本最后几个字符会变成“...”)。如果将鼠标放在Label上,则会自动弹出悬浮提示,提示文本为当前Label的内容。

这个自动弹出悬浮提示的功能是很人性化的,但是在某些情况下我不想Label弹出悬浮提示,而Label并没有一个开放的属性去控件,所以需要对Label进行改造,以达到悬浮提示可控制化。

(二)预期效果

通过一个公开属性,去控制Label是否自动弹出悬浮提示。


三、开始实现

(一)前期准备

新建类:LLabel.cs(注:不可与系统Label重名,虽然是对系统控件的改造,但其实是实现一个新的控件)

添加继承:Label(需要添加引用:System.Windows.Forms.dll)

(注:此处与之前文章不同,之前文章中都是继承Control的。现在因为要对Label进行改造,所以要继承Label)

修改可访问性为:public

(二)添加属性

1,是否启用自动弹出悬浮提示

我们将通过本属性来控制是否自动弹出悬浮提示。

在这里,我们除了之前使用过的“Category”(分类)和“Description”(描述)外,还使用了一个新的“DefaultValue”(默认值)。效果是指示当前属性的默认值,在设计器窗口的“属性”窗口中,如果属性是默认值,则属性值显示为标准字体,如果不是默认值,则显示为粗体。

(三)重写事件

因为是对原生控件的改造,所以不再添加事件,而是对当前事件重写。

1,OnMouseEnter

因为是在鼠标进行控件后,才弹出悬浮提示,所以,我们对需要对鼠标进入控件事件进行重写,也就是重写OnMouseEnter事件。


四、效果演示

如图:

五、结束语

本篇对Label控件的改造非常简单,也没有涉及到太深的内容。本篇更多的是为了让大家对原生控件的改造有个整体的印象。

虽然每个人的需求都不一样,对原生控件的所做改造也不一样,但是整体的改造流程却是类似的。


六、源代码及工程下载

https://files.cnblogs.com/files/lesliexin/06,LLabel.7z

[C#] (原创)一步一步教你自定义控件——05,Label(原生控件)的更多相关文章

  1. [原创]C#应用WindowsApi实现查找\枚举(FindWindow、EnumChildWindows)窗体控件,并发送消息。

    首先介绍基本WindowsApi: public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 函 ...

  2. 一步一步学Silverlight 2系列(10):使用用户控件

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  3. Iocomp控件教程之Analog Display—模拟显示控件(优于EDIT控件)

    Analog Display是简洁的显示控件.用于显示指定准确度和单位的模拟值(实数),能够将准确度设置为0.使显示结果为整数. 第一步:建立MFC对话框 第二步:插入AnalogDisplay控件 ...

  4. Iocomp控件教程之Pie Chart——饼状图控件

    Pie Chart--饼状图控件(Pie Chart)以饼状图形式显示每一个项目内容所占的百分比比重.在设计时.能够使用属性编辑器加入或者移除项目以及更改属性值.在执行时.使用AddItem,Remo ...

  5. Iocomp控件教程之LinearGauge--线性刻度尺控件

    线性刻度尺-线性刻度尺控件(LinearGauge)是一个具有线性表达式刻度的图像控件.支持多达5种颜色断面和4种指示器样式,相同功能,查看线性对数刻度尺(Linear Log Gauge)控件内容 ...

  6. 【原创】自己动手写控件----XSmartNote控件

    一.前面的话 在上一篇博文自己动手写工具----XSmartNote [Beta 3.0]中,用到了若干个自定义控件,其中包含用于显示Note内容的简单的Label扩展控件,用于展示标签内容的labe ...

  7. [原创][开源]SunnyUI.Net, C# .Net WinForm开源控件库、工具类库、扩展类库、多页面开发框架

    SunnyUI.Net, 基于 C# .Net WinForm 开源控件库.工具类库.扩展类库.多页面开发框架 Blog: https://www.cnblogs.com/yhuse Gitee: h ...

  8. [C#] (原创)一步一步教你自定义控件——01,TrackBar

    一.前言 技术没有先进落后之分,只有合不合适. WinForm有着非常多的优点,在使用WinForm久了之后,难免会觉得WinForm自带的某些控件外观上有些许朴素.或者功能上有些不如意,自然而然便想 ...

  9. [C#] (原创)一步一步教你自定义控件——04,ProgressBar(进度条)

    一.前言 技术没有先进与落后,只有合适与不合适. 本篇的自定义控件是:进度条(ProgressBar). 进度条的实现方式多种多样,主流的方式有:使用多张图片去实现.使用1个或2个Panel放到Use ...

随机推荐

  1. synchronized关键字的内存语义

    以下内容摘自:Java并发编程之美 加锁和释放锁的语义:当获取锁以后会清空锁块内本地内存中将会被用到的共享变量,在使用这些共享变量的时从主内存进行加载,在释放锁时将本地内存中修改的 共享变量刷新到主内 ...

  2. Tarjan 算法总结

    一些概念 连通:无向图中的任意两点都可以互相到达. 强连通:有向图中的任意两点都可以互相到达. 连通分量:无向图的极大连通子图. 强连通分量:有向图的极大强连通子图. DFS 生成树:对一张图(有向无 ...

  3. C++基础知识篇:C++ 修饰符类型

    C++ 允许在 char.int 和 double 数据类型前放置修饰符.修饰符用于改变基本类型的含义,所以它更能满足各种情境的需求. C/C++的学习裙[七一二 二八四 七零五 ],无论你是小白还是 ...

  4. 如何将图片、html等格式转成pdf

    const int WWidth = 600; const int HHeight = 800; List<System.Drawing.Image> AllName = new List ...

  5. linux离线安装docker + docker-compose

    1 准备阶段(docker) 1.1 卸载旧版本 如果电脑上已经存在docker,需要先卸载可能存在的旧版本: 1. 删除某软件,及其安装时自动安装的所有包 sudo apt-get autoremo ...

  6. 关于javaSMTP协议发邮件你必须知道的知识点

    1.阅读官方吐槽 Note also that THERE IS NOT SUFFICIENT DOCUMENTATION HERE TO USE THESE FEATURES!!! You will ...

  7. 区块链知识博文1: 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)

    注:这是本人读到的关于共识算法最全和最好的分享博文,系统的介绍了拜占庭容错技术以及共识算法的原理和常用共识算法,原文链接请见后. 目录 一.拜占庭容错技术(Byzantine Fault Tolera ...

  8. 老猿学5G扫盲贴:中国移动网络侧CHF主要功能及计费处理的主要过程

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一. ...

  9. PyQt(Python+Qt)学习随笔:QTreeWidget中给树型部件增加顶层项的方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTreeWidget对象创建后,是没有任何项的,要给部件增加项,首先要增加顶层项.顶层项的增加有三 ...

  10. PyQt(Python+Qt)学习随笔:QAbstractItemView的iconSize属性

    老猿Python博文目录 老猿Python博客地址 视图的iconSize属性用于控制显示icon的项上的icon图标大小,在视图可见情况下设置该属性会导致视图上的显示项重新调整布局. 可以使用ico ...