Написал собственный текстбокс контрол GoodTextBox, у которого есть:
Border: граница определенной толщины и цвета
Padding: расстояние от Border до тамого текста
TextBox: собственно обычный текстбокс, где находится сам текст
Все работает прекрасно за исключением вот чего: когда я меняю цвет Border'а, то он не перерисовывается, хотя событие Paint вызывается.
Изменение и перерисовку я выполняю в set { bordercolor = value; GoodTextBox_Resize(this, new EventArgs()); }
Помогите плиз, что не так?
GoodTextBox.Designer.cs:
namespace GoodTextBox
{
partial class GoodTextBox
{
public delegate void BorderChangedEventHandler(object sender, System.EventArgs e);
public event BorderChangedEventHandler BorderChanged;
/// <summary>
/// Требуется переменная конструктора.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Освободить все используемые ресурсы.
/// </summary>
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Код, автоматически созданный конструктором компонентов
/// <summary>
/// Обязательный метод для поддержки конструктора - не изменяйте
/// содержимое данного метода при помощи редактора кода.
/// </summary>
private void InitializeComponent()
{
this.SuspendLayout();
//
// GoodTextBox
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Margin = new System.Windows.Forms.Padding(0);
this.Name = "GoodTextBox";
this.Size = new System.Drawing.Size(156, 40);
this.Paint += new System.Windows.Forms.PaintEventHandler(this.GoodTextBox_Paint);
this.Resize += new System.EventHandler(this.GoodTextBox_Resize);
this.ResumeLayout(false);
}
#endregion
}
}
GoodTxtBox.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace GoodTextBox
{
public partial class GoodTextBox : UserControl
{
private int bordersize;
public int BorderSize
{
get { return bordersize;}
set { bordersize = value; GoodTextBox_Resize(this, new EventArgs()); }
}
private Color bordercolor;
public Color BorderColor
{
get { return bordercolor; }
set { bordercolor = value; GoodTextBox_Resize(this, new EventArgs()); }
}
private bool multiline;
public bool Multiline
{
get { return multiline; }
set { multiline = value; }
}
public override string Text
{
get { return textBox.Text; }
set { textBox.Text = value; }
}
TextBox textBox = new TextBox();
public GoodTextBox()
{
Multiline = false;
BorderColor = Color.Red;
BorderSize = 2;
this.Paint += new PaintEventHandler(GoodTextBox_Paint);
this.Resize += new EventHandler(GoodTextBox_Resize);
this.PaddingChanged += new EventHandler(GoodTextBox_PaddingChanged);
textBox.Multiline = Multiline;
textBox.BorderSt yle = BorderStyle.None;
this.Controls.Add(textBox);
}
private void GoodTextBox_Resize(object sender, EventArgs e)
{
if (!Multiline)
{
Size hh = new Size(ClientSize.Width, textBox.Font.Height + Padding.Bottom + Padding.Top + BorderSize*2);
this.ClientSize = hh;
}
textBox.Size = new Size(this.Width - this.Padding.Left - this.Padding.Right - BorderSize * 2, this.Height - BorderSize * 2 - this.Padding.Top - this.Padding.Bottom);
textBox.Location = new Point(this.Padding.Left + bordersize, this.Padding.Top + bordersize);
}
private void GoodTextBox_Paint(object sender, PaintEventArgs e)
{
MessageBox.Show(bordercolor.ToString());
ControlPaint.DrawBorder(e.Graphics, ClientRectangle, BorderColor, bordersize, ButtonBorderStyle.Solid, BorderColor, bordersize, ButtonBorderStyle.Solid, BorderColor, bordersize, ButtonBorderStyle.Solid, BorderColor, bordersize, ButtonBorderStyle.Solid);
}
private void GoodTextBox_PaddingChanged(object sender, EventArgs e)
{
GoodTextBox_Resize(sender, e);
}
}
}