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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章