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 override void PaintButton(ButtonItem button, ItemPaintArgs pa) { bool isOnMenu=IsOnMenu(button, pa); if(isOnMenu && button.Parent is ItemContainer) isOnMenu=false; bool bIsOnMenuBar=pa.IsOnMenuBar; bool bThemed=button.IsThemed; Graphics g = pa.Graphics; Region oldClip = g.Clip as Region; try { g.SetClip(button.DisplayRectangle, CombineMode.Intersect); if (!pa.IsOnMenu && !bIsOnMenuBar && bThemed) { if (pa.ContainerControl is ButtonX) ThemedButtonXPainter.PaintButton(button, pa); else ThemedButtonItemPainter.PaintButton(button, pa); return; } Rectangle itemRect = button.DisplayRectangle; Color textColor = GetTextColor(button, pa); CompositeImage image = button.GetImage(textColor); Rectangle imageRect = GetImageRectangle(button, pa, image); PaintButtonBackground(button, pa, image); Rectangle customizeCheckRect = GetCustomizeMenuCheckRectangle(button, pa); Rectangle checkRect = GetCheckRectangle(button, pa, image); Rectangle mouseOverRect = GetMouseOverRectangle(button, pa, image); bool mouseOver = button.IsMouseOver; if (button.Expanded && !isOnMenu) mouseOver = false; if (isOnMenu && button.Expanded && pa.ContainerControl != null && pa.ContainerControl.Parent != null) { if (!pa.ContainerControl.Parent.Bounds.Contains(System.Windows.Forms.Control.MousePosition)) mouseOver = true; } if (button.HotTrackingStyle != eHotTrackingStyle.None) { if (mouseOver || button.IsMouseDown && !button.DesignMode) PaintButtonMouseOver(button, pa, image, mouseOverRect); } if (isOnMenu && button.IsOnCustomizeMenu && button.Visible && !button.SystemItem) PaintCustomizeCheck(button, pa, customizeCheckRect); if (button.Checked && !button.IsOnCustomizeMenu && (button.GetEnabled(pa.ContainerControl) || isOnMenu)) PaintButtonCheck(button, pa, image, checkRect); if ((image != null || !string.IsNullOrEmpty(button.Symbol)) && button.ButtonStyle != eButtonStyle.TextOnlyAlways) PaintButtonImage(button, pa, image, imageRect); if (!(button is ApplicationButton) || button.EffectiveStyle == eDotNetBarStyle.Office2010 || button.EffectiveStyle == eDotNetBarStyle.Metro) PaintButtonText(button, pa, textColor, image); PaintExpandButton(button, pa); if (button.Focused && button.DesignMode) { Rectangle r = itemRect; r.Inflate(-1, -1); DesignTime.DrawDesignTimeSelection(g, r, pa.Colors.ItemDesignTimeBorder); } if (image != null) image.Dispose(); } finally { if (oldClip != null) { g.Clip = oldClip; oldClip.Dispose(); } else g.ResetClip(); } }
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; }
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; }
/// <summary> /// Arranges the button inner parts when button size has changed externally. /// </summary> /// <param name="button">Button to arrange inner parts for.</param> public static void Arrange(ButtonItem button) { int minTextSize = 8; bool isOnMenu = button.IsOnMenu; if (isOnMenu && button.Parent is ItemContainer) isOnMenu = false; bool hasImage = false; Size imageSize = Size.Empty; if (!string.IsNullOrEmpty(button.Symbol)) { hasImage = true; imageSize = button.ImageSize; } else { using (CompositeImage buttonImage = button.GetImage()) { if (buttonImage != null) hasImage = true; } imageSize = GetLayoutImageSize(button, hasImage, isOnMenu, false); } bool rightToLeft = button.IsRightToLeft; Rectangle bounds = button.DisplayRectangle; if (isOnMenu) { // Add 4 pixel padding to the image size, 2 pixels on each side imageSize.Height += 2; imageSize.Width += 7; // Center image if any... //if (rightToLeft) //{ // if (button.IsOnCustomizeMenu) // button.ImageDrawRect = new Rectangle(bounds.Width - (imageSize.Width + bounds.Height + 2), Math.Max(0, (bounds.Height - imageSize.Height) / 2), imageSize.Width, imageSize.Height); // else // button.ImageDrawRect = new Rectangle(bounds.Width - imageSize.Width - 1, Math.Max(0, (bounds.Height - imageSize.Height) / 2), imageSize.Width, imageSize.Height); //} //else { if (button.IsOnCustomizeMenu && !rightToLeft) button.ImageDrawRect = new Rectangle(bounds.Height + 2, Math.Max(0, (bounds.Height - imageSize.Height) / 2), imageSize.Width, imageSize.Height); else button.ImageDrawRect = new Rectangle(0, Math.Max(0, (bounds.Height - imageSize.Height) / 2), imageSize.Width, imageSize.Height); } //if (rightToLeft) // button.TextDrawRect = new Rectangle(Math.Max(0, button.ImageDrawRect.X - button.TextDrawRect.Width - 2), Math.Max(0, (bounds.Height - button.TextDrawRect.Height) / 2), button.TextDrawRect.Width, button.TextDrawRect.Height); //else button.TextDrawRect = new Rectangle(button.ImageDrawRect.Right + 8, Math.Max(0, (bounds.Height - button.TextDrawRect.Height) / 2), button.TextDrawRect.Width, button.TextDrawRect.Height); return; } int x = 0; if (!button.SubItemsRect.IsEmpty) { Rectangle subItemsRect = button.SubItemsRect; if (button.ContainerControl is RibbonBar && (button.ImagePosition == eImagePosition.Top || button.ImagePosition == eImagePosition.Bottom)) { subItemsRect = new Rectangle(0, bounds.Height - subItemsRect.Height, bounds.Width, subItemsRect.Height); bounds.Height -= subItemsRect.Height; } else { if (button.Orientation == eOrientation.Horizontal) { if (rightToLeft) { subItemsRect = new Rectangle(0, 0, subItemsRect.Width, bounds.Height); //bounds.Width -= subItemsRect.Width; //bounds.X += subItemsRect.Width; x = subItemsRect.Width; } else { subItemsRect = new Rectangle(bounds.Width - subItemsRect.Width, 0, subItemsRect.Width, bounds.Height); bounds.Width -= subItemsRect.Width; } } else { subItemsRect = new Rectangle(0, 0, bounds.Width, subItemsRect.Height); bounds.Height -= subItemsRect.Height; } } button.SubItemsRect = subItemsRect; } if (!hasImage || button.ButtonStyle == eButtonStyle.TextOnlyAlways) { int newHeight = bounds.Height - 2; button.TextDrawRect = new Rectangle(2, Math.Max(0, (bounds.Height - newHeight) / 2), bounds.Width - 4, newHeight); return; } else if (button.ButtonStyle == eButtonStyle.Default && !(button.ImagePosition == eImagePosition.Top || button.ImagePosition == eImagePosition.Bottom) || bounds.Width < imageSize.Width + minTextSize) { // Display image only in center of the button button.ImageDrawRect = new Rectangle(Math.Max(0, (bounds.Width - button.ImageDrawRect.Width) / 2), Math.Max(0, (bounds.Height - button.ImageDrawRect.Height) / 2), button.ImageDrawRect.Width, button.ImageDrawRect.Height); if (bounds.Width < imageSize.Width + minTextSize) button.TextDrawRect = Rectangle.Empty; return; } // Displays both image and text if (button.ImagePosition == eImagePosition.Left && !rightToLeft || button.ImagePosition == eImagePosition.Right && rightToLeft) { button.ImageDrawRect = new Rectangle(0, Math.Max(0, (bounds.Height - button.ImageDrawRect.Height) / 2), button.ImageDrawRect.Width, button.ImageDrawRect.Height); button.TextDrawRect = new Rectangle(button.ImageDrawRect.Right - 2, Math.Max(0, (bounds.Height - button.TextDrawRect.Height) / 2), Math.Min(button.TextDrawRect.Width, bounds.Width - (button.ImageDrawRect.Right - 2)), button.TextDrawRect.Height); } else if (button.ImagePosition == eImagePosition.Right && !rightToLeft || button.ImagePosition == eImagePosition.Left && rightToLeft) { button.ImageDrawRect = new Rectangle(bounds.Width - button.ImageDrawRect.Width, Math.Max(0, (bounds.Height - button.TextDrawRect.Height) / 2), button.ImageDrawRect.Width, button.ImageDrawRect.Height); button.TextDrawRect = new Rectangle(Math.Max(x, button.ImageDrawRect.X - button.TextDrawRect.Width + 2), Math.Max(0, (bounds.Height - button.TextDrawRect.Height) / 2), Math.Min(button.TextDrawRect.Width, button.ImageDrawRect.X), button.TextDrawRect.Height); } else if (button.ImagePosition == eImagePosition.Top) { int y = Math.Max(2, (bounds.Height - (button.TextDrawRect.Height + button.ImageDrawRect.Height - 2)) / 2); if (button.Name != "sysOverflowButton" && button.Parent is ItemContainer && ((ItemContainer)button.Parent).LayoutOrientation == eOrientation.Horizontal && ((ItemContainer)button.Parent).VerticalItemAlignment == eVerticalItemsAlignment.Top) y = 2; button.ImageDrawRect = new Rectangle(0, y, bounds.Width, button.ImageDrawRect.Height); button.TextDrawRect = new Rectangle(Math.Max(0, (bounds.Width - button.TextDrawRect.Width) / 2), button.ImageDrawRect.Bottom, button.TextDrawRect.Width, button.TextDrawRect.Height); } else if (button.ImagePosition == eImagePosition.Bottom) { int y = Math.Max(0, (bounds.Height - (button.TextDrawRect.Height + button.ImageDrawRect.Height - 2)) / 2); //button.ImageDrawRect = new Rectangle(Math.Max(0, (bounds.Width - button.ImageDrawRect.Width) / 2), bounds.Height - y - button.ImageDrawRect.Height, // button.ImageDrawRect.Width, button.ImageDrawRect.Height); button.ImageDrawRect = new Rectangle(0, bounds.Height - y - button.ImageDrawRect.Height, bounds.Width, button.ImageDrawRect.Height); button.TextDrawRect = new Rectangle(Math.Max(0, (bounds.Width - button.ImageDrawRect.Width) / 2), Math.Max(0, button.ImageDrawRect.Y + 2 - button.TextDrawRect.Height), button.TextDrawRect.Width, Math.Min(button.TextDrawRect.Height, button.ImageDrawRect.Y)); } }