public static void PaintButton(ButtonItem button, ItemPaintArgs pa) { System.Drawing.Graphics g=pa.Graphics; ThemeToolbar theme=pa.ThemeToolbar; ThemeToolbarParts part=ThemeToolbarParts.Button; ThemeToolbarStates state=ThemeToolbarStates.Normal; Color textColor=ButtonItemPainterHelper.GetTextColor(button,pa); Rectangle rectImage=Rectangle.Empty; Rectangle itemRect=button.DisplayRectangle; Font font=null; CompositeImage image=button.GetImage(); font=button.GetFont(pa, false); eTextFormat format= GetStringFormat(button, pa, image); bool bSplitButton=(button.SubItems.Count>0 || button.PopupType==ePopupType.Container) && button.ShowSubItems && !button.SubItemsRect.IsEmpty; if(bSplitButton) part=ThemeToolbarParts.SplitButton; // Calculate image position if(image!=null) { if(button.ImagePosition==eImagePosition.Top || button.ImagePosition==eImagePosition.Bottom) rectImage=new Rectangle(button.ImageDrawRect.X,button.ImageDrawRect.Y,itemRect.Width,button.ImageDrawRect.Height); else rectImage=new Rectangle(button.ImageDrawRect.X,button.ImageDrawRect.Y,button.ImageDrawRect.Width,button.ImageDrawRect.Height); rectImage.Offset(itemRect.Left,itemRect.Top); rectImage.Offset((rectImage.Width-button.ImageSize.Width)/2,(rectImage.Height-button.ImageSize.Height)/2); rectImage.Width=button.ImageSize.Width; rectImage.Height=button.ImageSize.Height; } // Set the state and text brush if(!ButtonItemPainter.IsItemEnabled(button, pa)) { state=ThemeToolbarStates.Disabled; } else if(button.IsMouseDown) { state=ThemeToolbarStates.Pressed; } else if(button.IsMouseOver && button.Checked) { state=ThemeToolbarStates.HotChecked; } else if(button.IsMouseOver || button.Expanded) { state=ThemeToolbarStates.Hot; } else if(button.Checked) { state=ThemeToolbarStates.Checked; } Rectangle backRect=button.DisplayRectangle; if(button.HotTrackingStyle==eHotTrackingStyle.Image && image!=null) { backRect=rectImage; backRect.Inflate(3,3); } else if(bSplitButton) { backRect.Width=backRect.Width-button.SubItemsRect.Width; } // Draw Button Background if(button.HotTrackingStyle!=eHotTrackingStyle.None) { theme.DrawBackground(g,part,state,backRect); } // Draw Image if(image!=null && button.ButtonStyle!=eButtonStyle.TextOnlyAlways) { if(state==ThemeToolbarStates.Normal && button.HotTrackingStyle==eHotTrackingStyle.Color) { // Draw gray-scale image for this hover style... float[][] array = new float[5][]; array[0] = new float[5] {0.2125f, 0.2125f, 0.2125f, 0, 0}; array[1] = new float[5] {0.5f, 0.5f, 0.5f, 0, 0}; array[2] = new float[5] {0.0361f, 0.0361f, 0.0361f, 0, 0}; array[3] = new float[5] {0, 0, 0, 1, 0}; array[4] = new float[5] {0.2f, 0.2f, 0.2f, 0, 1}; System.Drawing.Imaging.ColorMatrix grayMatrix = new System.Drawing.Imaging.ColorMatrix(array); System.Drawing.Imaging.ImageAttributes att = new System.Drawing.Imaging.ImageAttributes(); att.SetColorMatrix(grayMatrix); //g.DrawImage(image,rectImage,0,0,image.Width,image.Height,GraphicsUnit.Pixel,att); image.DrawImage(g,rectImage,0,0,image.Width,image.Height,GraphicsUnit.Pixel,att); } else if(state==ThemeToolbarStates.Normal && !image.IsIcon) { // Draw image little bit lighter, I decied to use gamma it is easy System.Drawing.Imaging.ImageAttributes lightImageAttr = new System.Drawing.Imaging.ImageAttributes(); lightImageAttr.SetGamma(.7f,System.Drawing.Imaging.ColorAdjustType.Bitmap); //g.DrawImage(image,rectImage,0,0,image.Width,image.Height,GraphicsUnit.Pixel,lightImageAttr); image.DrawImage(g,rectImage,0,0,image.Width,image.Height,GraphicsUnit.Pixel,lightImageAttr); } else { image.DrawImage(g,rectImage); } } // Draw Text if(button.ButtonStyle==eButtonStyle.ImageAndText || button.ButtonStyle==eButtonStyle.TextOnlyAlways || image==null) { Rectangle rectText=button.TextDrawRect; if(button.ImagePosition==eImagePosition.Top || button.ImagePosition==eImagePosition.Bottom) { if(button.Orientation==eOrientation.Vertical) { rectText=new Rectangle(button.TextDrawRect.X,button.TextDrawRect.Y,button.TextDrawRect.Width,button.TextDrawRect.Height); } else { rectText=new Rectangle(button.TextDrawRect.X,button.TextDrawRect.Y,itemRect.Width,button.TextDrawRect.Height); if((button.SubItems.Count>0 || button.PopupType==ePopupType.Container) && button.ShowSubItems) rectText.Width-=10; } format|=eTextFormat.HorizontalCenter; } rectText.Offset(itemRect.Left,itemRect.Top); if(button.Orientation==eOrientation.Vertical) { g.RotateTransform(90); TextDrawing.DrawStringLegacy(g,ButtonItemPainter.GetDrawText(button.Text),font,textColor,new Rectangle(rectText.Top,-rectText.Right,rectText.Height,rectText.Width),format); g.ResetTransform(); } else { if(rectText.Right>button.DisplayRectangle.Right) rectText.Width=button.DisplayRectangle.Right-rectText.Left; TextDrawing.DrawString(g,ButtonItemPainter.GetDrawText(button.Text),font,textColor,rectText,format); if(!button.DesignMode && button.Focused && !pa.IsOnMenu && !pa.IsOnMenuBar) { //SizeF szf=g.MeasureString(m_Text,font,rectText.Width,format); Rectangle r=rectText; //r.Width=(int)Math.Ceiling(szf.Width); //r.Height=(int)Math.Ceiling(szf.Height); //r.Inflate(1,1); System.Windows.Forms.ControlPaint.DrawFocusRectangle(g,r); } } } // If it has subitems draw the triangle to indicate that if(bSplitButton) { part=ThemeToolbarParts.SplitButtonDropDown; if(!ButtonItemPainter.IsItemEnabled(button, pa)) state=ThemeToolbarStates.Disabled; else state=ThemeToolbarStates.Normal; if(button.HotTrackingStyle!=eHotTrackingStyle.None && button.HotTrackingStyle!=eHotTrackingStyle.Image && ButtonItemPainter.IsItemEnabled(button, pa)) { if(button.Expanded || button.IsMouseDown) state=ThemeToolbarStates.Pressed; else if(button.IsMouseOver && button.Checked) state=ThemeToolbarStates.HotChecked; else if(button.Checked) state=ThemeToolbarStates.Checked; else if(button.IsMouseOver) state=ThemeToolbarStates.Hot; } if (!button.AutoExpandOnClick) { if (button.Orientation == eOrientation.Horizontal) { Rectangle r = button.SubItemsRect; r.Offset(itemRect.X, itemRect.Y); theme.DrawBackground(g, part, state, r); } else { Rectangle r = button.SubItemsRect; r.Offset(itemRect.X, itemRect.Y); theme.DrawBackground(g, part, state, r); } } } if(button.Focused && button.DesignMode) { Rectangle r=itemRect; r.Inflate(-1,-1); DesignTime.DrawDesignTimeSelection(g,r,pa.Colors.ItemDesignTimeBorder); } if(image!=null) image.Dispose(); }
public void Paint(ButtonItem item, ItemPaintArgs pa, CrumbBarItemViewColorTable itemColorTable) { Graphics g =pa.Graphics; CrumbBarItemViewStateColorTable stateTable = itemColorTable.Default; CrumbBarItemViewStateColorTable stateTable2 = null; bool isPressed = false; if (item.IsMouseDown || item.Expanded) { stateTable = itemColorTable.Pressed; isPressed = true; } else if (item.IsMouseOverExpand) { stateTable = itemColorTable.MouseOverInactive; stateTable2 = itemColorTable.MouseOver; } else if (item.IsMouseOver) stateTable = itemColorTable.MouseOver; Rectangle rect = item.DisplayRectangle; rect.Width--; rect.Height--; Rectangle expandRect = item.GetTotalSubItemsRect(); if (!expandRect.IsEmpty) { expandRect.Offset(rect.Location); expandRect.Width--; expandRect.Height--; } PaintBackground(item, g, stateTable, stateTable2, isPressed, ref rect, ref expandRect); Color textColor = stateTable.Foreground; if (!item.ForeColor.IsEmpty) textColor = item.ForeColor; if (!textColor.IsEmpty) { // Render text Font font = item.GetFont(pa, false); bool rightToLeft = pa.RightToLeft; rect = GetTextRectangle(item); eTextFormat stringFormat = eTextFormat.Left | eTextFormat.VerticalCenter | eTextFormat.HidePrefix; if (item.TextMarkupBody == null) { TextDrawing.DrawString(g, ButtonItemPainter.GetDrawText(item.Text), font, textColor, rect, stringFormat); } else { TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, font, textColor, rightToLeft); d.HotKeyPrefixVisible = !((stringFormat & eTextFormat.HidePrefix) == eTextFormat.HidePrefix); d.ContextObject = item; Rectangle mr = new Rectangle(rect.X, rect.Y + (rect.Height - item.TextMarkupBody.Bounds.Height) / 2 + 1, item.TextMarkupBody.Bounds.Width, item.TextMarkupBody.Bounds.Height); item.TextMarkupBody.Bounds = mr; item.TextMarkupBody.Render(d); } if ((item.SubItems.Count > 0 || item.PopupType == ePopupType.Container) && item.ShowSubItems) { // Render expand sign GraphicsPath path = GetExpandPath(item, expandRect); if (path != null) { SmoothingMode sm = g.SmoothingMode; g.SmoothingMode = SmoothingMode.Default; using(Brush brush=new SolidBrush(stateTable.Foreground)) g.FillPath(brush, path); g.SmoothingMode = sm; } } } }
public static void LayoutButtonX(ButtonItem button) { Control objCtrl = button.ContainerControl as Control; ButtonX btnX = button.ContainerControl as ButtonX; if (!BarFunctions.IsHandleValid(objCtrl)) return; bool isOnMenu = button.IsOnMenu; if (isOnMenu && button.Parent is ItemContainer) isOnMenu = false; bool bHasImage = false; if (!string.IsNullOrEmpty(button.Symbol)) { bHasImage = true; } else { using (CompositeImage buttonImage = button.GetImage()) { if (buttonImage != null) bHasImage = true; } } eImagePosition imagePosition = button.ImagePosition; bool rightToLeft = (objCtrl.RightToLeft == RightToLeft.Yes); Rectangle textDrawRect = Rectangle.Empty; Rectangle imageDrawRect = Rectangle.Empty; Rectangle subItemsRect = Rectangle.Empty; Rectangle bounds = button.Bounds; // Calculate sub-items rectangle if (button.SubItems.Count > 0 && button.ShowSubItems && !(button.TextMarkupBody != null && button.TextMarkupBody.HasExpandElement && button.ButtonStyle != eButtonStyle.Default)) { // Add small button to expand the item if (button.Orientation == eOrientation.Horizontal) { if (rightToLeft) subItemsRect = new Rectangle(0, 0, button.SubItemsExpandWidth, bounds.Height); else subItemsRect = new Rectangle(bounds.Width - button.SubItemsExpandWidth, 0, button.SubItemsExpandWidth, bounds.Height); if (rightToLeft) bounds.X += button.SubItemsExpandWidth + 1; bounds.Width -= button.SubItemsExpandWidth + 1; } else { subItemsRect = new Rectangle(0, bounds.Height - button.SubItemsExpandWidth, bounds.Width, button.SubItemsExpandWidth); bounds.Height -= button.SubItemsExpandWidth + 1; } } // Adjust image position if (rightToLeft && button.Orientation == eOrientation.Horizontal) { if (imagePosition == eImagePosition.Left) imagePosition = eImagePosition.Right; else if (imagePosition == eImagePosition.Right) imagePosition = eImagePosition.Left; } int measureStringWidth = 0; measureStringWidth = bounds.Width; Graphics g = BarFunctions.CreateGraphics(objCtrl); try { // Get the right image size that we will use for calculation Size imageSize = Size.Empty; if (!string.IsNullOrEmpty(button.Symbol)) { Font symFont = Symbols.GetFontAwesome(button.SymbolSize); imageSize = TextDrawing.MeasureStringLegacy(g, button.Symbol, symFont, Size.Empty, eTextFormat.Default); int descent = (int)Math.Ceiling((symFont.FontFamily.GetCellDescent(symFont.Style) * symFont.Size / symFont.FontFamily.GetEmHeight(symFont.Style))); imageSize.Height -= descent; button.ImageSize = imageSize; } else { if (!button.ImageFixedSize.IsEmpty) imageSize = button.ImageFixedSize; else imageSize = button.ImageSize; } if (bHasImage && (imagePosition == eImagePosition.Left || imagePosition == eImagePosition.Right)) { if (btnX != null) measureStringWidth -= imageSize.Width + btnX.ImageTextSpacing * 2 + 3; else measureStringWidth -= (imageSize.Width + 8); } if (bHasImage && !imageSize.IsEmpty && btnX != null && btnX.ImageTextSpacing != 0) { if (imagePosition == eImagePosition.Left || imagePosition == eImagePosition.Right) imageSize.Width += btnX.ImageTextSpacing * 2; else imageSize.Height += btnX.ImageTextSpacing * 2; } // Measure string Font font = button.GetFont(null, true); SizeF textSize = SizeF.Empty; eTextFormat stringFormat = eTextFormat.Default | eTextFormat.VerticalCenter; #if FRAMEWORK20 if (BarFunctions.IsWindowsXP && BarUtilities.UseTextRenderer) stringFormat |= eTextFormat.LeftAndRightPadding; #endif if (btnX != null || objCtrl is RibbonBar && button.RibbonWordWrap) stringFormat |= eTextFormat.WordBreak; if (button.Text != "") { if (button.TextMarkupBody == null) { if (button.Orientation == eOrientation.Vertical && !isOnMenu) textSize = TextDrawing.MeasureStringLegacy(g, ButtonItemPainter.GetDrawText(button.Text), font, new Size(measureStringWidth, 0), stringFormat); else { textSize = TextDrawing.MeasureString(g, ButtonItemPainter.GetDrawText(button.Text), font, measureStringWidth, stringFormat); #if FRAMEWORK20 if (BarFunctions.IsWindowsXP && BarUtilities.UseTextRenderer) textSize.Width += 2; #endif } } else { Size availSize = new Size(measureStringWidth, 1); if (measureStringWidth == 0) availSize.Width = 1600; TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, font, Color.Empty, false); d.RightToLeft = rightToLeft; button.TextMarkupBody.Measure(availSize, d); availSize = button.TextMarkupBody.Bounds.Size; button.TextMarkupBody.Arrange(new Rectangle(0, 0, availSize.Width, availSize.Height), d); textSize = button.TextMarkupBody.Bounds.Size; } } if (button.Orientation == eOrientation.Horizontal && (imagePosition == eImagePosition.Left || imagePosition == eImagePosition.Right)) { // Recalc size for the Bar button // Add 8 pixel padding to the image size, 4 pixels on each side if (button.ButtonStyle != eButtonStyle.Default || !bHasImage) imageSize.Width += 4; imageDrawRect = Rectangle.Empty; if (button.ButtonStyle != eButtonStyle.TextOnlyAlways && bHasImage) { // We know the image position now, we will center it into this area if (imagePosition == eImagePosition.Left) { if (btnX != null && btnX.TextAlignment == eButtonTextAlignment.Left) imageDrawRect = new Rectangle(2, (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height); else if (btnX != null && btnX.TextAlignment == eButtonTextAlignment.Right) imageDrawRect = new Rectangle(bounds.Width - (imageSize.Width + (int)Math.Ceiling(textSize.Width) + 4), (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height); else if (btnX != null) imageDrawRect = new Rectangle(/*bounds.X+*/(int)(bounds.Width - (textSize.Width + imageSize.Width)) / 2, (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height); else { if (subItemsRect.IsEmpty && button.ButtonStyle == eButtonStyle.Default) imageDrawRect = new Rectangle((bounds.Width - imageSize.Width) / 2, (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height); else imageDrawRect = new Rectangle(0, (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height); } } else { if (btnX != null && btnX.TextAlignment == eButtonTextAlignment.Left) imageDrawRect = new Rectangle((int)textSize.Width + 4, (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height); else if (btnX != null && btnX.TextAlignment == eButtonTextAlignment.Right) imageDrawRect = new Rectangle(bounds.Width - imageSize.Width, (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height); else if (btnX != null) imageDrawRect = new Rectangle(bounds.Width - (int)(bounds.Width - (textSize.Width + imageSize.Width)) / 2 - (imageSize.Width), (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height); else imageDrawRect = new Rectangle(bounds.Width - imageSize.Width, (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height); } } // Draw Text only if needed textDrawRect = Rectangle.Empty; if (button.ButtonStyle != eButtonStyle.Default || !bHasImage) { if (bHasImage) { if (imagePosition == eImagePosition.Left) { if (btnX != null && btnX.TextAlignment == eButtonTextAlignment.Center) textDrawRect = new Rectangle(imageDrawRect.Right + 1, (int)((bounds.Height - textSize.Height) / 2), (int)textSize.Width, (int)textSize.Height); else if (btnX != null && (btnX.TextAlignment == eButtonTextAlignment.Right || btnX.TextAlignment == eButtonTextAlignment.Left)) textDrawRect = new Rectangle(imageDrawRect.Right + 1, (int)((bounds.Height - textSize.Height) / 2), bounds.Width - 3 - imageDrawRect.Width, (int)textSize.Height); else textDrawRect = new Rectangle(imageDrawRect.Right + 1, (int)((bounds.Height - textSize.Height) / 2), bounds.Width - 3 - imageDrawRect.Width, (int)textSize.Height); } else { if (btnX != null && btnX.TextAlignment == eButtonTextAlignment.Center) textDrawRect = new Rectangle((int)(imageDrawRect.X - textSize.Width) - 1, (int)((bounds.Height - textSize.Height) / 2), (int)textSize.Width, (int)textSize.Height); else if (btnX != null && btnX.TextAlignment == eButtonTextAlignment.Right) textDrawRect = new Rectangle(imageDrawRect.X - ((int)textSize.Width + 4), (int)((bounds.Height - textSize.Height) / 2), (int)textSize.Width + 2, (int)textSize.Height); else textDrawRect = new Rectangle(3, (int)((bounds.Height - textSize.Height) / 2), imageDrawRect.X - 2, (int)textSize.Height); } } else { if (btnX != null && btnX.TextAlignment == eButtonTextAlignment.Center || button._FixedSizeCenterText) textDrawRect = new Rectangle(/*bounds.X+*/(int)((bounds.Width - textSize.Width) / 2), (int)((bounds.Height - textSize.Height) / 2), (int)textSize.Width, (int)textSize.Height); else textDrawRect = new Rectangle(/*bounds.X +*/ 3, (int)((bounds.Height - textSize.Height) / 2), bounds.Width - 6, (int)textSize.Height); } } } else { // Image is on top or bottom // Calculate width, that is easy if (button.Orientation == eOrientation.Horizontal) { if (imagePosition == eImagePosition.Top) { imageDrawRect = new Rectangle(0, (int)(bounds.Height - (imageSize.Height + textSize.Height)) / 2, bounds.Width, imageSize.Height/*+2*/); textDrawRect = new Rectangle(0, imageDrawRect.Bottom, (int)textSize.Width, (int)textSize.Height + 5); } else { textDrawRect = new Rectangle((int)(bounds.Width - textSize.Width) / 2, (int)(bounds.Height - (imageSize.Height + textSize.Height)) / 2, (int)textSize.Width, (int)textSize.Height); imageDrawRect = new Rectangle(0, textDrawRect.Bottom, bounds.Width, imageSize.Height + 5); } } else { if (imagePosition == eImagePosition.Top || imagePosition == eImagePosition.Left) { if (bHasImage) { if (subItemsRect.IsEmpty && button.ButtonStyle == eButtonStyle.Default) imageDrawRect = new Rectangle((bounds.Width - imageSize.Width) / 2, (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height); else imageDrawRect = new Rectangle(0, 0, bounds.Width, imageSize.Height + 6); } textDrawRect = new Rectangle((int)(bounds.Width - textSize.Height) / 2, imageDrawRect.Bottom + 2, (int)textSize.Height, (int)textSize.Width + 5); } else { textDrawRect = new Rectangle((int)(bounds.Width - textSize.Width) / 2, 0, (int)textSize.Height, (int)textSize.Width + 5); if (bHasImage) imageDrawRect = new Rectangle(0, textDrawRect.Bottom + 2, bounds.Width, imageSize.Height + 5); } } } } finally { g.TextRenderingHint = TextRenderingHint.SystemDefault; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.Default; g.Dispose(); } button.ImageDrawRect = imageDrawRect; button.TextDrawRect = textDrawRect; button.SubItemsRect = subItemsRect; }
public override void PaintButtonText(ButtonItem button, ItemPaintArgs pa, Color textColor, CompositeImage image) { if (!button.RenderText) return; Graphics g=pa.Graphics; eTextFormat stringFormat=GetStringFormat(button,pa,image); bool isOnMenu = IsOnMenu(button, pa); bool isOnMenuBar=pa.IsOnMenuBar; Rectangle itemRect=button.DisplayRectangle; Rectangle rect=GetTextRectangle(button, pa, stringFormat, image); Font font=button.GetFont(pa, false); bool rightToLeft = pa.RightToLeft; //if (isOnMenu && rightToLeft || (stringFormat & eTextFormat.Left) == eTextFormat.Left) // stringFormat |=eTextFormat.Right; // Draw menu item text if (isOnMenu || button.ButtonStyle != eButtonStyle.Default || image == null && string.IsNullOrEmpty(button.Symbol) || (!isOnMenu && (button.ImagePosition == eImagePosition.Top || button.ImagePosition == eImagePosition.Bottom))) { if(button.Orientation==eOrientation.Vertical && !isOnMenu) { g.RotateTransform(90); if (button.TextMarkupBody == null) { TextDrawing.DrawStringLegacy(g, GetDrawText(button.Text), font, textColor, new Rectangle(rect.Top, -rect.Right, rect.Height, rect.Width), stringFormat); } else { TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, font, textColor, rightToLeft); d.HotKeyPrefixVisible = !((stringFormat & eTextFormat.HidePrefix) == eTextFormat.HidePrefix); button.TextMarkupBody.Bounds = new Rectangle(rect.Top, -rect.Right, button.TextMarkupBody.Bounds.Width, button.TextMarkupBody.Bounds.Height); button.TextMarkupBody.Render(d); } g.ResetTransform(); } else { if (button.TextMarkupBody == null) { #if FRAMEWORK20 if (pa.GlassEnabled && (button.Parent is CaptionItemContainer || button.Parent is RibbonTabItemContainer && (button.EffectiveStyle == eDotNetBarStyle.Office2010 || button.EffectiveStyle == eDotNetBarStyle.Metro)) && !(pa.ContainerControl is QatToolbar)) { if (!pa.CachedPaint) Office2007RibbonControlPainter.PaintTextOnGlass(g, button.Text, font, rect, TextDrawing.GetTextFormat(stringFormat), textColor, true, !button.IsMouseOver && !ColorFunctions.IsEqual(textColor, Color.White), 7); } else #endif TextDrawing.DrawString(g, GetDrawText(button.Text), font, textColor, rect, stringFormat); } else { TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, font, textColor, rightToLeft); d.HotKeyPrefixVisible = !((stringFormat & eTextFormat.HidePrefix) == eTextFormat.HidePrefix); d.ContextObject = button; Rectangle mr = new Rectangle((rightToLeft && isOnMenu?rect.X+rect.Width-button.TextMarkupBody.Bounds.Width:rect.X), rect.Y + (rect.Height - button.TextMarkupBody.Bounds.Height) / 2 /*- (isOnMenu ? -1 : -1)*/+1, button.TextMarkupBody.Bounds.Width, button.TextMarkupBody.Bounds.Height); if (pa.ContainerControl is RibbonBar && (button.ImagePosition == eImagePosition.Top || button.ImagePosition == eImagePosition.Bottom)) mr = new Rectangle(rect.X + (rect.Width - button.TextMarkupBody.Bounds.Width) / 2, rect.Y, button.TextMarkupBody.Bounds.Width, button.TextMarkupBody.Bounds.Height); else if (IsTextCentered(button, pa, image)) mr.Offset((rect.Width - mr.Width) / 2, 0); if (button._FixedSizeCenterText) mr.Y--; button.TextMarkupBody.Bounds = mr; button.TextMarkupBody.Render(d); } if(!button.DesignMode && button.Focused && !isOnMenu && !isOnMenuBar && !(pa.ContainerControl is ButtonX && !((ButtonX)pa.ContainerControl).FocusCuesEnabled)) { Rectangle r=itemRect; r.Inflate(-2, -2); ControlPaint.DrawFocusRectangle(g,r); } } } // Draw Shortcut text if needed if( button.DrawShortcutText!="" && isOnMenu && !button.IsOnCustomizeDialog) { stringFormat |= eTextFormat.HidePrefix; //if(rightToLeft) // stringFormat = stringFormat & ~(stringFormat & eTextFormat.Right) | eTextFormat.Left; //else stringFormat|=eTextFormat.Right; TextDrawing.DrawString(g, button.DrawShortcutText, font, textColor, rect, stringFormat); } }
public static void LayoutButton(ButtonItem button, bool startButtonType) { Control objCtrl = button.ContainerControl as Control; if (objCtrl == null || objCtrl.Disposing || objCtrl.IsDisposed) //if(!BarFunctions.IsHandleValid(objCtrl)) return; if (objCtrl is ButtonX && button._FitContainer) { LayoutButtonX(button); return; } else if (button.FixedSize.Width > 0 && button.FixedSize.Height > 0) { button.SetDisplayRectangle(new Rectangle(button.DisplayRectangle.Location, button.FixedSize)); LayoutButtonX(button); return; } bool isOnMenu = button.IsOnMenu; if (isOnMenu && button.Parent is ItemContainer) isOnMenu = false; bool bHasImage = false; bool isSymbolImage = false; if (!string.IsNullOrEmpty(button.Symbol)) { bHasImage = true; isSymbolImage = true; } else { using (CompositeImage buttonImage = button.GetImage()) { if (buttonImage != null || startButtonType) bHasImage = true; } } eImagePosition imagePosition = button.ImagePosition; bool rightToLeft = (objCtrl.RightToLeft == RightToLeft.Yes); Rectangle textDrawRect = Rectangle.Empty; Rectangle imageDrawRect = Rectangle.Empty; Rectangle subItemsRect = Rectangle.Empty; Rectangle bounds = new Rectangle(button.DisplayRectangle.Location, Size.Empty); // Critical to preserve the location for compatibility reasons if (rightToLeft && button.Orientation == eOrientation.Horizontal) { if (imagePosition == eImagePosition.Left) imagePosition = eImagePosition.Right; else if (imagePosition == eImagePosition.Right) imagePosition = eImagePosition.Left; } int measureStringWidth = 0; if (button._FitContainer) measureStringWidth = button.DisplayRectangle.Width - 4; bounds.Width = 0; bounds.Height = 0; Graphics g = BarFunctions.CreateGraphics(objCtrl); try { eTextFormat stringFormat = GetTextFormat(button); // Get the right image size that we will use for calculation Size imageSize = Size.Empty; if (isSymbolImage) { Font symFont = Symbols.GetFontAwesome(button.SymbolSize); if(button.IsOnMenu) // Need to do this to get consistent size for the symbol since they are not all the same width we pick widest imageSize = TextDrawing.MeasureString(g, "\uF00A", symFont); else imageSize = TextDrawing.MeasureString(g, button.Symbol, symFont); int descent = (int)Math.Ceiling((symFont.FontFamily.GetCellDescent(symFont.Style) * symFont.Size / symFont.FontFamily.GetEmHeight(symFont.Style))); imageSize.Height -= descent; button.ImageSize = imageSize; } else { imageSize = GetLayoutImageSize(button, bHasImage, isOnMenu, startButtonType); } bool ribbonBarButton = false; if (button._FitContainer && bHasImage && (imagePosition == eImagePosition.Left || imagePosition == eImagePosition.Right)) { measureStringWidth -= (imageSize.Width + 10); } else if (button.RibbonWordWrap && bHasImage && imagePosition == eImagePosition.Top && objCtrl is RibbonBar && UseRibbonWordBreak(button)) { measureStringWidth = imageSize.Width + 4; stringFormat |= eTextFormat.WordBreak; ribbonBarButton = true; } // Measure string Font font = button.GetFont(null, true); SizeF textSize = SizeF.Empty; if ((button.Text != "" || button.TextMarkupBody != null) && (!bHasImage || isOnMenu || button.ButtonStyle != eButtonStyle.Default || button.ImagePosition != eImagePosition.Left && bHasImage)) { textSize = ButtonItemLayout.MeasureItemText(button, g, measureStringWidth, font, stringFormat, rightToLeft, ribbonBarButton, imagePosition); //if (button.HotFontBold) textSize.Width += textSize.Width * .15f; int maxItt = 0; int increase = Math.Max(14, imageSize.Width / 2); while (ribbonBarButton && textSize.Height > font.Height * 2.2 && maxItt < 3) { measureStringWidth += increase; textSize = ButtonItemLayout.MeasureItemText(button, g, measureStringWidth, font, stringFormat, rightToLeft, ribbonBarButton, imagePosition); maxItt++; } if (/*!ribbonBarButton &&*/ objCtrl is RibbonBar && bHasImage && imagePosition == eImagePosition.Top) textSize.Height += 2; } // See if this button is on menu, and do appropriate calculations if (isOnMenu) { if (imageSize.IsEmpty) imageSize = new Size(16, 16); // Add 4 pixel padding to the image size, 2 pixels on each side imageSize.Height += 2; imageSize.Width += 7; // Calculate item height if (textSize.Height > imageSize.Height) bounds.Height = (int)textSize.Height + 4; else bounds.Height = imageSize.Height + 4; // Add Vertical Padding to it bounds.Height += button.VerticalPadding; // We know the image position now, we will center it into this area if (button.IsOnCustomizeMenu && !rightToLeft) imageDrawRect = new Rectangle(bounds.Height + 2, (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height); else imageDrawRect = new Rectangle(0, (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height); bounds.Width = (int)textSize.Width; // Add short-cut size if we have short-cut if (button.DrawShortcutText != "") { Size objSizeShortcut = TextDrawing.MeasureString(g, button.DrawShortcutText, font, 0, stringFormat); bounds.Width += (objSizeShortcut.Width + 14); // 14 distance between text and shortcut } textDrawRect = new Rectangle(imageDrawRect.Right + 8, 2, bounds.Width, bounds.Height - 4); // 8 pixels distance between image and text, 22 pixels if this item has sub items bounds.Width += (imageDrawRect.Right + 8 + 26); bounds.Width += button.HorizontalPadding; } else { bool bThemed = button.IsThemed; if (button.Orientation == eOrientation.Horizontal && (imagePosition == eImagePosition.Left || imagePosition == eImagePosition.Right)) { // Recalc size for the Bar button // Add 8 pixel padding to the image size, 4 pixels on each side //objImageSize.Height+=4; imageSize.Width += button.ImagePaddingHorizontal; // Calculate item height if (textSize.Height > imageSize.Height) bounds.Height = (int)textSize.Height + button.ImagePaddingVertical; else bounds.Height = imageSize.Height + button.ImagePaddingVertical; // Add Vertical Padding bounds.Height += button.VerticalPadding; if (bThemed && !button.IsOnMenuBar) bounds.Height += 4; imageDrawRect = Rectangle.Empty; if (button.ButtonStyle != eButtonStyle.TextOnlyAlways && bHasImage) { // We know the image position now, we will center it into this area imageDrawRect = new Rectangle(0, (bounds.Height - imageSize.Height) / 2, imageSize.Width, imageSize.Height); } // Draw Text only if needed textDrawRect = Rectangle.Empty; if (button.ButtonStyle != eButtonStyle.Default || !bHasImage) { if (imageDrawRect.Right > 0) { bounds.Width = (int)textSize.Width + 1; textDrawRect = new Rectangle(imageDrawRect.Right - 2, 2, bounds.Width, bounds.Height - 4); } else { bounds.Width = (int)textSize.Width + 6; if (!bHasImage && button.IsOnMenuBar) { bounds.Width += 6; textDrawRect = new Rectangle(2, 2, bounds.Width, bounds.Height - 4); } else textDrawRect = new Rectangle(2, 2, bounds.Width + button.HorizontalPadding - 4, bounds.Height - 4); } } bounds.Width += imageDrawRect.Right; if (imagePosition == eImagePosition.Right && imageDrawRect.Right > 0 && bHasImage) { textDrawRect.X = 3; imageDrawRect.X = bounds.Width - imageDrawRect.Width; } // Add Horizontal padding bounds.Width += button.HorizontalPadding; } else { // Image is on top or bottom // Calculate width, that is easy if (button.Orientation == eOrientation.Horizontal) { if (textSize.Width > imageSize.Width) bounds.Width = (int)textSize.Width + button.ImagePaddingHorizontal; else bounds.Width = imageSize.Width + button.ImagePaddingHorizontal; // Calculate item height 3 padding on top and bottom and 2 pixels distance between the image and text bounds.Height = (int)(imageSize.Height + textSize.Height + button.ImagePaddingVertical /*10*/); // Add Horizontal/Vertical padding bounds.Width += button.HorizontalPadding; bounds.Height += button.VerticalPadding; if (imagePosition == eImagePosition.Top) { imageDrawRect = new Rectangle(0, button.VerticalPadding / 2 + 2, bounds.Width, imageSize.Height/*+2*/); textDrawRect = new Rectangle((int)(bounds.Width - textSize.Width) / 2, imageDrawRect.Bottom, (int)textSize.Width, (int)textSize.Height + 5); } else { textDrawRect = new Rectangle((int)(bounds.Width - textSize.Width) / 2, button.VerticalPadding / 2, (int)textSize.Width, (int)textSize.Height + 2); imageDrawRect = new Rectangle(0, textDrawRect.Bottom, bounds.Width, imageSize.Height + 5); } } else { if (textSize.Height > imageSize.Width && button.ButtonStyle != eButtonStyle.Default) bounds.Width = (int)textSize.Height + 6; else bounds.Width = imageSize.Width + 10; // Add Horizontal Padding bounds.Width += button.HorizontalPadding; // Calculate item height 3 padding on top and bottom and 2 pixels distance between the image and text if (button.ButtonStyle != eButtonStyle.Default || !bHasImage) { if (bHasImage) bounds.Height = (int)(imageSize.Height + textSize.Width + 12); else bounds.Height = (int)(textSize.Width + 6); } else bounds.Height = imageSize.Height + 6; if (imagePosition == eImagePosition.Top || imagePosition == eImagePosition.Left) { if (bHasImage) imageDrawRect = new Rectangle(0, 0, bounds.Width, imageSize.Height + 6); textDrawRect = new Rectangle((int)(bounds.Width - textSize.Height) / 2, imageDrawRect.Bottom + 2, (int)textSize.Height, (int)textSize.Width + 5); } else { textDrawRect = new Rectangle((int)(bounds.Width - textSize.Height) / 2, 5, (int)textSize.Height, (int)textSize.Width + 5); if (bHasImage) imageDrawRect = new Rectangle(0, textDrawRect.Bottom - 3, bounds.Width, imageSize.Height + 5); } // Add Vertical Padding bounds.Height += button.VerticalPadding; } } if (HasExpandPart(button)) { subItemsRect = GetSubItemsButtonBounds(button, bounds, rightToLeft); // Add small button to expand the item Rectangle rTemp = subItemsRect; rTemp.Offset(bounds.Location); if (rightToLeft && !(objCtrl is RibbonBar && (button.ImagePosition == eImagePosition.Top || button.ImagePosition == eImagePosition.Bottom))) { if (!textDrawRect.IsEmpty) textDrawRect.Offset(subItemsRect.Width + 1, 0); if (!imageDrawRect.IsEmpty && (button.Orientation == eOrientation.Horizontal && (imagePosition == eImagePosition.Left || imagePosition == eImagePosition.Right))) imageDrawRect.Offset(subItemsRect.Width, 0); bounds.X += subItemsRect.Width; } bounds = Rectangle.Union(bounds, rTemp); } } } finally { g.TextRenderingHint = TextRenderingHint.SystemDefault; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.Default; g.Dispose(); } objCtrl = null; button.SetDisplayRectangle(bounds); button.ImageDrawRect = imageDrawRect; button.TextDrawRect = textDrawRect; button.SubItemsRect = subItemsRect; }