【C#】【Form】カスタムコントロール

■ はじめに

https://blogs.yahoo.co.jp/dk521123/21165720.html
でユーザコントロールを作成したが、
今回は既存のコントロールを継承するカスタムコントロールについて調べる

■ 作成および使用方法

【1】 既存のコントロールを継承する

public class CustomTextBox : TextBox // TextBoxを継承する

【2】 自分好みにプログラミングする

 * 以下サンプルを参照のこと

【3】 ソリューションのビルドをする

 * ツールボックスに歯車型のコンポーネントが追加されるので、
   これをフォームにドラッグ&ドロップ!

■ サンプル

 * 表示しきれないPathの場合、"..."を表示する

CustomTextBox.cs

public class CustomTextBox : TextBox
{
    public CustomTextBox()
    {
        this.TextChanged += new EventHandler(CustomTextBox_TextChanged);
        this.Leave += new EventHandler(CustomTextBox_Leave);
    }

    private void CustomTextBox_TextChanged(object sender, EventArgs e)
    {
        this.PathEllipsis(this.Text, this.Font, this.Size);
    }

    private void CustomTextBox_Leave(object sender, EventArgs e)
    {
        this.Text = this.PathEllipsis(this.Text, this.Font, this.Size);
    }

    private string PathEllipsis(string text, Font font, Size size)
    {
        TextRenderer.MeasureText(
            text,
            font,
            size,
            TextFormatFlags.PathEllipsis | TextFormatFlags.ModifyString);

        return text;
    }
}
参考資料
http://www.codeproject.com/KB/vb/NewPathCompactPath.aspx
http://dobon.net/vb/dotnet/graphics/stringtrimming.html

■ プロパティを追加したい場合

[Category("表示")]
[DefaultValue(typeof(Color), "DarkGray")]
[Description("説明文")]
[RefreshProperties(RefreshProperties.Repaint)]
public Color CustomBackColor
{
    get
    {
        return this.CustomBackColor;
    }
    
    set
    {
        this.CustomBackColor = value;
    }
}

■ イベントを修正したい場合

protected override void OnEnter(EventArgs e)
{
    if (string.IsNullOrEmpty(this.Text))
    {
        base.BackColor = this.CustomBackColor;
    }

    base.OnEnter(e);
}