1
votes

I have 2 Buttons in my form. Both have background image and Flat style is "Flat".

  1. On clicking TAB key, when the focus is on button, I see solid color rectangle inner, instead of solid border I want to have dotted border in the button.

  2. When the button is clicked, some activity is going on and the button is disabled. While disabled, the button text color changes to grey. I don't want it to change the text color. I believe this is windows standard behavior, but how do I not change the text color when the button is selected?

I can't find any properties to set these points. What should I do to achieve the goal. Any help is highly appreciated.

I also created a custom button, but can't get rid of the above issues.

My custom button's paint method :

   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

UPDATED Soluiton for (1) & (2) ADDED the following in 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;
        }
    }

This successfully draws a dotted line in my button indicating for focus. To get rid of the default solid line I overridded ShowFocusCues().

This has helped me solve 1 completely. But with point 2, not getting 100% results. I created a property "displayText" in my MyButton class. In OnPaint(), if I give ForeColor, Color.FromARGB to SolidBrush, it doesn't show up any text. But if I pass Color.Black, then it accepts it and shows the text in Black color. Why is it not accepting the ForeColor, or custom color and only accepting default Colors'? Where am I still going wrong for this simple task. I tried the same by implementing button_paint in the form, but I see same results.

Any idea where am I still going wrong ???

1
Focus is the keyword you're looking for.nothrow
Change Button Text and Border line style and colors in "button3_Paint(object sender, PaintEventArgs e)"Sadaf
@husnain, added paint event for my custom button. For (2) when btn is clicked and activity is going on its Enabled is set to false. But even after the code added, the text color is of gray color only after clicked. REG border line style, I am not aware of how do I change and set it, can you show a snaippet or methods to use. -ThanksTvd
Both of these are part of the standard Button class, as far as I know you can't override this behavior. You will have to create custom button from scratch (inherit from Control rather than Button) and handle everything yourself.Shadow Wizard Is Vaccinated V3
@ShadowWizard, if I inherit from Control, what more do I need to handle ?Tvd

1 Answers

1
votes
     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 = "";
    }