using ryControls; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Text; namespace BrightIdeasSoftware.Rendering { enum buttonStyle { /// /// 正常为选中按钮 /// ButtonNormal, /// /// 获得焦点的按钮 /// ButtonFocuse, /// /// 鼠标经过样式 /// ButtonMouseOver, /// /// 获得焦点并鼠标经过 /// ButtonFocuseAndMouseOver } /// /// 自定义GDI工具,绘制按钮 /// class Util_GDI { /// /// 绘制圆形按钮(用法同矩形按钮) /// /// /// /// /// /// public static void DrawCircleButton(string text, Graphics g, Point Location, int r, buttonStyle btnStyle) { Graphics Gcircle = g; Rectangle rect = new Rectangle(Location.X, Location.Y, r, r); Pen p = new Pen(new SolidBrush(Color.Black)); Gcircle.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; Gcircle.DrawEllipse(p, rect); if (btnStyle == buttonStyle.ButtonFocuse) { Gcircle.FillEllipse(new SolidBrush(ColorTranslator.FromHtml("#338FCC")), rect); } else if (btnStyle == buttonStyle.ButtonMouseOver) { Gcircle.FillEllipse(new SolidBrush(ColorTranslator.FromHtml("#EAC100")), rect); } else if (btnStyle == buttonStyle.ButtonFocuseAndMouseOver) { Gcircle.FillEllipse(new SolidBrush(ColorTranslator.FromHtml("#EAC100")), rect); } p.DashStyle = DashStyle.Dash; if (btnStyle != buttonStyle.ButtonNormal) { Gcircle.DrawEllipse(p, new Rectangle(rect.X + 2, rect.Y + 2, rect.Width - 4, rect.Height - 4));//虚线框 } Gcircle.FillEllipse(new SolidBrush(Color.WhiteSmoke), new Rectangle(rect.X + 3, rect.Y + 3, rect.Width - 6, rect.Height - 6)); StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Center; sf.LineAlignment = StringAlignment.Center; Gcircle.DrawString(text, new Font(new FontFamily("宋体"), 10), new SolidBrush(Color.Black), rect, sf); p.Dispose(); } public static Color GetColor(Color colorBase, int a, int r, int g, int b) { int a0 = colorBase.A; int r0 = colorBase.R; int g0 = colorBase.G; int b0 = colorBase.B; if (a + a0 > 255) { a = 255; } else { a = Math.Max(a + a0, 0); } if (r + r0 > 255) { r = 255; } else { r = Math.Max(r + r0, 0); } if (g + g0 > 255) { g = 255; } else { g = Math.Max(g + g0, 0); } if (b + b0 > 255) { b = 255; } else { b = Math.Max(b + b0, 0); } return Color.FromArgb(a, r, g, b); } public static void DrawButtonX(string Text, Graphics g, Rectangle rect, Color ForeColor, Color baseColor, Color borderColor, Color innerBorderColor, RoundStyle style, int roundWidth, bool drawBorder) { RenderBackgroundInternal(g, rect, baseColor, borderColor, innerBorderColor, style, roundWidth, 0.35f, drawBorder, false, LinearGradientMode.Vertical); StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Center; sf.LineAlignment = StringAlignment.Center; g.DrawString(Text, new Font("宋体", 10), new SolidBrush(ForeColor), rect, sf); } private static void RenderBackgroundInternal( Graphics g, Rectangle rect, Color baseColor, Color borderColor, Color innerBorderColor, RoundStyle style, int roundWidth,//圆角半径 float basePosition, bool drawBorder, bool drawGlass, LinearGradientMode mode) { if (drawBorder)//是否画边框 { rect.Width--; rect.Height--; } using (LinearGradientBrush brush = new LinearGradientBrush(rect, Color.Transparent, Color.Transparent, mode)) { Color[] colors = new Color[4]; colors[0] = GetColor(baseColor, 0, 35, 24, 9); colors[1] = GetColor(baseColor, 0, 0, 0, 0); colors[2] = baseColor; colors[3] = GetColor(baseColor, 0, 0, 0, 0); ColorBlend blend = new ColorBlend(); blend.Positions = new float[] { 0.0f, basePosition, basePosition, 1.0f }; blend.Colors = colors; brush.InterpolationColors = blend; if (style != RoundStyle.None) { using (GraphicsPath path = ryControls.Drawing.CreatePath(rect, roundWidth, style, false)) { g.FillPath(brush, path); } if (baseColor.A > 80) { Rectangle rectTop = rect; if (mode == LinearGradientMode.Vertical) { // rectTop.Height = (int)(rectTop.Height * basePosition); } else { // rectTop.Width = (int)(rect.Width * basePosition); } using (GraphicsPath pathTop = ryControls.Drawing.CreatePath( rectTop, roundWidth, RoundStyle.Top, false)) { using (SolidBrush brushAlpha = new SolidBrush(Color.FromArgb(80, 255, 255, 255))) { g.FillPath(brushAlpha, pathTop); } } } } } } /// /// 绘制圆角按钮 /// /// 要绘制的文字 /// Graphics 对象 /// 要填充的矩形 /// public static void DrawRoundButton(string Text, Graphics g, Rectangle rect, buttonStyle btnStyle) { //g.Clear(Color.White); g.SmoothingMode = SmoothingMode.AntiAlias;//消除锯齿 Rectangle rectangle = rect; Brush b = b = new SolidBrush(Color.Gray); if (btnStyle == buttonStyle.ButtonFocuse) { b = new SolidBrush(ColorTranslator.FromHtml("#338FCC")); } else if (btnStyle == buttonStyle.ButtonMouseOver) { b = new SolidBrush(ColorTranslator.FromHtml("#C6A300")); } else if (btnStyle == buttonStyle.ButtonFocuseAndMouseOver) { b = new SolidBrush(ColorTranslator.FromHtml("#C6A300")); } g.DrawPath(new Pen(b), GetRoundRectangle(rectangle, 2)); rectangle = new Rectangle(rect.X + 2, rect.Y + 2, rect.Width - 4, rect.Height - 4); Pen p = new Pen(Color.Gray, 0.5f); p.DashStyle = DashStyle.Dash; if (btnStyle == buttonStyle.ButtonFocuse || btnStyle == buttonStyle.ButtonFocuseAndMouseOver) { g.DrawRectangle(p, rectangle);//虚线框 } g.FillRectangle(new SolidBrush(Color.Green), rectangle);//白色背景 StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Center; sf.LineAlignment = StringAlignment.Center; g.DrawString(Text, new Font("宋体", 10), new SolidBrush(Color.White), rectangle, sf); p.Dispose(); b.Dispose(); g.SmoothingMode = SmoothingMode.Default; } /// /// 根据普通矩形得到圆角矩形的路径 /// /// 原始矩形 /// 半径 /// 图形路径 private static GraphicsPath GetRoundRectangle(Rectangle rectangle, int r) { int l = 2 * r; // 把圆角矩形分成八段直线、弧的组合,依次加到路径中 GraphicsPath gp = new GraphicsPath(); gp.AddLine(new Point(rectangle.X + r, rectangle.Y), new Point(rectangle.Right - r, rectangle.Y)); gp.AddArc(new Rectangle(rectangle.Right - l, rectangle.Y, l, l), 270F, 90F); gp.AddLine(new Point(rectangle.Right, rectangle.Y + r), new Point(rectangle.Right, rectangle.Bottom - r)); gp.AddArc(new Rectangle(rectangle.Right - l, rectangle.Bottom - l, l, l), 0F, 90F); gp.AddLine(new Point(rectangle.Right - r, rectangle.Bottom), new Point(rectangle.X + r, rectangle.Bottom)); gp.AddArc(new Rectangle(rectangle.X, rectangle.Bottom - l, l, l), 90F, 90F); gp.AddLine(new Point(rectangle.X, rectangle.Bottom - r), new Point(rectangle.X, rectangle.Y + r)); gp.AddArc(new Rectangle(rectangle.X, rectangle.Y, l, l), 180F, 90F); return gp; } } }