How to set/change/remove focus style on a Button in C#?

后端 未结 12 1130
鱼传尺愫
鱼传尺愫 2020-11-28 08:39

I have a couple of buttons of which I modified how they look. I have set them as flat buttons with a background and a custom border so they look all pretty and nothing like

12条回答
  •  旧巷少年郎
    2020-11-28 09:09

    I had the same issue with the annoying double border, and stumbled across this thread looking for an answer...

    The way I solved this was to set the BorderSize to 0 then draw my own border in OnPaint

    *Note: Not the entire button, just the border

    A simple example would be:

    public class CustomButton : Button
    {
        public CustomButton()
            : base()
        {
            // Prevent the button from drawing its own border
            FlatAppearance.BorderSize = 0;
            FlatStyle = System.Windows.Forms.FlatStyle.Flat;
        }
    
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
    
            // Draw Border using color specified in Flat Appearance
            Pen pen = new Pen(FlatAppearance.BorderColor, 1);
            Rectangle rectangle = new Rectangle(0, 0, Size.Width - 1, Size.Height - 1);
            e.Graphics.DrawRectangle(pen, rectangle);
        }
    }
    

    In my case, this is how I made a button that mimics a ToolStripButton, where the border is only visible when you hover over the button:

    public class ToolButton : Button
    {
        private bool ShowBorder { get; set; }
    
        public ToolButton()
            : base()
        {
            // Prevent the button from drawing its own border
            FlatAppearance.BorderSize = 0;
    
            // Set up a blue border and back colors for the button
            FlatAppearance.BorderColor = Color.FromArgb(51, 153, 255);
            FlatAppearance.CheckedBackColor = Color.FromArgb(153, 204, 255);
            FlatAppearance.MouseDownBackColor = Color.FromArgb(153, 204, 255);
            FlatAppearance.MouseOverBackColor = Color.FromArgb(194, 224, 255);
            FlatStyle = System.Windows.Forms.FlatStyle.Flat;
    
            // Set the size for the button to be the same as a ToolStripButton
            Size = new System.Drawing.Size(23, 22);
        }
    
        protected override void OnMouseEnter(EventArgs e)
        {
            base.OnMouseEnter(e);
    
            // Show the border when you hover over the button
            ShowBorder = true;
        }
    
        protected override void OnMouseLeave(EventArgs e)
        {
            base.OnMouseLeave(e);
    
            // Hide the border when you leave the button
            ShowBorder = false;
        }
    
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
    
            // The DesignMode check here causes the border to always draw in the Designer
            // This makes it easier to place your button
            if (DesignMode || ShowBorder)
            {
                Pen pen = new Pen(FlatAppearance.BorderColor, 1);
                Rectangle rectangle = new Rectangle(0, 0, Size.Width - 1, Size.Height - 1);
                e.Graphics.DrawRectangle(pen, rectangle);
            }
        }
    
    
    
        // Prevent Text from being set on the button (since it will be an icon)
        [Browsable(false)]
        public override string Text { get { return ""; } set { base.Text = ""; } }
    
        [Browsable(false)]
        public override ContentAlignment TextAlign { get { return base.TextAlign; } set { base.TextAlign = value; } }
    }
    

提交回复
热议问题