C#工具箱中已经自带了一些基础控件,对于要求不高的项目来说已经可以满足需求,如果觉得自带控件不好用的可以使用第三方的控件库,这个收费和免费的都有很多,如果这些还满足不了自己的个性化需求的就只能自己写了,基本上自己写的控件库根据自定义的程度不同可以分为三档:
第一档:复合控件
这类控件只是为了解决某一些重复出现的控件组合的需求而编写的,比如TrackBar和label组合显示的复合控件,这类控件从UserControl类派生而来,只是几个现有控件的组合体,自定义这几个控件的逻辑关系,并没有重写;
第二档:扩展控件
这类控件为了解决现有控件不能完全满足需求的情况而编写,可以增加新功能或者修改原有功能,比如为了使ListView控件更新时不闪烁而继承ListView派生出一个新的ListView类,修改了其中的一部分功能;
第三档:自定义控件
这类控件为了解决现有的控件中并没有所需的功能而编写,可以直接与自带控件一样继承于System.Windows.Forms.Control类,作为一种真正全新的控件,除了Control类提供的最基本的功能外,其他的事件、属性、功能甚至于界面的绘制,都需要由编写者自己添加,不能在“UserControl测试容器”中进行测试,第三方控件库就属于这一类。自定义控件也不一定非要从Control类派生,也可以从UserControl类派生而来,如果是从UserControl类派生而来,就可以在“UserControl测试容器”中进行测试。
复合控件篇
首先在VS中新建用户控件库:
现在让我们新建一个控件吧,拖入一个TrackBar和label,如下图:
代码如下:
public UserControl1()
{
InitializeComponent();
label1.Text= (((double)trackBar1.Value / (double)trackBar1.Maximum) * 100).ToString() + "%";
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
label1.Text = (((double)trackBar1.Value/ (double)trackBar1.Maximum)*100).ToString()+"%";
}
public string CurrentValue
{
set
{
label1.Text = value+"%";
if (Convert.ToDouble(value) != 0) trackBar1.Value = (Int32)(Convert.ToDouble(value) / 100 * trackBar1.Maximum);
else trackBar1.Value = 0;
}
get
{
return label1.Text.Remove(label1.Text.Length-1);
}
}
点击启动以后开始运行,和普通的winform程序不同的是,控件是在用户控件测试容器中运行的,可以让用户看到此控件的预览效果,这个小控件很简单就是显示当前游标所在位置的百分比。
生成解决方案后将会在生成文件夹中生成相应的dll文件,如下图:
这个dll文件就是我们新制作的集合控件。现在来测试一下吧,新建一个winform项目,点击工具->选择工具箱项,点击浏览,选择前面生成的dll文件:
现在在工具箱中出现了我们的用户控件,拖入窗口,加个按钮和文本框用输入来改变游标位置:
输入按钮绑定的函数代码:
private void button1_Click(object sender, EventArgs e)
{
if (Convert.ToDouble(textBox1.Text) < 0 || Convert.ToDouble(textBox1.Text) > 100)
{
MessageBox.Show("请输入0-100之间数值!"); return;
}
userControl11.CurrentValue = textBox1.Text;
}
最终效果:
扩展控件篇
参考C#中ListView详解这篇文章末尾的这个吧,派生一下根据自己的需求重写或者增加即可。
在自定义控件的过程中,可以优先考虑从现有的控件中进行派生,并添加所需要的功能。(制作效果,当鼠标指针移动到控件时,控件颜色就会发生改变,当鼠标离开时就恢复原来的颜色)
首先添加一个新的类。在解决方案资源管理器窗口中设置:引用---->添加引用,勾选:在这里插入代码片
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Design;
namespace Contol颜色
{
//[DefaultProperty("HoverColor")]
//[Designer(typeof(ColourControl))]
public class ColourControl : Control
{
#region
//重写该属性以设置控件默认大小
protected override System.Drawing.Size DefaultSize
{
get
{
return new Size(100, 100);
}
}
//当鼠标指针移动到控件区域内时的颜色
public Color HoverColor
{
get { return M_hoverColor; }
set
{
M_hoverColor = value;
Invalidate();//强制重新绘制
}
}
#endregion
#region
//该变量标识鼠标指针是否已经进入控件的区域
private bool isMouseEnter = false;
//当鼠标进入控件区域后的背景颜色
Color M_hoverColor;
#endregion
#region 方法
protected override void OnMouseEnter(EventArgs e)
{
//标识鼠标指正已经进入区域
isMouseEnter = true;
//强制重新绘制
Invalidate();
base.OnMouseEnter(e);
}
protected override void OnMouseLeave(EventArgs e)
{
//标识鼠标指针是否已经离开控件
isMouseEnter = false;
//强制重新绘制
Invalidate();
base.OnMouseLeave(e);
}
protected override void OnPaint(PaintEventArgs e)
{
//用于填充控件背景区域的画刷
SolidBrush brush = new SolidBrush(BackColor);
if (isMouseEnter)
{
brush.Color = HoverColor;
}
e.Graphics.FillRectangle(brush, e.ClipRectangle);
//释放画刷资源
brush.Dispose();
}
#endregion
}
}
不使用自带控件生成,只继承于Control,不能在“UserControl测试容器”中进行测试,重写OnPaint方法,鼠标进入/离开此区域时重绘此区域颜色。
点击重新生成项目。项目->刷新项目工具箱,找到新生成的控件,拖到窗口中,调整前景色背景色: