Создание библиотеки пользовательского элемента управления

В статье Диалоговое окно ввода цифр кликом мышки описано как внедрить в свой проект графический ввод чисел кликом мыши. Давайте перенесём код этой формы в пользовательский элемент управления. Библиотека пользовательских элементов управления облегчает их повторное использование. В такую библиотеку и разместим наш элемент.

Библиотека пользовательских элементов управления : Содержание

Создадим новый проект для библиотеки по шаблону «Библиотека элементов управления Windows Forms ( .NET Framework )» и назовём, например, DialogWindowsFormsControlLibrary. В открывшемся окне конструктора создадим наш собственный элемент управления из стандартных элементов или добавим элемент отображения картинки PictureBox и нарисуем в нем что-то своё, а функционал добавим обработкой событий. Для этого примера я скопировал набор элементов диалогового окна ввода цифр :

рис. 1 Элементы пользовательского окна

Разбираем код класса

Имя данного по умолчанию класса UserControl1.cs переименуем во что-то нам понятное — UserNumberEnteringForm.cs. Добавим реализацию обработки событий Click кнопок и Paint для PictureBox. Для кнопки «OK» установим для свойства DialogResult значение «OK». Логика взята из диалогового окна ввода цифр :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DialogWindowsFormsControlLibrary
{
    public partial class UserNumberEnteringForm: UserControl
    {
        public string s_num;
        public UserNumberEnteringForm()
        {
            InitializeComponent();
            s_num = "_";
        }
        private void pictureBoxNum_Paint(object sender, PaintEventArgs e)
        {
            if ((s_num.Length > 1) && (s_num[0] == '_'))
            {
                s_num = s_num.Substring(1, s_num.Length - 1);
            }
            Bitmap picGr = new Bitmap(pictureBoxNum.Width, pictureBoxNum.Height);
            Graphics g = Graphics.FromImage(picGr);
            Pen penGr = new Pen(Brushes.Green, 3);
            Pen penSn = new Pen(Brushes.Red, 3);
            Font fN = new Font(FontFamily.GenericSansSerif, 20.0F, FontStyle.Bold);
            SolidBrush brGR = new SolidBrush(Color.Green);

            g.Clear(pictureBoxNum.BackColor);

            Point p1 = new Point(5, 5);
            g.DrawString(s_num, fN, brGR, p1);

            e.Graphics.DrawImage(picGr, new Point(0, 0));

            brGR.Dispose();
            fN.Dispose();
            penSn.Dispose();
            penGr.Dispose();
            g.Dispose();
            picGr.Dispose();
        }
        private void but_C_Click(object sender, EventArgs e)
        {
            s_num = "_";
            pictureBoxNum.Refresh();
        }

        private void but_back_Click(object sender, EventArgs e)
        {
            if (s_num.Length > 0) s_num = s_num.Substring(0, s_num.Length - 1);
            pictureBoxNum.Refresh();
        }

        private void but_0_Click(object sender, EventArgs e)
        {
            s_num += "0";
            pictureBoxNum.Refresh();
        }

        private void but_1_Click(object sender, EventArgs e)
        {
            s_num += "1";
            pictureBoxNum.Refresh();
        }

        private void but_2_Click(object sender, EventArgs e)
        {
            s_num += "2";
            pictureBoxNum.Refresh();
        }

        private void but_3_Click(object sender, EventArgs e)
        {
            s_num += "3";
            pictureBoxNum.Refresh();
        }

        private void but_4_Click(object sender, EventArgs e)
        {
            s_num += "4";
            pictureBoxNum.Refresh();
        }

        private void but_5_Click(object sender, EventArgs e)
        {
            s_num += "5";
            pictureBoxNum.Refresh();
        }

        private void but_6_Click(object sender, EventArgs e)
        {
            s_num += "6";
            pictureBoxNum.Refresh();
        }

        private void but_7_Click(object sender, EventArgs e)
        {
            s_num += "7";
            pictureBoxNum.Refresh();
        }

        private void but_8_Click(object sender, EventArgs e)
        {
            s_num += "8";
            pictureBoxNum.Refresh();
        }

        private void but_9_Click(object sender, EventArgs e)
        {
            s_num += "9";
            pictureBoxNum.Refresh();
        }
    }
}

