none
ButtonのBackColor、ForeColorの両方を変更したときに使用不可能色に変わらない RRS feed

  • 質問

  • 以下の手順のとき、文字の色がグレーに変わりません。

     

    1.ButtonのBackColor、ForeColorの両方を変更

    2.Enabled = False

     

    自力で描画する方法もあるかと思いますが、ボタンにはOnPaintがなくOnPaintBackGroundによる描画ということになるため、うまくいかないような気がします。

     

    フォームの色を変えたシステムを構築しているため、背景色に沿ったボタンの色にしたいのですが・・・。

     

    どなたか情報お持ちの方いらっしゃいませんでしょうか?

     

    使用環境:.net 2.0 + C#

    2007年6月12日 11:28

回答

  • OnPaintで実現しかないと思います。

    Code Snippet

     private void button1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
      {
       if (!button1.Enabled)
       {
        //calculate the text position
        int x=0, y=0;
        Size s = e.Graphics.MeasureString(button1.Text, button1.Font).ToSize();
        x = (button1.Width - s.Width) / 2;
        y = (button1.Height - s.Height) / 2;

       

       //paint background area of the button
        e.Graphics.FillRectangle(new SolidBrush(button1.BackColor), 3, 3, button1.Width - 6, button1.Height - 6);

       

       //draw text
        e.Graphics.DrawString(button1.Text, button1.Font, new SolidBrush(Color.Blue), x, y);
       }
      }

     

    2007年6月20日 7:37

すべての返信

  •  こんばんは、EnabledChangedイベントを利用してはいかがでしょうか。

     継承しても良さそうですね。

     

    private void textBox1_EnabledChanged(object sender, EventArgs e) {
          if (textBox1.Enabled) {
            textBox1.BackColor = Color.Cornsilk;
          }
          else {
            textBox1.BackColor = textBox1.Parent.BackColor;
          }
        }

     

    2007年6月12日 12:36
  •  済みませんボタンでしたね。

     ボタンでも同様のコードで動作しました。

     

    2007年6月12日 12:42
  • 回答ありがとうございました。

    EnableChangedイベントを使用したのですが、思う通りに行きません。

    もう一度現象を整理させていただきます。

     

    ・ボタンのForeColor、BackColorを画面イメージに合うように色を変更して使用したい。(具体的には青系統の色)

    ・ボタンのForeColorを変更している状態でEnabled=Falseを変更すると、文字の色が使用不可能色に変わらない。

    ・ForeColor、BackColorを変更していなければ、Enabled=Falseにしたときに文字の色は使用不可能色に自動的に変更される。

    ・EnableChangedイベントを使用して、Enabled=Falseの時は文字の色をシステムカラーに変更すれば文字の色が使用不可能色に変更されると考えたが、EnableChangedイベントでは文字の色は変更されなかった。

     

    これを踏まえて再度検証してみたところ、以下の結果になりました。

     

    ■Enable = true のとき

     

     BackColor、ForeColor共に指定した色になる。

     

    ■Enabled = falseのとき

     

     BackColorは指定した色の使用不可能色となる。

     ForeColorは指定しても無視される。BackColorの濃度を濃くした色に変更される。

     

     たとえば、以下のコードを実行した場合、Enabled = falseのときは、ForeColor、BackColorともに白にしているため

     文字は見えなくなるはずだが、実際には灰色で表示される。(継承したコントロールを使用しているため、baseの色

     を変更しています。)

     

     

    Code Snippet

    private void Button_EnabledChanged(object sender, EventArgs e)
            {
                if (this.Enabled)
                {
                    base.ForeColor = Color.FromArgb(21, 66, 139);
                    base.BackColor = Color.FromArgb(244, 248, 253);
                }
                else
                {
                    base.ForeColor = Color.White;
                    base.BackColor = Color.White;
                   
                }

            }

     

    Enabled = falseのときに、

    base.BackColor = System.Drawing.SystemColors.ButtonFace;

    とすると、デフォルトの使用不可能色にはなるのですが、フォームの色から非常に浮いてしまいます。

    (フォームの色も変更していますので。)

     

    これはもう仕方ないのかもしれませんが・・・。

    できればBackColorを244, 248, 253に設定してEnabled = falseにしても、違和感のない文字の色に変更したいです。

    どなたかよい方法ありましたらご教示ください。

     

    2007年6月20日 1:21
  • OnPaintで実現しかないと思います。

    Code Snippet

     private void button1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
      {
       if (!button1.Enabled)
       {
        //calculate the text position
        int x=0, y=0;
        Size s = e.Graphics.MeasureString(button1.Text, button1.Font).ToSize();
        x = (button1.Width - s.Width) / 2;
        y = (button1.Height - s.Height) / 2;

       

       //paint background area of the button
        e.Graphics.FillRectangle(new SolidBrush(button1.BackColor), 3, 3, button1.Width - 6, button1.Height - 6);

       

       //draw text
        e.Graphics.DrawString(button1.Text, button1.Font, new SolidBrush(Color.Blue), x, y);
       }
      }

     

    2007年6月20日 7:37