Top / .NET備忘録 / 04.最難関!ComboBox / 06.前景色と背景色

ここで登場するのが、TextBox の冒頭で取り上げた、WM_ENABLE を握りつぶす方法。

        // Enabled = false のメッセージは握りつぶす
        case WM_ENABLE:
            if (m.WParam != IntPtr.Zero)
                base.WndProc(ref m);
            break;
VBComboBox3.gif

これで背景色は白いままですが、前景色がグレーアウトしてくれません。
また、ドロップダウンボタンの色も変わりません。

そこで、ForeColor プロパティを制御することにします。

プロパティの返却値は、セットした値と変えるべきではないので、変数を用意し、その値を返します。

    Color m_ForeColor = Color.Empty;
    Color m_DefaultForeColor = SystemColors.WindowText;

色の決定をするルーチンを作成します。
このルーチンを Enabled プロパティか ForeColor プロパティが変更されたときに呼び出します。

    private void DecidesColor()
    {
        if (base.Enabled)
            if (m_ForeColor.IsEmpty)
                base.ForeColor = m_DefaultForeColor;
            else
                base.ForeColor = m_ForeColor;
        else
            base.ForeColor = SystemColors.GrayText;
    }

ForeColor プロパティは new します。

    [DefaultValue(typeof(Color), "WindowText")]
    public new Color ForeColor
    {
        get
        {
            if (m_ForeColor.IsEmpty)
                return m_DefaultForeColor;
            else
                return m_ForeColor;
        }
        set
        {
            if (m_ForeColor != value)
            {
                m_ForeColor = value;
                DecidesColor();
                OnForeColorChanged(EventArgs.Empty);
            }
        }
    }
 
    public new event EventHandler ForeColorChanged;
 
    protected new virtual void OnForeColorChanged(EventArgs e)
    {
        if (ForeColorChanged != null) ForeColorChanged(this, e);
    }

Enabled プロパティの変更は、OnEnabledChanged をオーバーライドして検出します。

    protected override void OnEnabledChanged(EventArgs e)
    {
        base.OnEnabledChanged(e);
        DecidesColor();
    }

めでたく前景色がグレーになりました。

VBComboBox4.gif



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