Office2007Renderer.cs
Description du code
Office2007Renderer.cs est un fichier du projet BrolDev.Ce fichier est situé dans /var/www/bin/sniplets/bibliobrol/broldev/src/.
Projet BrolDev : Librairie de composants réutilisables pour les applications BrolDev en CSharp.
Code source ou contenu du fichier
Code c# (Office2007Renderer.cs) (1300 lignes)
/********************************************************************/ /* Office 2007 Renderer Project */ /* */ /* Use the Office2007Renderer class as a custom renderer by */ /* providing it to the ToolStripManager.Renderer property. Then */ /* all tool strips, menu strips, status strips etc will be drawn */ /* using the Office 2007 style renderer in your application. */ /* */ /* Author: Phil Wright */ /* Website: www.componentfactory.com */ /* Contact: phil.wright@componentfactory.com */ /********************************************************************/ using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; namespace Office2007Renderer { /// <summary> /// Draw ToolStrips using the Office 2007 themed appearance. /// </summary> public class Office2007Renderer : ToolStripProfessionalRenderer { #region GradientItemColors private class GradientItemColors { #region Public Fields public Color InsideTop1; public Color InsideTop2; public Color InsideBottom1; public Color InsideBottom2; public Color FillTop1; public Color FillTop2; public Color FillBottom1; public Color FillBottom2; public Color Border1; public Color Border2; #endregion #region Identity public GradientItemColors(Color insideTop1, Color insideTop2, Color insideBottom1, Color insideBottom2, Color fillTop1, Color fillTop2, Color fillBottom1, Color fillBottom2, Color border1, Color border2) { InsideTop1 = insideTop1; InsideTop2 = insideTop2; InsideBottom1 = insideBottom1; InsideBottom2 = insideBottom2; FillTop1 = fillTop1; FillTop2 = fillTop2; FillBottom1 = fillBottom1; FillBottom2 = fillBottom2; Border1 = border1; Border2 = border2; } #endregion } #endregion #region Static Metrics private static int _gripOffset = 1; private static int _gripSquare = 2; private static int _gripSize = 3; private static int _gripMove = 4; private static int _gripLines = 3; private static int _checkInset = 1; private static int _marginInset = 2; private static int _separatorInset = 31; private static float _cutToolItemMenu = 1.0f; private static float _cutContextMenu = 0f; private static float _cutMenuItemBack = 1.2f; private static float _contextCheckTickThickness = 1.6f; private static Blend _statusStripBlend; #endregion #region Static Colors private static Color _c1 = Color.FromArgb(167, 167, 167); private static Color _c2 = Color.FromArgb(21, 66, 139); private static Color _c3 = Color.FromArgb(76, 83, 92); private static Color _c4 = Color.FromArgb(250, 250, 250); private static Color _c5 = Color.FromArgb(248, 248, 248); private static Color _c6 = Color.FromArgb(243, 243, 243); private static Color _r1 = Color.FromArgb(255, 255, 251); private static Color _r2 = Color.FromArgb(255, 249, 227); private static Color _r3 = Color.FromArgb(255, 242, 201); private static Color _r4 = Color.FromArgb(255, 248, 181); private static Color _r5 = Color.FromArgb(255, 252, 229); private static Color _r6 = Color.FromArgb(255, 235, 166); private static Color _r7 = Color.FromArgb(255, 213, 103); private static Color _r8 = Color.FromArgb(255, 228, 145); private static Color _r9 = Color.FromArgb(160, 188, 228); private static Color _rA = Color.FromArgb(121, 153, 194); private static Color _rB = Color.FromArgb(182, 190, 192); private static Color _rC = Color.FromArgb(155, 163, 167); private static Color _rD = Color.FromArgb(233, 168, 97); private static Color _rE = Color.FromArgb(247, 164, 39); private static Color _rF = Color.FromArgb(246, 156, 24); private static Color _rG = Color.FromArgb(253, 173, 17); private static Color _rH = Color.FromArgb(254, 185, 108); private static Color _rI = Color.FromArgb(253, 164, 97); private static Color _rJ = Color.FromArgb(252, 143, 61); private static Color _rK = Color.FromArgb(255, 208, 134); private static Color _rL = Color.FromArgb(249, 192, 103); private static Color _rM = Color.FromArgb(250, 195, 93); private static Color _rN = Color.FromArgb(248, 190, 81); private static Color _rO = Color.FromArgb(255, 208, 49); private static Color _rP = Color.FromArgb(254, 214, 168); private static Color _rQ = Color.FromArgb(252, 180, 100); private static Color _rR = Color.FromArgb(252, 161, 54); private static Color _rS = Color.FromArgb(254, 238, 170); private static Color _rT = Color.FromArgb(249, 202, 113); private static Color _rU = Color.FromArgb(250, 205, 103); private static Color _rV = Color.FromArgb(248, 200, 91); private static Color _rW = Color.FromArgb(255, 218, 59); private static Color _rX = Color.FromArgb(254, 185, 108); private static Color _rY = Color.FromArgb(252, 161, 54); private static Color _rZ = Color.FromArgb(254, 238, 170); // Color scheme values private static Color _textDisabled = _c1; private static Color _textMenuStripItem = _c2; private static Color _textStatusStripItem = _c2; private static Color _textContextMenuItem = _c2; private static Color _arrowDisabled = _c1; private static Color _arrowLight = Color.FromArgb(106, 126, 197); private static Color _arrowDark = Color.FromArgb(64, 70, 90); private static Color _separatorMenuLight = Color.FromArgb(245, 245, 245); private static Color _separatorMenuDark = Color.FromArgb(197, 197, 197); private static Color _contextMenuBack = _c4; private static Color _contextCheckBorder = Color.FromArgb(242, 149, 54); private static Color _contextCheckTick = Color.FromArgb(66, 75, 138); private static Color _statusStripBorderDark = Color.FromArgb(86, 125, 176); private static Color _statusStripBorderLight = Color.White; private static Color _gripDark = Color.FromArgb(114, 152, 204); private static Color _gripLight = _c5; private static GradientItemColors _itemContextItemEnabledColors = new GradientItemColors(_r1, _r2, _r3, _r4, _r5, _r6, _r7, _r8, Color.FromArgb(217, 203, 150), Color.FromArgb(192, 167, 118)); private static GradientItemColors _itemDisabledColors = new GradientItemColors(_c4, _c6, Color.FromArgb(236, 236, 236), Color.FromArgb(230, 230, 230), _c6, Color.FromArgb(224, 224, 224), Color.FromArgb(200, 200, 200), Color.FromArgb(210, 210, 210), Color.FromArgb(212, 212, 212), Color.FromArgb(195, 195, 195)); private static GradientItemColors _itemToolItemSelectedColors = new GradientItemColors(_r1, _r2, _r3, _r4, _r5, _r6, _r7, _r8, _r9, _rA); private static GradientItemColors _itemToolItemPressedColors = new GradientItemColors(_rD, _rE, _rF, _rG, _rH, _rI, _rJ, _rK, _r9, _rA); private static GradientItemColors _itemToolItemCheckedColors = new GradientItemColors(_rL, _rM, _rN, _rO, _rP, _rQ, _rR, _rS, _r9, _rA); private static GradientItemColors _itemToolItemCheckPressColors = new GradientItemColors(_rT, _rU, _rV, _rW, _rX, _rI, _rY, _rZ, _r9, _rA); #endregion #region Identity static Office2007Renderer() { // One time creation of the blend for the status strip gradient brush } /// <summary> /// Initialize a new instance of the Office2007Renderer class. /// </summary> public Office2007Renderer() { } #endregion #region OnRenderArrow /// <summary> /// Raises the RenderArrow event. /// </summary> /// <param name="e">An ToolStripArrowRenderEventArgs containing the event data.</param> protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e) { // Cannot paint a zero sized area if ((e.ArrowRectangle.Width > 0) && (e.ArrowRectangle.Height > 0)) { // Create a path that is used to fill the arrow using (GraphicsPath arrowPath = CreateArrowPath(e.Item, e.ArrowRectangle, e.Direction)) { // Get the rectangle that encloses the arrow and expand slightly // so that the gradient is always within the expanding bounds RectangleF boundsF = arrowPath.GetBounds(); boundsF.Inflate(1f, 1f); Color color1 = (e.Item.Enabled ? _arrowLight : _arrowDisabled); Color color2 = (e.Item.Enabled ? _arrowDark : _arrowDisabled); float angle = 0; // Use gradient angle to match the arrow direction switch (e.Direction) { case ArrowDirection.Right: angle = 0; break; case ArrowDirection.Left: angle = 180f; break; case ArrowDirection.Down: angle = 90f; break; case ArrowDirection.Up: angle = 270f; break; } // Draw the actual arrow using a gradient e.Graphics.FillPath(arrowBrush, arrowPath); } } } #endregion #region OnRenderButtonBackground /// <summary> /// Raises the RenderButtonBackground event. /// </summary> /// <param name="e">An ToolStripItemRenderEventArgs containing the event data.</param> protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e) { // Cast to correct type ToolStripButton button = (ToolStripButton)e.Item; RenderToolButtonBackground(e.Graphics, button, e.ToolStrip); } #endregion #region OnRenderDropDownButtonBackground /// <summary> /// Raises the RenderDropDownButtonBackground event. /// </summary> /// <param name="e">An ToolStripItemRenderEventArgs containing the event data.</param> protected override void OnRenderDropDownButtonBackground(ToolStripItemRenderEventArgs e) { if (e.Item.Selected || e.Item.Pressed) RenderToolDropButtonBackground(e.Graphics, e.Item, e.ToolStrip); } #endregion #region OnRenderItemCheck /// <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 { // Create border path for the check box using (GraphicsPath borderPath = CreateBorderPath(checkBox, _cutMenuItemBack)) { // Fill the background in a solid color e.Graphics.FillPath(fillBrush, borderPath); // Draw the border around the check box e.Graphics.DrawPath(borderPen, borderPath); // If there is not an image, then we can draw the tick, square etc... if (e.Image != null) { // Extract the check state from the item { ToolStripMenuItem item = (ToolStripMenuItem)e.Item; checkState = item.CheckState; } // Decide what graphic to draw switch (checkState) { // Create a path for the tick using (GraphicsPath tickPath = CreateTickPath(checkBox)) { // Draw the tick with a thickish brush 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 e.Graphics.FillPath(tickBrush, tickPath); } break; } } } } } #endregion #region OnRenderItemText /// <summary> /// Raises the RenderItemText event. /// </summary> /// <param name="e">An ToolStripItemTextRenderEventArgs containing the event data.</param> protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e) { { // We set the color depending on the enabled state if (!e.Item.Enabled) e.TextColor = _textDisabled; else { e.TextColor = _textMenuStripItem; e.TextColor = _textStatusStripItem; else e.TextColor = _textContextMenuItem; } // All text is draw using the ClearTypeGridFit text rendering hint base.OnRenderItemText(e); } else { base.OnRenderItemText(e); } } #endregion #region OnRenderItemImage /// <summary> /// Raises the RenderItemImage event. /// </summary> /// <param name="e">An ToolStripItemImageRenderEventArgs containing the event data.</param> protected override void OnRenderItemImage(ToolStripItemImageRenderEventArgs e) { // We only override the image drawing for context menus { if (e.Image != null) { if (e.Item.Enabled) e.Graphics.DrawImage(e.Image, e.ImageRectangle); else ControlPaint.DrawImageDisabled(e.Graphics, e.Image, e.ImageRectangle.X, e.ImageRectangle.Y, Color.Transparent); } } else { base.OnRenderItemImage(e); } } #endregion #region OnRenderMenuItemBackground /// <summary> /// Raises the RenderMenuItemBackground event. /// </summary> /// <param name="e">An ToolStripItemRenderEventArgs containing the event data.</param> protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e) { { { // Draw the menu/tool strip as a header for a context menu item DrawContextMenuHeader(e.Graphics, e.Item); } else { // We only draw a background if the item is selected and enabled if (e.Item.Selected) { if (e.Item.Enabled) { // Do we draw as a menu strip or context menu item? DrawGradientToolItem(e.Graphics, e.Item, _itemToolItemSelectedColors); else DrawGradientContextMenuItem(e.Graphics, e.Item, _itemContextItemEnabledColors); } else { // Get the mouse position in tool strip coordinates Point mousePos = e.ToolStrip.PointToClient(Control.MousePosition); // If the mouse is not in the item area, then draw disabled if (!e.Item.Bounds.Contains(mousePos)) { // Do we draw as a menu strip or context menu item? DrawGradientToolItem(e.Graphics, e.Item, _itemDisabledColors); else DrawGradientContextMenuItem(e.Graphics, e.Item, _itemDisabledColors); } } } } } else { base.OnRenderMenuItemBackground(e); } } #endregion #region OnRenderSplitButtonBackground /// <summary> /// Raises the RenderSplitButtonBackground event. /// </summary> /// <param name="e">An ToolStripItemRenderEventArgs containing the event data.</param> protected override void OnRenderSplitButtonBackground(ToolStripItemRenderEventArgs e) { if (e.Item.Selected || e.Item.Pressed) { // Cast to correct type ToolStripSplitButton splitButton = (ToolStripSplitButton)e.Item; // Draw the border and background RenderToolSplitButtonBackground(e.Graphics, splitButton, e.ToolStrip); // Get the rectangle that needs to show the arrow Rectangle arrowBounds = splitButton.DropDownButtonBounds; // Draw the arrow on top of the background splitButton, arrowBounds, SystemColors.ControlText, ArrowDirection.Down)); } else { base.OnRenderSplitButtonBackground(e); } } #endregion #region OnRenderStatusStripSizingGrip /// <summary> /// Raises the RenderStatusStripSizingGrip event. /// </summary> /// <param name="e">An ToolStripRenderEventArgs containing the event data.</param> protected override void OnRenderStatusStripSizingGrip(ToolStripRenderEventArgs e) { { // Do we need to invert the drawing edge? bool rtl = (e.ToolStrip.RightToLeft == RightToLeft.Yes); // Find vertical position of the lowest grip line int y = e.AffectedBounds.Bottom - _gripSize * 2 + 1; // Draw three lines of grips for (int i = _gripLines; i >= 1; i--) { // Find the rightmost grip position on the line int x = (rtl ? e.AffectedBounds.Left + 1 : e.AffectedBounds.Right - _gripSize * 2 + 1); // Draw grips from right to left on line for (int j = 0; j < i; j++) { // Just the single grip glyph DrawGripGlyph(e.Graphics, x, y, darkBrush, lightBrush); // Move left to next grip position x -= (rtl ? -_gripMove : _gripMove); } // Move upwards to next grip line y -= _gripMove; } } } #endregion #region OnRenderToolStripContentPanelBackground /// <summary> /// Raises the RenderToolStripContentPanelBackground event. /// </summary> /// <param name="e">An ToolStripContentPanelRenderEventArgs containing the event data.</param> protected override void OnRenderToolStripContentPanelBackground(ToolStripContentPanelRenderEventArgs e) { // Must call base class, otherwise the subsequent drawing does not appear! base.OnRenderToolStripContentPanelBackground(e); // Cannot paint a zero sized area if ((e.ToolStripContentPanel.Width > 0) && (e.ToolStripContentPanel.Height > 0)) { using (LinearGradientBrush backBrush = new LinearGradientBrush(e.ToolStripContentPanel.ClientRectangle, ColorTable.ToolStripContentPanelGradientEnd, ColorTable.ToolStripContentPanelGradientBegin, 90f)) { e.Graphics.FillRectangle(backBrush, e.ToolStripContentPanel.ClientRectangle); } } } #endregion #region OnRenderSeparator /// <summary> /// Raises the RenderSeparator event. /// </summary> /// <param name="e">An ToolStripSeparatorRenderEventArgs containing the event data.</param> protected override void OnRenderSeparator(ToolStripSeparatorRenderEventArgs e) { { // Create the light and dark line pens { DrawSeparator(e.Graphics, e.Vertical, e.Item.Bounds, lightPen, darkPen, _separatorInset, (e.ToolStrip.RightToLeft == RightToLeft.Yes)); } } { // Create the light and dark line pens { DrawSeparator(e.Graphics, e.Vertical, e.Item.Bounds, lightPen, darkPen, 0, false); } } else { base.OnRenderSeparator(e); } } #endregion #region OnRenderToolStripBackground /// <summary> /// Raises the RenderToolStripBackground event. /// </summary> /// <param name="e">An ToolStripRenderEventArgs containing the event data.</param> protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e) { { // Create border and clipping paths using (GraphicsPath borderPath = CreateBorderPath(e.AffectedBounds, _cutContextMenu), clipPath = CreateClipBorderPath(e.AffectedBounds, _cutContextMenu)) { // Clip all drawing to within the border path { // Create the background brush e.Graphics.FillPath(backBrush, borderPath); } } } { // We do not paint the top two pixel lines, so are drawn by the status strip border render method // Cannot paint a zero sized area if ((backRect.Width > 0) && (backRect.Height > 0)) { ColorTable.StatusStripGradientBegin, ColorTable.StatusStripGradientEnd, 90f)) { backBrush.Blend = _statusStripBlend; e.Graphics.FillRectangle(backBrush, backRect); } } } else { base.OnRenderToolStripBackground(e); } } #endregion #region OnRenderImageMargin /// <summary> /// Raises the RenderImageMargin event. /// </summary> /// <param name="e">An ToolStripRenderEventArgs containing the event data.</param> protected override void OnRenderImageMargin(ToolStripRenderEventArgs e) { { // Start with the total margin area Rectangle marginRect = e.AffectedBounds; // Do we need to draw with separator on the opposite edge? bool rtl = (e.ToolStrip.RightToLeft == RightToLeft.Yes); marginRect.Y += _marginInset; marginRect.Height -= _marginInset * 2; // Reduce so it is inside the border if (!rtl) marginRect.X += _marginInset; else marginRect.X += _marginInset / 2; // Draw the entire margine area in a solid color e.Graphics.FillRectangle(backBrush, marginRect); // Create the light and dark line pens { if (!rtl) { // Draw the light and dark lines on the right hand side e.Graphics.DrawLine(lightPen, marginRect.Right, marginRect.Top, marginRect.Right, marginRect.Bottom); e.Graphics.DrawLine(darkPen, marginRect.Right - 1, marginRect.Top, marginRect.Right - 1, marginRect.Bottom); } else { // Draw the light and dark lines on the left hand side e.Graphics.DrawLine(lightPen, marginRect.Left - 1, marginRect.Top, marginRect.Left - 1, marginRect.Bottom); e.Graphics.DrawLine(darkPen, marginRect.Left, marginRect.Top, marginRect.Left, marginRect.Bottom); } } } else { base.OnRenderImageMargin(e); } } #endregion #region OnRenderToolStripBorder /// <summary> /// Raises the RenderToolStripBorder event. /// </summary> /// <param name="e">An ToolStripRenderEventArgs containing the event data.</param> protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e) { { // If there is a connected area to be drawn if (!e.ConnectedArea.IsEmpty) 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 { // Clip all drawing to within the border path { // Drawing with anti aliasing to create smoother appearance { // 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); } } } } { // Draw two lines at top of the status strip { e.Graphics.DrawLine(darkBorder, 0, 0, e.ToolStrip.Width, 0); e.Graphics.DrawLine(lightBorder, 0, 1, e.ToolStrip.Width, 1); } } else { base.OnRenderToolStripBorder(e); } } #endregion #region Implementation private void RenderToolButtonBackground(Graphics g, ToolStripButton button, ToolStrip toolstrip) { // We only draw a background if the item is selected or being pressed if (button.Enabled) { { if (button.Pressed) DrawGradientToolItem(g, button, _itemToolItemPressedColors); else if (button.Selected) DrawGradientToolItem(g, button, _itemToolItemCheckPressColors); else DrawGradientToolItem(g, button, _itemToolItemCheckedColors); } else { if (button.Pressed) DrawGradientToolItem(g, button, _itemToolItemPressedColors); else if (button.Selected) DrawGradientToolItem(g, button, _itemToolItemSelectedColors); } } else { if (button.Selected) { // Get the mouse position in tool strip coordinates Point mousePos = toolstrip.PointToClient(Control.MousePosition); // If the mouse is not in the item area, then draw disabled if (!button.Bounds.Contains(mousePos)) DrawGradientToolItem(g, button, _itemDisabledColors); } } } private void RenderToolDropButtonBackground(Graphics g, ToolStripItem item, ToolStrip toolstrip) { // We only draw a background if the item is selected or being pressed if (item.Selected || item.Pressed) { if (item.Enabled) { if (item.Pressed) DrawContextMenuHeader(g, item); else DrawGradientToolItem(g, item, _itemToolItemSelectedColors); } else { // Get the mouse position in tool strip coordinates Point mousePos = toolstrip.PointToClient(Control.MousePosition); // If the mouse is not in the item area, then draw disabled if (!item.Bounds.Contains(mousePos)) DrawGradientToolItem(g, item, _itemDisabledColors); } } } private void RenderToolSplitButtonBackground(Graphics g, ToolStripSplitButton splitButton, ToolStrip toolstrip) { // We only draw a background if the item is selected or being pressed if (splitButton.Selected || splitButton.Pressed) { if (splitButton.Enabled) { if (!splitButton.Pressed && splitButton.ButtonPressed) DrawGradientToolSplitItem(g, splitButton, _itemToolItemPressedColors, _itemToolItemSelectedColors, _itemContextItemEnabledColors); else if (splitButton.Pressed && !splitButton.ButtonPressed) DrawContextMenuHeader(g, splitButton); else DrawGradientToolSplitItem(g, splitButton, _itemToolItemSelectedColors, _itemToolItemSelectedColors, _itemContextItemEnabledColors); } else { // Get the mouse position in tool strip coordinates Point mousePos = toolstrip.PointToClient(Control.MousePosition); // If the mouse is not in the item area, then draw disabled if (!splitButton.Bounds.Contains(mousePos)) DrawGradientToolItem(g, splitButton, _itemDisabledColors); } } } private void DrawGradientToolItem(Graphics g, ToolStripItem item, GradientItemColors colors) { // Perform drawing into the entire background of the item } private void DrawGradientToolSplitItem(Graphics g, ToolStripSplitButton splitButton, GradientItemColors colorsButton, GradientItemColors colorsDrop, GradientItemColors colorsSplit) { // Create entire area and just the drop button area rectangles Rectangle backRectDrop = splitButton.DropDownButtonBounds; // Cannot paint zero sized areas if ((backRect.Width > 0) && (backRectDrop.Width > 0) && (backRect.Height > 0) && (backRectDrop.Height > 0)) { // Area that is the normal button starts as everything Rectangle backRectButton = backRect; // The X offset to draw the split line int splitOffset; // Is the drop button on the right hand side of entire area? if (backRectDrop.X > 0) { backRectButton.Width = backRectDrop.Left; backRectDrop.X -= 1; backRectDrop.Width++; splitOffset = backRectDrop.X; } else { backRectButton.Width -= backRectDrop.Width - 2; backRectButton.X = backRectDrop.Right - 1; backRectDrop.Width++; splitOffset = backRectDrop.Right - 1; } // Create border path around the item using (GraphicsPath borderPath = CreateBorderPath(backRect, _cutMenuItemBack)) { // Draw the normal button area background DrawGradientBack(g, backRectButton, colorsButton); // Draw the drop button area background DrawGradientBack(g, backRectDrop, colorsDrop); // Draw the split line between the areas colorsSplit.Border1, colorsSplit.Border2, 90f)) { // Sigma curve, so go from color1 to color2 and back to color1 again splitBrush.SetSigmaBellShape(0.5f); // Convert the brush to a pen for DrawPath call g.DrawLine(splitPen, backRect.X + splitOffset, backRect.Top + 1, backRect.X + splitOffset, backRect.Bottom - 1); } // Draw the border of the entire item DrawGradientBorder(g, backRect, colorsButton); } } } private void DrawContextMenuHeader(Graphics g, ToolStripItem item) { // Get the rectangle the is the items area // Create border and clipping paths using (GraphicsPath borderPath = CreateBorderPath(itemRect, _cutToolItemMenu), insidePath = CreateInsideBorderPath(itemRect, _cutToolItemMenu), clipPath = CreateClipBorderPath(itemRect, _cutToolItemMenu)) { // Clip all drawing to within the border path { // Draw the entire background area first g.FillPath(backBrush, borderPath); // Draw the border g.DrawPath(borderPen, borderPath); } } } private void DrawGradientContextMenuItem(Graphics g, ToolStripItem item, GradientItemColors colors) { // Do we need to draw with separator on the opposite edge? // Perform actual drawing into the background DrawGradientItem(g, backRect, colors); } private void DrawGradientItem(Graphics g, Rectangle backRect, GradientItemColors colors) { // Cannot paint a zero sized area if ((backRect.Width > 0) && (backRect.Height > 0)) { // Draw the background of the entire item DrawGradientBack(g, backRect, colors); // Draw the border of the entire item DrawGradientBorder(g, backRect, colors); } } private void DrawGradientBack(Graphics g, Rectangle backRect, GradientItemColors colors) { // Reduce rect draw drawing inside the border backRect.Inflate(-1, -1); int y2 = backRect.Height / 2; Rectangle backRect2 = new Rectangle(backRect.X, backRect.Y + y2, backRect.Width, backRect.Height - y2); Rectangle backRect1I = backRect1; Rectangle backRect2I = backRect2; backRect1I.Inflate(1, 1); backRect2I.Inflate(1, 1); using (LinearGradientBrush insideBrush1 = new LinearGradientBrush(backRect1I, colors.InsideTop1, colors.InsideTop2, 90f), insideBrush2 = new LinearGradientBrush(backRect2I, colors.InsideBottom1, colors.InsideBottom2, 90f)) { g.FillRectangle(insideBrush1, backRect1); g.FillRectangle(insideBrush2, backRect2); } y2 = backRect.Height / 2; backRect1I = backRect1; backRect2I = backRect2; backRect1I.Inflate(1, 1); backRect2I.Inflate(1, 1); using (LinearGradientBrush fillBrush1 = new LinearGradientBrush(backRect1I, colors.FillTop1, colors.FillTop2, 90f), { // Reduce rect one more time for the innermost drawing backRect.Inflate(-1, -1); y2 = backRect.Height / 2; g.FillRectangle(fillBrush1, backRect1); g.FillRectangle(fillBrush2, backRect2); } } private void DrawGradientBorder(Graphics g, Rectangle backRect, GradientItemColors colors) { // Drawing with anti aliasing to create smoother appearance { 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 { // Create border path around the entire item using (GraphicsPath borderPath = CreateBorderPath(backRect, _cutMenuItemBack)) g.DrawPath(borderPen, borderPath); } } } } private void DrawGripGlyph(Graphics g, int x, int y, Brush darkBrush, Brush lightBrush) { g.FillRectangle(lightBrush, x + _gripOffset, y + _gripOffset, _gripSquare, _gripSquare); g.FillRectangle(darkBrush, x, y, _gripSquare, _gripSquare); } private void DrawSeparator(Graphics g, bool vertical, Rectangle rect, Pen lightPen, Pen darkPen, int horizontalInset, bool rtl) { if (vertical) { int l = rect.Width / 2; int t = rect.Y; int b = rect.Bottom; // Draw vertical lines centered g.DrawLine(darkPen, l, t, l, b); g.DrawLine(lightPen, l + 1, t, l + 1, b); } else { int y = rect.Height / 2; int l = rect.X + (rtl ? 0 : horizontalInset); int r = rect.Right - (rtl ? horizontalInset : 0); // Draw horizontal lines centered g.DrawLine(darkPen, l, y, r, y); g.DrawLine(lightPen, l, y + 1, r, y + 1); } } private GraphicsPath CreateBorderPath(Rectangle rect, Rectangle exclude, float cut) { // If nothing to exclude, then use quicker method if (exclude.IsEmpty) return CreateBorderPath(rect, cut); // Drawing lines requires we draw inside the area we want rect.Width--; rect.Height--; // Create an array of points to draw lines between float l = rect.X; float t = rect.Y; float r = rect.Right; float b = rect.Bottom; float x0 = rect.X + cut; float x3 = rect.Right - cut; float y0 = rect.Y + cut; float y3 = rect.Bottom - cut; float cutBack = (cut == 0f ? 1 : cut); // Does the exclude intercept the top line if ((rect.Y >= exclude.Top) && (rect.Y <= exclude.Bottom)) { float x1 = exclude.X - 1 - cut; float x2 = exclude.Right + cut; if (x0 <= x1) { } else { x1 = exclude.X - 1; } if (x3 > x2) { } else { x2 = exclude.Right; } } else { } // Create path using a simple set of lines that cut the corner // Add a line between each set of points for (int i = 1; i < pts.Count; i++) path.AddLine(pts[i - 1], pts[i]); // Add a line to join the last to the first path.AddLine(pts[pts.Count - 1], pts[0]); return path; } private GraphicsPath CreateBorderPath(Rectangle rect, float cut) { // Drawing lines requires we draw inside the area we want rect.Width--; rect.Height--; // Create path using a simple set of lines that cut the corner path.AddLine(rect.Left + cut, rect.Top, rect.Right - cut, rect.Top); path.AddLine(rect.Right - cut, rect.Top, rect.Right, rect.Top + cut); path.AddLine(rect.Right, rect.Top + cut, rect.Right, rect.Bottom - cut); path.AddLine(rect.Right, rect.Bottom - cut, rect.Right - cut, rect.Bottom); path.AddLine(rect.Right - cut, rect.Bottom, rect.Left + cut, rect.Bottom); path.AddLine(rect.Left + cut, rect.Bottom, rect.Left, rect.Bottom - cut); path.AddLine(rect.Left, rect.Bottom - cut, rect.Left, rect.Top + cut); path.AddLine(rect.Left, rect.Top + cut, rect.Left + cut, rect.Top); return path; } private GraphicsPath CreateInsideBorderPath(Rectangle rect, float cut) { // Adjust rectangle to be 1 pixel inside the original area rect.Inflate(-1, -1); // Now create a path based on this inner rectangle return CreateBorderPath(rect, cut); } private GraphicsPath CreateInsideBorderPath(Rectangle rect, Rectangle exclude, float cut) { // Adjust rectangle to be 1 pixel inside the original area rect.Inflate(-1, -1); // Now create a path based on this inner rectangle return CreateBorderPath(rect, exclude, cut); } private GraphicsPath CreateClipBorderPath(Rectangle rect, float cut) { // Clipping happens inside the rect, so make 1 wider and taller rect.Width++; rect.Height++; // Now create a path based on this inner rectangle return CreateBorderPath(rect, cut); } private GraphicsPath CreateClipBorderPath(Rectangle rect, Rectangle exclude, float cut) { // Clipping happens inside the rect, so make 1 wider and taller rect.Width++; rect.Height++; // Now create a path based on this inner rectangle return CreateBorderPath(rect, exclude, cut); } private GraphicsPath CreateArrowPath(ToolStripItem item, Rectangle rect, ArrowDirection direction) { int x, y; // Find the correct starting position, which depends on direction if ((direction == ArrowDirection.Left) || (direction == ArrowDirection.Right)) { x = rect.Right - (rect.Width - 4) / 2; y = rect.Y + rect.Height / 2; } else { x = rect.X + rect.Width / 2; y = rect.Bottom - (rect.Height - 3) / 2; // The drop down button is position 1 pixel incorrectly when in RTL (item.RightToLeft == RightToLeft.Yes)) x++; } // Create triangle using a series of lines switch (direction) { case ArrowDirection.Right: path.AddLine(x, y, x - 4, y - 4); path.AddLine(x - 4, y - 4, x - 4, y + 4); path.AddLine(x - 4, y + 4, x, y); break; case ArrowDirection.Left: path.AddLine(x - 4, y, x, y - 4); path.AddLine(x, y - 4, x, y + 4); path.AddLine(x, y + 4, x - 4, y); break; case ArrowDirection.Down: path.AddLine(x + 3f, y - 3f, x - 2f, y - 3f); path.AddLine(x - 2f, y - 3f, x, y); path.AddLine(x, y, x + 3f, y - 3f); break; case ArrowDirection.Up: path.AddLine(x + 3f, y, x - 3f, y); path.AddLine(x - 3f, y, x, y - 4f); path.AddLine(x, y - 4f, x + 3f, y); break; } return path; } private GraphicsPath CreateTickPath(Rectangle rect) { // Get the center point of the rect int x = rect.X + rect.Width / 2; int y = rect.Y + rect.Height / 2; path.AddLine(x - 4, y, x - 2, y + 4); path.AddLine(x - 2, y + 4, x + 3, y - 5); return path; } private GraphicsPath CreateIndeterminatePath(Rectangle rect) { // Get the center point of the rect int x = rect.X + rect.Width / 2; int y = rect.Y + rect.Height / 2; path.AddLine(x - 3, y, x, y - 3); path.AddLine(x, y - 3, x + 3, y); path.AddLine(x + 3, y, x, y + 3); path.AddLine(x, y + 3, x - 3, y); return path; } #endregion } }
Structure et Fichiers du projet
Afficher/masquer...Icône | Nom | Taille | Modification |
Icône | Nom | Taille | Modification |
| _ | Répertoire parent | 0 octets | 1732265167 22/11/2024 09:46:07 |
| _ | vista | 0 octets | 1541007202 31/10/2018 18:33:22 |
Utilisation de l'explorateur de code
- Navigation :
- Un clic sur une icône de répertoire ouvre ce répertoire pour en afficher les fichiers.
- Lorsque le répertoire en cours ne contient pas de sous-répertoires il est possible de remonter vers le répertoire parent.
- La structure de répertoires en treetable (tableau en forme d'arborescence) n'est plus possibledans cette version.
- Un clic sur une icône de fichier ouvre ce fichier pour en afficher le code avec la coloration syntaxique adaptée en fonction du langage principal utilisé dans le fichier.
- Affichage :
- Il est possible de trier les répertoires ou les fichiers selon certains critères (nom, taille, date).
- Actions :
- Les actions possible sur les fichiers dépendent de vos droits d'utilisateur sur le site. Veuillez activer le mode utilisateur pour activer les actions.
English translation
You have asked to visit this site in English. For now, only the interface is translated, but not all the content yet.If you want to help me in translations, your contribution is welcome. All you need to do is register on the site, and send me a message asking me to add you to the group of translators, which will give you the opportunity to translate the pages you want. A link at the bottom of each translated page indicates that you are the translator, and has a link to your profile.
Thank you in advance.
Document created the 16/10/2009, last modified the 26/10/2018
Source of the printed document:https://www.gaudry.be/en/cs-broldev-source-rf-view/style/Office2007Renderer.cs.html
The infobrol is a personal site whose content is my sole responsibility. The text is available under CreativeCommons license (BY-NC-SA). More info on the terms of use and the author.