Пример использования пользовательского элемента

Скомпилируем нашу библиотеку. Если нужно что-то отладить, то Debug, а если всё готово — Release : DialogWindowsFormsControlLibrary.dll. Для проверки работоспособности используем проект из статьи Диалоговое окно ввода цифр кликом мышки, немного доработав его. Добавим в главное окно программы ещё 1 поле метки и 1 поле текстового ввода, для которого добавим функцию обработки события MouseClick. Вид главного окна и код приведен ниже :

рис. 2 Окно, из которого вызовем диалог из DLL
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DialogWindowsFormsControlLibrary;

namespace SimpleNumbersWindows
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private void textBox1_MouseClick(object sender, MouseEventArgs e)
        {
            FormNumEntering fne = new FormNumEntering();
            if (fne.ShowDialog() == DialogResult.OK)
            {
                label1.Text = "Введено число : " + fne.s_num;
                textBox1.Text = fne.s_num;
            }
        }

        private void textBox2_MouseClick(object sender, MouseEventArgs e)
        {
            ProbaUFForm pf = new ProbaUFForm();
            if (pf.ShowDialog()==DialogResult.OK)
            {
                label1.Text = "Число из DLL формы: " + pf.ZN_num;
                textBox2.Text = pf.ZN_num;
            }
        }
    }
}

Чтобы использовать пользовательский элемент управления из нашей библиотеки нужно подключить ссылку на неё в список ссылок приложения, как показано на рис. 3 ниже :

рис. 3 Добавление ссылки на библиотеку в проект.

После этого в списке «Панели элементов» появится наш пользовательский элемент, который добавим на пустую форму в конструкторе перетащив как любой стандартный элемент. Вид полученной формы приведен на рис. 4 ниже :

рис. 4 Добавление пользовательского элемента на форму

Диалог «ProbaUFForm» будем вызывать по клику во втором поле ввода. В его коде в список директив добавим ссылку на пространство имен нашей библиотеки

using DialogWindowsFormsControlLibrary;

Передача значений из пользовательского элемента в основное окно приложения

Есть одна проблема — нужно передать значение вводимого числа из пользовательского элемента в главную форму. Добавим свойство public string ZN_num в ProbaUFForm.cs, через которое будем обращаться к переменной s_num нашего пользовательского элемента, класс которого добавлен с модификатором private в ProbaUFForm.Designer.cs :

private DialogWindowsFormsControlLibrary.UserNumberEnteringForm userNumberEnteringForm1;

Код класса ProbaUFForm.cs :

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using DialogWindowsFormsControlLibrary;

namespace SimpleNumbersWindows
{
    public partial class ProbaUFForm : Form
    {
        public string ZN_num
        {
            get { return userNumberEnteringForm1.s_num; }
            set { userNumberEnteringForm1.s_num = value; }
        }

        public ProbaUFForm()
        {
            InitializeComponent();
        }
    }
}

Тестируем наш элемент

Всё готово. Скомпилируем и запустим наш тестовый проект. Кликнем мышкой в нижнем поле ввода и в появившемся окне графического цифрового ввода наберем кликами мышки любое число :

рис. 5 Графический ввод числа

После клика по кнопке «OK», в главном окне будет отображено наше число в соответствии с написанной нами логикой использования введённого числа :

рис. 6 Результат ввода показан в главном окне

Одна библиотека пользовательских элементов управления может содержать несколько пользовательских элементов. Такие элементы объединяет единый стиль и направленность в конкретной области применения. Об этом и не только читайте в статье Пользовательский элемент управления. В общем-то всё оказалось не так и сложно !

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *