C#中新建用户控件示例

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方法,鼠标进入/离开此区域时重绘此区域颜色。
点击重新生成项目。项目->刷新项目工具箱,找到新生成的控件,拖到窗口中,调整前景色背景色:在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

发布了38 篇原创文章 · 获赞 14 · 访问量 4万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章