Flashing ToolStripButton

1.9k views Asked by At

I am using a ToolStrip with a number of ToolStripButtons.

What I would like is to be able to flash one of the buttons to get the user's attention.

For example, if they have made changes to information and need to click the Save button.

If this were a normal button I could do this using a Timer and periodically changing the BackColor however this doesn't work with a ToolStrip.

I could create a Renderer subclass and assign it to the ToolStrip but this appears to only get used in specific situations - i.e. it's event driven.

Does anyone have any ideas?

1

There are 1 answers

0
Hans Passant On BEST ANSWER

Well, just use a custom renderer so you can change the color of the button's background. With a timer that blinks it. Add a new class to your project and paste this code:

using System;
using System.Drawing;
using System.Collections.Generic;
using System.Windows.Forms;

class BlinkingButtonRenderer : ToolStripProfessionalRenderer {
    public BlinkingButtonRenderer(ToolStrip strip) {
        this.strip = strip;
        this.strip.Renderer = this;
        this.strip.Disposed += new EventHandler(strip_Disposed);
        this.blinkTimer = new Timer { Interval = 500 };
        this.blinkTimer.Tick += delegate { blink = !blink; strip.Invalidate(); };
    }

    public void BlinkButton(ToolStripButton button, bool enable) {
        if (!enable) blinkButtons.Remove(button);
        else blinkButtons.Add(button);
        blinkTimer.Enabled = blinkButtons.Count > 0;
        strip.Invalidate();
    }

    protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e) {
        var btn = e.Item as ToolStripButton;
        if (blink && btn != null && blinkButtons.Contains(btn)) {
            Rectangle bounds = new Rectangle(Point.Empty, e.Item.Size);
            e.Graphics.FillRectangle(Brushes.Black, bounds);
        }
        else base.OnRenderButtonBackground(e);
    }

    private void strip_Disposed(object sender, EventArgs e) {
        blinkTimer.Dispose();
    }

    private List<ToolStripItem> blinkButtons = new List<ToolStripItem>();
    private bool blink;
    private Timer blinkTimer;
    private ToolStrip strip;
}

Sample usage in a form with a Toolstrip containing a button:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        blinker = new BlinkingButtonRenderer(toolStrip1);
    }
    private void toolStripButton1_Click(object sender, EventArgs e) {
        blink = !blink;
        blinker.BlinkButton(toolStripButton1, blink);
    }
    private bool blink;
    private BlinkingButtonRenderer blinker;
}