protected override void OnRenderItemImage(ToolStripItemImageRenderEventArgs e)
{
// Is this a min/restore/close pendant button
if (e.Item.GetType().ToString() == "System.Windows.Forms.MdiControlStrip+ControlBoxMenuItem")
{
// Get access to the owning form of the mdi control strip
Form f = e.ToolStrip.Parent.TopLevelControl as Form;
if (f != null)
{
// Get the mdi control strip instance
PropertyInfo piMCS = typeof(Form).GetProperty("MdiControlStrip", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetField);
if (piMCS != null)
{
object mcs = piMCS.GetValue(f, null);
if (mcs != null)
{
// Get the min/restore/close internal menu items
Type mcsType = mcs.GetType();
FieldInfo fiM = mcsType.GetField("minimize", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetField);
FieldInfo fiR = mcsType.GetField("restore", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetField);
FieldInfo fiC = mcsType.GetField("close", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetField);
if ((fiM != null) && (fiR != null) && (fiC != null))
{
ToolStripMenuItem m = fiM.GetValue(mcs) as ToolStripMenuItem;
ToolStripMenuItem r = fiR.GetValue(mcs) as ToolStripMenuItem;
ToolStripMenuItem c = fiC.GetValue(mcs) as ToolStripMenuItem;
if ((m != null) && (r != null) && (c != null))
{
// Compare the event provided image with the internal cached ones to discover the type of pendant button we are drawing
PaletteButtonSpecStyle specStyle = PaletteButtonSpecStyle.Generic;
if (m.Image == e.Image)
specStyle = PaletteButtonSpecStyle.PendantMin;
else if (r.Image == e.Image)
specStyle = PaletteButtonSpecStyle.PendantRestore;
else if (c.Image == e.Image)
specStyle = PaletteButtonSpecStyle.PendantClose;
// A match, means we have a known pendant button
if (specStyle != PaletteButtonSpecStyle.Generic)
{
// Grab the palette pendant details needed for drawing
Image paletteImage = KCT.Palette.GetButtonSpecImage(specStyle, PaletteState.Normal);
Color transparentColor = KCT.Palette.GetButtonSpecImageTransparentColor(specStyle);
// Finally we actually have an image to draw!
if (paletteImage != null)
{
using (ImageAttributes attribs = new ImageAttributes())
{
// Setup mapping to make required color transparent
ColorMap remap = new ColorMap();
remap.OldColor = transparentColor;
remap.NewColor = Color.Transparent;
attribs.SetRemapTable(new ColorMap[] { remap });
// Phew, actually draw the darn thing
e.Graphics.DrawImage(paletteImage, e.ImageRectangle,
0, 0, e.Image.Width, e.Image.Height,
GraphicsUnit.Pixel, attribs);
// Do not let base class draw system defined image
return;
}
}
}
}
}
}
}
}
}
base.OnRenderItemImage(e);
}