- PR -

[VS.NET2005][C#]TextBoxを継承したコントロールで・・・

1
投稿者投稿内容
ベテラン
会議室デビュー日: 2005/05/16
投稿数: 85
お住まい・勤務地: 千葉県在住
投稿日時: 2007-02-07 19:09
【環境】
OS:WindowsXPPro
VS:VS.NET2005
言語:C#
AP:Windowsアプリ

TextBoxコントロールを継承して、Enabled=false時のForeColorとBackColorを書き換えるようなコントロールを作成しました。
コード:
public class MyTextBox : System.Windows.Forms.TextBox
{
    public MyTextBox() : base()
    {
    }

    private Color _disableBackColor = System.Drawing.SystemColors.Window;
    [Category("表示"), Description("コンポーネントの使用不可時の背景色です。")]
    public Color DisableBackColor
    {
        get { return _disableBackColor; }
        set { _disableBackColor = value; }
    }

    private Color _disableForeColor = System.Drawing.SystemColors.WindowText;
    [Category("表示"), Description("テキストを表示するのに使用される、このコンポーネントの使用不可時の前景色です。")]
    public Color DisableForeColor
    {
        get { return _disableForeColor; }
        set { _disableForeColor = value; }
    }

    protected override void OnEnabledChanged(EventArgs e)
    {
        base.SetStyle(ControlStyles.UserPaint, !this.Enabled);
        base.OnEnabledChanged(e);
    }

    protected override void OnPaintBackground(PaintEventArgs pevent)
    {
        base.OnPaintBackground(pevent);
        pevent.Graphics.FillRectangle(new SolidBrush(this.DisableBackColor), 0, 0, this.Width - 1, this.Height - 1);
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        int w = base.Width;
        int h = base.Height;

        base.OnPaint(e);

        TextFormatFlags tff = TextFormatFlags.Default;
        switch (base.TextAlign)
        {
            case HorizontalAlignment.Center:
                tff |= TextFormatFlags.HorizontalCenter;
                break;
            case HorizontalAlignment.Left:
                tff |= TextFormatFlags.Left;
                break;
            case HorizontalAlignment.Right:
                tff |= TextFormatFlags.Right;
                break;
        }
        TextRenderer.DrawText(e.Graphics, base.Text, base.Font, new Rectangle(-1, 1, w -1, h), this.DisableForeColor, tff);
    }
}



これで、色については問題なく解決できたのですが、この拡張TextBoxコントロールをFormに貼り付け、デザイナ上で「Enabled=false」「TextAlign=Center」にして実行した後に、「Enabled=true」へプロパティを動的に変更すると、何故かフォントサイズが見た目だけ大きくなってしまいました。
クイックウォッチなどで確認しても、実際にFontプロパティは変わっていません。

あと少しというところで、このような「バグ?」と思われる壁にぶつかるなんて・・・

何方か、このような現象の回避方法をご存知ではないでしょうか?
ご存知の方、是非ご教授願います。
うにくま
ベテラン
会議室デビュー日: 2005/11/05
投稿数: 82
投稿日時: 2007-02-08 01:33
詳しく調べていませんが、たぶんスタイル変更のタイミングの問題で、
コントロールの再作成をしなければならないのだと思います。
コード:
base.SetStyle(ControlStyles.UserPaint, !this.Enabled);
base.OnEnabledChanged(e);


を以下のように記述すれば、期待する結果が得られると思います。
コード:
base.SetStyle(ControlStyles.UserPaint, !this.Enabled);
base.RecreateHandle();
base.OnEnabledChanged(e);

ベテラン
会議室デビュー日: 2005/05/16
投稿数: 85
お住まい・勤務地: 千葉県在住
投稿日時: 2007-02-08 08:12
うにくまさん、こんにちは。

ご指示の通り「base.RecreateHandle();」を追記したら、思い通りの描画になりました!
本当に有難うございますm(_ _)m
1

スキルアップ/キャリアアップ(JOB@IT)