I’m here to ask for help or suggestions. I’m creating a custom menu with a darker color. Almost everything is fine. The only thing I don’t understand is why the first MenuItem
has a default backcolor. The thing is the second one has the correct color. I don’t know if I’m missing something, like, the first one gets the set color at launch or what.
I tried my code on a test project where the strip has a default red color and on Form_Load
I change it. They both work perfectly. This is the code I’m using
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
menuStrip1.Renderer = new SkinRenderer(new MenuColorTable());
}
class MenuColorTable : ProfessionalColorTable
{
public MenuColorTable()
{
base.UseSystemColors = false;
}
public override Color MenuItemSelectedGradientBegin
{
get { return Color.FromArgb(12, 46, 73); }
}
public override Color MenuItemSelectedGradientEnd
{
get { return Color.FromArgb(12, 46, 73); }
}
public override Color MenuItemPressedGradientBegin
{
get { return Color.FromArgb(6, 6, 6); }
}
public override Color MenuItemPressedGradientMiddle
{
get { return Color.FromArgb(6, 6, 6); }
}
public override Color MenuItemPressedGradientEnd
{
get { return Color.FromArgb(6, 6, 6); }
}
public override Color MenuBorder
{
get { return Color.FromArgb(127, 127, 127); }
}
public override Color ToolStripDropDownBackground
{
get { return Color.FromArgb(2, 2, 2); }
}
public override Color ImageMarginGradientBegin
{
get { return Color.FromArgb(10, 10, 10); }
}
public override Color ImageMarginGradientMiddle
{
get { return Color.FromArgb(10, 10, 10); }
}
public override Color ImageMarginGradientEnd
{
get { return Color.FromArgb(10, 10, 10); }
}
public override System.Drawing.Color MenuItemBorder
{
get { return Color.FromArgb(40, 158, 255); }
}
public override Color MenuItemSelected
{
get { return Color.FromArgb(12, 46, 73); ; }
}
}
private class SkinRenderer : ToolStripProfessionalRenderer
{
private SkinRenderer() : base() { }
public SkinRenderer(MenuColorTable colorTable) : base(colorTable) => Console.WriteLine("test");
protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e)
{
e.TextColor = Color.FromArgb(220, 220, 220); ;
TextRenderer.DrawText(e.Graphics, e.Text, e.TextFont, e.TextRectangle, e.TextColor, e.TextFormat);
}
protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e)
{
ToolStripMenuItem item = e.Item as ToolStripMenuItem;
if (item != null) { e.ArrowColor = Color.FromArgb(220, 220, 220); }
base.OnRenderArrow(e);
}
}
private void Form1_Load(object sender, EventArgs e)
{
menuStrip1.BackColor = Color.FromArgb(30, 30, 30);
}
}
}
I thought there was something in my code causing this behaviour but I’m not sure. I mean, it’s true at launch the strip has a default color and during the load event I change that color, but why the first item stays default white and the second instead becomes the same color as the strip as it should? Any ideas?