using System; using System.Drawing; namespace DevComponents.DotNetBar { /// /// Summary description for ThemedButtonItemPainter. /// internal class ThemedButtonXPainter { public static void PaintButton(ButtonItem button, ItemPaintArgs pa) { System.Drawing.Graphics g = pa.Graphics; ThemeButton theme = pa.ThemeButton; ThemeButtonParts part = ThemeButtonParts.PushButton; ThemeButtonStates state = ThemeButtonStates.PushButtonNormal; Color textColor = ButtonItemPainterHelper.GetTextColor(button, pa); ButtonX buttonX = pa.ContainerControl as ButtonX; bool paintFocusCues = true; if (buttonX != null) paintFocusCues = buttonX.FocusCuesEnabled; Rectangle rectImage = Rectangle.Empty; Rectangle itemRect = button.DisplayRectangle; Font font = null; CompositeImage image = button.GetImage(); eTextFormat format = GetStringFormat(button, pa, image); font = button.GetFont(pa, false); bool bSplitButton = (button.SubItems.Count > 0 || button.PopupType == ePopupType.Container) && button.ShowSubItems && !button.SubItemsRect.IsEmpty; // 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 = ThemeButtonStates.PushButtonDisabled; } else if (button.IsMouseDown || button.Expanded) { state = ThemeButtonStates.PushButtonPressed; } else if (button.IsMouseOver && button.Checked) { state = ThemeButtonStates.PushButtonPressed; } else if (button.IsMouseOver) { state = ThemeButtonStates.PushButtonHot; } else if (button.Checked || button.Expanded) { state = ThemeButtonStates.PushButtonPressed; } else if (button.Focused || pa.ContainerControl.Focused) state = ThemeButtonStates.PushButtonDefaulted; 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 == ThemeButtonStates.PushButtonNormal && 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.ActualWidth, image.ActualHeight, GraphicsUnit.Pixel, att); } else if (state == ThemeButtonStates.PushButtonNormal && !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, button.TextDrawRect.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 && paintFocusCues && !pa.IsOnMenu && !pa.IsOnMenuBar) { Rectangle r = button.Bounds; r.Inflate(-3, -3); System.Windows.Forms.ControlPaint.DrawFocusRectangle(g, r); } } } // If it has subitems draw the triangle to indicate that if (bSplitButton) { ButtonItemPainter.PaintButtonExpandIndicator(button, pa); } if (image != null) image.Dispose(); } private static eTextFormat GetStringFormat(ButtonItem button, ItemPaintArgs pa, CompositeImage image) { eTextFormat stringFormat = pa.ButtonStringFormat; bool isOnMenu = IsOnMenu(button, pa); if (!isOnMenu) { if (image == null || button.ImagePosition == eImagePosition.Top || button.ImagePosition == eImagePosition.Bottom) stringFormat |= eTextFormat.HorizontalCenter; } return stringFormat; } private static bool IsOnMenu(ButtonItem button, ItemPaintArgs pa) { bool isOnMenu = pa.IsOnMenu; if (isOnMenu && button.Parent is ItemContainer) isOnMenu = false; return isOnMenu; } } }