/// <summary> /// Raises the RenderToolStripBorder event. /// </summary> /// <param name="e">An ToolStripRenderEventArgs containing the event data.</param> protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e) { if ((e.ToolStrip is ContextMenuStrip) || (e.ToolStrip is ToolStripDropDownMenu)) { // If there is a connected area to be drawn if (!e.ConnectedArea.IsEmpty) using (SolidBrush excludeBrush = new SolidBrush(_contextMenuBack)) e.Graphics.FillRectangle(excludeBrush, e.ConnectedArea); // Create border and clipping paths using (GraphicsPath borderPath = CreateBorderPath(e.AffectedBounds, e.ConnectedArea, _cutContextMenu), insidePath = CreateInsideBorderPath(e.AffectedBounds, e.ConnectedArea, _cutContextMenu), clipPath = CreateClipBorderPath(e.AffectedBounds, e.ConnectedArea, _cutContextMenu)) { // Create the different pen colors we need using (Pen borderPen = new Pen(ColorTable.MenuBorder), insidePen = new Pen(_separatorMenuLight)) { // Clip all drawing to within the border path using (UseClipping clipping = new UseClipping(e.Graphics, clipPath)) { // Drawing with anti aliasing to create smoother appearance using (UseAntiAlias uaa = new UseAntiAlias(e.Graphics)) { // Draw the inside area first e.Graphics.DrawPath(insidePen, insidePath); // Draw the border area second, so any overlapping gives it priority e.Graphics.DrawPath(borderPen, borderPath); } // Draw the pixel at the bottom right of the context menu e.Graphics.DrawLine(borderPen, e.AffectedBounds.Right, e.AffectedBounds.Bottom, e.AffectedBounds.Right - 1, e.AffectedBounds.Bottom - 1); } } } } else if (e.ToolStrip is StatusStrip) { // Draw two lines at top of the status strip using (Pen darkBorder = new Pen(_statusStripBorderDark), lightBorder = new Pen(_statusStripBorderLight)) { e.Graphics.DrawLine(darkBorder, 0, 0, e.ToolStrip.Width, 0); e.Graphics.DrawLine(lightBorder, 0, 1, e.ToolStrip.Width, 1); } } else { base.OnRenderToolStripBorder(e); } }
private void DrawGradientBorder(Graphics g, Rectangle backRect, GradientItemColors colors) { // Drawing with anti aliasing to create smoother appearance using (UseAntiAlias uaa = new UseAntiAlias(g)) { Rectangle backRectI = backRect; backRectI.Inflate(1, 1); // Finally draw the border around the menu item using (LinearGradientBrush borderBrush = new LinearGradientBrush(backRectI, colors.Border1, colors.Border2, 90f)) { // Sigma curve, so go from color1 to color2 and back to color1 again borderBrush.SetSigmaBellShape(0.5f); // Convert the brush to a pen for DrawPath call using (Pen borderPen = new Pen(borderBrush)) { // Create border path around the entire item using (GraphicsPath borderPath = CreateBorderPath(backRect, _cutMenuItemBack)) g.DrawPath(borderPen, borderPath); } } } }
/// <summary> /// Raises the RenderItemCheck event. /// </summary> /// <param name="e">An ToolStripItemImageRenderEventArgs containing the event data.</param> protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e) { // Staring size of the checkbox is the image rectangle Rectangle checkBox = e.ImageRectangle; // Make the border of the check box 1 pixel bigger on all sides, as a minimum checkBox.Inflate(1, 1); // Can we extend upwards? if (checkBox.Top > _checkInset) { int diff = checkBox.Top - _checkInset; checkBox.Y -= diff; checkBox.Height += diff; } // Can we extend downwards? if (checkBox.Height <= (e.Item.Bounds.Height - (_checkInset * 2))) { int diff = e.Item.Bounds.Height - (_checkInset * 2) - checkBox.Height; checkBox.Height += diff; } // Drawing with anti aliasing to create smoother appearance using (UseAntiAlias uaa = new UseAntiAlias(e.Graphics)) { // Create border path for the check box using (GraphicsPath borderPath = CreateBorderPath(checkBox, _cutMenuItemBack)) { // Fill the background in a solid color using (SolidBrush fillBrush = new SolidBrush(ColorTable.CheckBackground)) e.Graphics.FillPath(fillBrush, borderPath); // Draw the border around the check box using (Pen borderPen = new Pen(_contextCheckBorder)) e.Graphics.DrawPath(borderPen, borderPath); // If there is not an image, then we can draw the tick, square etc... if (e.Image != null) { CheckState checkState = CheckState.Unchecked; // Extract the check state from the item if (e.Item is ToolStripMenuItem) { ToolStripMenuItem item = (ToolStripMenuItem)e.Item; checkState = item.CheckState; } // Decide what graphic to draw switch (checkState) { case CheckState.Checked: // Create a path for the tick using (GraphicsPath tickPath = CreateTickPath(checkBox)) { // Draw the tick with a thickish brush using (Pen tickPen = new Pen(_contextCheckTick, _contextCheckTickThickness)) e.Graphics.DrawPath(tickPen, tickPath); } break; case CheckState.Indeterminate: // Create a path for the indeterminate diamond using (GraphicsPath tickPath = CreateIndeterminatePath(checkBox)) { // Draw the tick with a thickish brush using (SolidBrush tickBrush = new SolidBrush(_contextCheckTick)) e.Graphics.FillPath(tickBrush, tickPath); } break; } } } } }