Собственный контрол. Неправильно отрисовывается Border
От: RaFor  
Дата: 10.01.12 15:23
Оценка:
Написал собственный текстбокс контрол 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);
        }
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.