В статье Диалоговое окно ввода цифр кликом мышки описано как внедрить в свой проект графический ввод чисел кликом мыши. Давайте перенесём код этой формы в пользовательский элемент управления. Библиотека пользовательских элементов управления облегчает их повторное использование. В такую библиотеку и разместим наш элемент.
Библиотека пользовательских элементов управления : Содержание
- Разбираем код класса
- Пример использования пользовательского элемента
- Передача значений из пользовательского элемента в основное окно приложения
- Тестируем наш элемент
Создадим новый проект для библиотеки по шаблону «Библиотека элементов управления Windows Forms ( .NET Framework )» и назовём, например, DialogWindowsFormsControlLibrary. В открывшемся окне конструктора создадим наш собственный элемент управления из стандартных элементов или добавим элемент отображения картинки PictureBox и нарисуем в нем что-то своё, а функционал добавим обработкой событий. Для этого примера я скопировал набор элементов диалогового окна ввода цифр :
Разбираем код класса
Имя данного по умолчанию класса 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. Вид главного окна и код приведен ниже :
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 ниже :
После этого в списке «Панели элементов» появится наш пользовательский элемент, который добавим на пустую форму в конструкторе перетащив как любой стандартный элемент. Вид полученной формы приведен на рис. 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();
}
}
}
Тестируем наш элемент
Всё готово. Скомпилируем и запустим наш тестовый проект. Кликнем мышкой в нижнем поле ввода и в появившемся окне графического цифрового ввода наберем кликами мышки любое число :
После клика по кнопке «OK», в главном окне будет отображено наше число в соответствии с написанной нами логикой использования введённого числа :
Одна библиотека пользовательских элементов управления может содержать несколько пользовательских элементов. Такие элементы объединяет единый стиль и направленность в конкретной области применения. Об этом и не только читайте в статье Пользовательский элемент управления. В общем-то всё оказалось не так и сложно !
2 комментария
Оставить комментарий