Top / .NET備忘録 / 01.TextBox / 01.背景色

VB6.0 をVB.NET に移行して、最初に「えっ」と思うのは、TextBox の見た目かと思います。
Enabled プロパティを False にすると、背景がグレー化してしまう。(T_T)
なので、TextBox を継承した部品を作ることにしました。

まずやってみたのは、WndProc をオーバーライドして、WM_ENABLE を殺したこと。

[DebuggerStepThrough]
protected override void WndProc(ref Message m)
{
    const int WM_ENABLE = 0x000A;

    switch (m.Msg)
    {
        case WM_ENABLE:
            if (m.WParam != IntPtr.Zero)
                base.WndProc(ref m);
            break;

        default:
            base.WndProc(ref m);
            break;
    }
}

これでもいいのですが、こんどは文字がグレー化してくれません。
なので、この方法はとりあえず置いておきます。

実は.NET のコントロールは、内部的に持っている色と、ForeColor/BackColor が返す色が違っています。

貼り付けただけの状態では、内部的な色は Color.Empty になっていて、親コントロールの色を継承するようになっています。 (TextBox や、ComboBox 等の入力用コントロールの背景色などは例外)

TextBox の場合は、内部的な色が Color.Empty のとき、背景色を切り替えているようです。

なので、これを解消してやればよいことになります。
コンストラクタで、デフォルト色を代入します。

public class VBTextBox : TextBox
{
    public VBTextBox()
    {
        base.BackColor = SystemColors.Window; 
    }
 }

プロパティウインドウがちょっと気になるので、BackColor プロパティのデフォルト値を変更します。

[DefaultValue(typeof(Color), "Window")]  
public override Color BackColor
{
    get { return base.BackColor; }
    set { base.BackColor = value; }
}

この時点での全ソースです。

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
 
namespace VB6Control
{
    public class VBTextBox : TextBox
    {
        public VBTextBox()
        {
            base.BackColor = SystemColors.Window; 
        }
 
        [DefaultValue(typeof(Color), "Window")]  
        public override Color BackColor
        {
            get { return base.BackColor; }
            set { base.BackColor = value; }
        }
    }
}

このままでは、ForeColor が親コントロールの色を引き継ぐので、完全に VB6.0 互換を目指すなら、ForeColor も同様にし、Enabled プロパティが変わったときに ForeColor を制御する必要があります。




トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2013-03-05 (火) 23:34:04 (1625d)