1

フォームに2つのボタンがあります。どちらも背景画像があり、フラットスタイルは「フラット」です。

  1. キーをクリックするTABと、ボタンにフォーカスがあるときに、ボタンに点線の境界線を付けたいので、実線の境界線ではなく、内側に単色の長方形が表示されます。

  2. ボタンがクリックされると、いくつかのアクティビティが実行され、ボタンが無効になります。無効にすると、ボタンのテキストの色が灰色に変わります。テキストの色を変えたくありません。これはWindowsの標準的な動作だと思いますが、ボタンが選択されたときにテキストの色を変更しないようにするにはどうすればよいですか?

これらのポイントを設定するためのプロパティが見つかりません。目標を達成するために私は何をすべきか。どんな助けでも大歓迎です。

カスタムボタンも作成しましたが、上記の問題を取り除くことができません。

私のカスタムボタンのペイント方法:

   public partial class MyButton : Button  {

    protected override void OnPaint(PaintEventArgs pevent)
    {
        base.OnPaint(pevent);
        // Set custom fore color    
        base.ForeColor = Color.FromArgb(0, 255, 254, 255);    

        // set the same forecolor even if the button is disabled  
        if (base.Enabled == false)
        {
            base.ForeColor = Color.FromArgb(0, 255, 254, 255);
        }

    }  //OnPaint method ends
  }  // class ends

(1)と(2)のソリューションを更新 しましたonpaint()に以下を追加しました:

    private void init()
    {
        base.ForeColor = Color.FromArgb(0, 255, 254, 255);
        base.FlatAppearance.BorderColor = Color.FromArgb(0, 255, 255, 254);   // Transparent border
    }

    protected override void OnPaint(PaintEventArgs pevent)
    {
        base.OnPaint(pevent);

        if (base.ContainsFocus)
        {
            // Draw inner dotted rectangle when button is on focus
            Pen pen = new Pen(Color.Gray, 3);
            Point p = base.Location;
            pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
            Rectangle rectangle = new Rectangle(4, 4, Size.Width - 8, Size.Height - 8);
            ControlPaint.DrawFocusRectangle(pevent.Graphics, rectangle);
        }

        // Draw the string to screen
        SizeF sf = pevent.Graphics.MeasureString(displayText, this.Font, this.Width);
        Point ThePoint = new Point();
        ThePoint.X = (int)((this.Width / 2) - (sf.Width / 2));
        ThePoint.Y = (int)((this.Height / 2) - (sf.Height / 2));
        //pevent.Graphics.DrawString(displayText, Font, new SolidBrush(this.ForeColor), ThePoint);
        //pevent.Graphics.DrawString(displayText, Font, new SolidBrush(Color.FromArgb(0, 255, 254, 255)), ThePoint);
        pevent.Graphics.DrawString(displayText, Font, new SolidBrush(Color.Black), ThePoint);
        //this.Text = "";
     }//OnPaint ends

    // Avoids the inner solid rectangle shown on focus
    protected override bool ShowFocusCues
    {
        get
        {
            return false;
        }
    }

これにより、フォーカスを示す点線がボタンに正常に描画されます。デフォルトの実線を取り除くために、ShowFocusCues()をオーバーライドしました。

これは私が1を完全に解決するのに役立ちました。しかし、ポイント2では、100%の結果が得られません。MyButtonクラスにプロパティ「displayText」を作成しました。OnPaint()で、ForeColor、Color.FromARGBをSolidBrushに指定すると、テキストが表示されません。しかし、Color.Blackを渡すと、それを受け入れ、テキストを黒色で表示します。ForeColorまたはカスタムカラーを受け入れず、デフォルトのカラーのみを受け入れるのはなぜですか?この単純なタスクで、私はまだどこで間違っているのでしょうか。フォームにbutton_paintを実装して同じことを試しましたが、同じ結果が表示されます。

私はまだどこが間違っているのか考えていますか?

4

1 に答える 1

1
     private void button3_Paint(object sender, PaintEventArgs e)
            {

                SolidBrush br = new SolidBrush(Color.Blue);
                Pen pen = new Pen(br);
                pen.Width = 3;
                pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
                  // to draw left border
                e.Graphics.DrawLine(pen, new Point(0, 0), new Point(0, this.button3.Width));
                SolidBrush drawBrush = new SolidBrush(ForeColor); //Use the ForeColor property
                // Draw string to screen.
                e.Graphics.DrawString("Sample", Font, drawBrush, 5f, 3f);
                this.button3.Text = "";
    }
于 2012-05-02T09:15:24.100 に答える