using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Drawing.Text; namespace DevComponents.DotNetBar { /// /// Represents class for displaying BubbleButton objects on canvas. /// internal class BubbleButtonDisplay { static int BUTTON_TOOLTIP_SPACING=3; /// /// Paints button on given canvas. /// /// Painting information. public static void Paint(BubbleButtonDisplayInfo info) { if(!info.Button.Visible) return; CompositeImage image=null; Rectangle buttonRectangle=Rectangle.Empty; if(info.Magnified) { buttonRectangle=info.Button.MagnifiedDisplayRectangle; image=GetButtonImage(info.Button,buttonRectangle.Size); } else { buttonRectangle=info.Button.DisplayRectangle; image=GetButtonImage(info.Button,buttonRectangle.Size); } if (buttonRectangle.Width < 2 || buttonRectangle.Height < 2) return; if(image!=null) { if(!info.Button.Enabled) image.DrawImage(info.Graphics,buttonRectangle,0,0,image.ActualWidth,image.ActualHeight,GraphicsUnit.Pixel,GetDisabledAttributes()); else if(info.Button.MouseDown) image.DrawImage(info.Graphics,buttonRectangle,0,0,image.ActualWidth,image.ActualHeight,GraphicsUnit.Pixel,GetDarkAttributes()); else image.DrawImage(info.Graphics,buttonRectangle); } else info.Graphics.DrawRectangle(SystemPens.Highlight,buttonRectangle); if(info.Button.Focus) { buttonRectangle.Inflate(1,1); DesignTime.DrawDesignTimeSelection(info.Graphics,buttonRectangle,Color.Navy); } DrawTooltip(info); } public static CompositeImage GetButtonImage(BubbleButton button, Size size) { CompositeImage image=null; if(button.Image!=null) { if(button.Image.Size==size || button.ImageLarge==null) image=new CompositeImage(button.Image,false,size); else if(button.ImageLarge!=null && (button.ImageLarge.Size==size || button.ImageLarge.Size.Height/size.Height<2)) image=new CompositeImage(button.ImageLarge,false,size); else image=new CompositeImage(button.Image,false,size); } else if(button.ImageCached!=null) { if(button.ImageCached.Size==size || button.ImageLargeCached==null) image=new CompositeImage(button.ImageCached,false,size); else if(button.ImageLargeCached!=null && button.ImageLargeCached.Size.Height/size.Height<=2) image=new CompositeImage(button.ImageLargeCached,false,size); else image=new CompositeImage(button.ImageCached,false,size); } // else if(button.Icon!=null) // { // // } return image; } private static void DrawTooltip(BubbleButtonDisplayInfo info) { //float emMulti=1.3285f; if(info.Button.MouseOver && info.BubbleBar.ShowTooltips && info.Button.TooltipText!="") { Color textColor = info.BubbleBar.TooltipTextColor; Color outlineColor = info.BubbleBar.TooltipOutlineColor; StringFormat format = TextDrawing.GetStringFormat(eTextFormat.Default); // BarFunctions.CreateStringFormat(); System.Drawing.Drawing2D.CompositingMode cs=info.Graphics.CompositingMode=System.Drawing.Drawing2D.CompositingMode.SourceOver; Font font=info.BubbleBar.TooltipFont; if(font==null) font=info.BubbleBar.Font; Rectangle rText=info.Button.DisplayRectangle; Size size = TextDrawing.MeasureString(info.Graphics, info.Button.TooltipText, font); if(info.Magnified) rText=info.Button.MagnifiedDisplayRectangle; if(info.Alignment==eBubbleButtonAlignment.Bottom) rText.Y-=(Math.Max(font.Height, size.Height)+BUTTON_TOOLTIP_SPACING); else rText.Y=rText.Bottom+BUTTON_TOOLTIP_SPACING; rText.Offset(-(size.Width-rText.Width)/2,0); Size tooltipSize = TextDrawing.MeasureString(info.Graphics, info.Button.TooltipText, font); Rectangle outline = rText; outline.Size = tooltipSize; outline.Inflate(2, 2); using (SolidBrush brush = new SolidBrush(Color.FromArgb(200, outlineColor))) DisplayHelp.FillRoundedRectangle(info.Graphics, brush, outline, 3); //Point pOutline=rText.Location; //pOutline.Offset(-1,0); //GraphicsPath path=new GraphicsPath(); //path.AddString(info.Button.TooltipText,font.FontFamily,(int)font.Style,font.SizeInPoints/*font.SizeInPoints*emMulti*/,new PointF((pOutline.X+1)*72/info.Graphics.DpiX,(pOutline.Y-1)*72/info.Graphics.DpiY),format); //using(Pen pen=new Pen(outlineColor,(font.SizeInPoints>=10?1:1))) // path.Widen(pen); //using(SolidBrush brush=new SolidBrush(Color.FromArgb(200,outlineColor))) //{ // GraphicsUnit pageUnit=info.Graphics.PageUnit; // info.Graphics.PageUnit=GraphicsUnit.Point; // info.Graphics.FillPath(brush,path); // info.Graphics.PageUnit=pageUnit; //} //path.Dispose(); //path=new GraphicsPath(); //path.AddString(info.Button.TooltipText,font.FontFamily,(int)font.Style,font.SizeInPoints/*font.SizeInPoints*emMulti*/,new PointF(pOutline.X*72/info.Graphics.DpiX,pOutline.Y*72/info.Graphics.DpiY),format); //path.Widen(SystemPens.ControlText); //using(SolidBrush brush=new SolidBrush(Color.FromArgb(200,outlineColor))) //{ // GraphicsUnit pageUnit=info.Graphics.PageUnit; // info.Graphics.PageUnit=GraphicsUnit.Point; // info.Graphics.FillPath(brush,path); // info.Graphics.PageUnit=pageUnit; //} //path.Dispose(); TextDrawing.DrawString(info.Graphics,info.Button.TooltipText,font,textColor,rText.X,rText.Y,eTextFormat.Default); info.Graphics.CompositingMode=cs; format.Dispose(); } } private static ImageAttributes GetDarkAttributes() { float[][] array = new float[5][]; // array[0] = new float[5] {1, 0, 0, 0, 0}; // array[1] = new float[5] {0, 1, 0, 0, 0}; // array[2] = new float[5] {0, 0, 1, 0, 0}; // array[3] = new float[5] {0, 0, 1, 0, 0}; // array[4] = new float[5] {.5f, .5f, .5f, 0, 1}; array[0] = new float[5] {.65f, 0, 0, 0, 0}; array[1] = new float[5] {0, .65f, 0, 0, 0}; array[2] = new float[5] {0, 0, .65f, 0, 0}; array[3] = new float[5] {0, 0, 0, 1, 0}; array[4] = new float[5] {0, 0, 0, 0, .65f}; ColorMatrix grayMatrix = new ColorMatrix(array); ImageAttributes darkImageAttr = new ImageAttributes(); darkImageAttr.ClearColorKey(); darkImageAttr.SetColorMatrix(grayMatrix); return darkImageAttr; } private static ImageAttributes GetDisabledAttributes() { float[][] array = new float[5][]; array[0] = new float[5] {0.5f, 0.5f, 0.5f, 0.0f, 0.0f}; array[1] = new float[5] {0.5f, 0.5f, 0.5f, 0.0f, 0.0f}; array[2] = new float[5] {0.5f, 0.5f, 0.5f, 0.0f, 0.0f}; array[3] = new float[5] {0.0f, 0.0f, 0.0f, 1.0f, 0.0f}; array[4] = new float[5] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f}; //ColorMatrix grayMatrix = new ColorMatrix(array); ColorMatrix grayMatrix = new ColorMatrix(); grayMatrix.Matrix00 = 1/3f; grayMatrix.Matrix01 = 1/3f; grayMatrix.Matrix02 = 1/3f; grayMatrix.Matrix10 = 1/3f; grayMatrix.Matrix11 = 1/3f; grayMatrix.Matrix12 = 1/3f; grayMatrix.Matrix20 = 1/3f; grayMatrix.Matrix21 = 1/3f; grayMatrix.Matrix22 = 1/3f; grayMatrix.Matrix33 = .5f; // Alpha-channel ImageAttributes darkImageAttr = new ImageAttributes(); darkImageAttr.ClearColorKey(); darkImageAttr.SetColorMatrix(grayMatrix); return darkImageAttr; } } #region BubbleButtonDisplayInfo /// /// Represents class that holds information for BubbleButton painting. /// public class BubbleButtonDisplayInfo { /// /// Graphics object. /// public Graphics Graphics=null; /// /// Button to paint. /// public BubbleButton Button=null; /// /// Reference to BubbleBar control. /// public BubbleBar BubbleBar=null; /// /// Gets or sets whether magnified version of the button is painted. /// public bool Magnified=false; /// /// Gets or sets the button alignment inside of the bar. /// public eBubbleButtonAlignment Alignment=eBubbleButtonAlignment.Bottom; } #endregion }