When a ToolStripItem is disabled, among other UI changes is that it's Text and Image is greyed out and changes to ForeColor are ignored.
I need to override one the event responsible for painting the toolstrip items.
i use my own custom toolstrip but I don't see the solution to integrate it.
I would like to be able to change the ForeColor Text and Image even when Enabled = false.
public class MyMenuRenderer : ToolStripRenderer
{
protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)
{
base.OnRenderMenuItemBackground(e);
if (e.Item.Enabled)
{
if (e.Item.IsOnDropDown == false && e.Item.Selected)
{
var rect = new Rectangle(0, 0, e.Item.Width - 1, e.Item.Height - 1);
var rect2 = new Rectangle(0, 0, e.Item.Width - 1, e.Item.Height - 1);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(17, 23, 43)), rect);
e.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.Black)), rect2);
e.Item.ForeColor = Color.White;
}
else
{
e.Item.ForeColor = Color.White;
}
if (e.Item.IsOnDropDown && e.Item.Selected)
{
var rect = new Rectangle(0, 0, e.Item.Width - 1, e.Item.Height - 1);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(47, 50, 65)), rect);
e.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.Black)), rect);
e.Item.ForeColor = Color.White;
}
if ((e.Item as ToolStripMenuItem).DropDown.Visible && e.Item.IsOnDropDown == false)
{
var rect = new Rectangle(0, 0, e.Item.Width - 1, e.Item.Height - 1);
var rect2 = new Rectangle(0, 0, e.Item.Width - 1, e.Item.Height - 1);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(8, 11, 26)), rect);
e.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.Black)), rect2);
e.Item.ForeColor = Color.White;
}
}
}
protected override void OnRenderSeparator(ToolStripSeparatorRenderEventArgs e)
{
base.OnRenderSeparator(e);
var DarkLine = new SolidBrush(Color.Black);
var rect = new Rectangle(30, 3, e.Item.Width - 30, 1);
e.Graphics.FillRectangle(DarkLine, rect);
}
protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e)
{
base.OnRenderItemCheck(e);
if (e.Item.Selected)
{
var rect = new Rectangle(4, 2, 16, 16);
var rect2 = new Rectangle(5, 3, 14, 14);
SolidBrush b = new SolidBrush(Color.FromArgb(8, 11, 26));
SolidBrush b2 = new SolidBrush(Color.FromArgb(67, 139, 242));
e.Graphics.FillRectangle(b, rect);
e.Graphics.FillRectangle(b2, rect2);
e.Graphics.DrawImage(e.Image, new Point(4, 3));
}
else
{
var rect = new Rectangle(4, 2, 16, 16);
var rect2 = new Rectangle(5, 3, 14, 14);
SolidBrush b = new SolidBrush(Color.FromArgb(8, 11, 26));
//SolidBrush b2 = new SolidBrush(Color.FromArgb(20, 115, 177));
SolidBrush b2 = new SolidBrush(Color.FromArgb(67, 139, 242));
e.Graphics.FillRectangle(b, rect);
e.Graphics.FillRectangle(b2, rect2);
e.Graphics.DrawImage(e.Image, new Point(4, 3));
}
}
protected override void OnRenderImageMargin(ToolStripRenderEventArgs e)
{
base.OnRenderImageMargin(e);
var rect = new Rectangle(0, 0, e.ToolStrip.Width, e.ToolStrip.Height);
e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(8, 11, 26)), rect);
var DarkLine = new SolidBrush(Color.FromArgb(8, 11, 26));
var rect3 = new Rectangle(0, 0, 26, e.AffectedBounds.Height);
e.Graphics.FillRectangle(DarkLine, rect3);
e.Graphics.DrawLine(new Pen(new SolidBrush(Color.FromArgb(8, 11, 26))), 28, 0, 28, e.AffectedBounds.Height);
var rect2 = new Rectangle(0, 0, e.ToolStrip.Width - 1, e.ToolStrip.Height - 1);
e.Graphics.DrawRectangle(new Pen(new SolidBrush(Color.Black)), rect2);
}
}
The strips are nested-multipart controls, each of which is being painted by a dedicated method and can be handled by a dedicated event. So, no such one method/event is responsible for drawing the whole thing. You already have overridden some methods in your code snippet.
To override the default style of the disabled items, you need to override the
OnRenderItemTextandOnRenderItemImagemethods to prevent calling the base methods and draw the parts as you like. I'll derive the renderer here from theToolStripProfessionalRendererderived class instead to use a customProfessionalColorTablein order to reduce the rendering code. You'll get the same result by just overriding the relevant properties.The ColorTable
As I understand your code snippet:
See the other virtual properties.
The Renderer
See the other methods and events.
Use the Renderer