Сегодня ко мне обратился мой клиент с вопросом о переопределении .NET-контрола для создания пользовательского элемента на базе TextBox используя C#.
Человек все самостоятельно реализовал, но возник один тупиковый вопрос, который не давал продвигаться далее. Обычно у меня очень мало времени для рассмотрения вопросов, но как раз был обед и человек, приславший вопрос не требовал помощи, а просил только помочь с поиском ответа.
Ответ я решил быстро накидать в виде статьи.
Но, сперва поглядим, что я получил на имеил:
class Class1:TextBox
{
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Rectangle rect = new Rectangle(
e.ClipRectangle.X,
e.ClipRectangle.Y,
e.ClipRectangle.Width - 1,
e.ClipRectangle.Height - 1);
e.Graphics.DrawRectangle(
new Pen(Color.Chocolate,1),rect);
}
}
Ну что здесь не так, вроде всё как надо - создаем простейший файл с определением пользовательского класса class1 и наследуем от класса System.Windows.Forms.TextBox.
Всё нормально.
Дальше, переопределяем его графическое представление на форме. Для этого переопределяем базовый метод OnPaint. В своем первом курсе я подробно описал ситуации, когда
вызывается событие перерисовки графических визуальных контролов.
Используя объекты System.Windows.Forms.PaintEventArgs и Graphics добиваемся добавления в зоне текстового поля дополнительных цветных линий.
Собрав проект и запустив его, однако, не произошло чуда и линии не появились. Новый TextBox отобразился стандартным образом.
А проблема заключалась лишь в том, что необходимо лишь указать требуемые стили отображения, вызвав метод SetStyle с заданием опции UserPaint:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
namespace WindowsFormsApplication1
{
class MyTextBox : System.Windows.Forms.TextBox
{
public MyTextBox()
{
SetStyle(System.Windows.Forms.ControlStyles.UserPaint,
true);
}
protected override void
OnPaint(System.Windows.Forms.PaintEventArgs e)
{
base.OnPaint(e);
Rectangle rect = new Rectangle(e.ClipRectangle.X,
e.ClipRectangle.Y,
e.ClipRectangle.Width - 1,
e.ClipRectangle.Height - 1);
e.Graphics.DrawRectangle(new Pen(Color.Chocolate, 1),
rect);
}
}
}
Вот какой контрольчик мы получили:
