239 lines
10 KiB
C#
239 lines
10 KiB
C#
|
using ryControls;
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.Drawing;
|
|||
|
using System.Drawing.Drawing2D;
|
|||
|
using System.Text;
|
|||
|
|
|||
|
namespace BrightIdeasSoftware.Rendering
|
|||
|
{
|
|||
|
|
|||
|
enum buttonStyle
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 正常为选中按钮
|
|||
|
/// </summary>
|
|||
|
ButtonNormal,
|
|||
|
/// <summary>
|
|||
|
/// 获得焦点的按钮
|
|||
|
/// </summary>
|
|||
|
ButtonFocuse,
|
|||
|
/// <summary>
|
|||
|
/// 鼠标经过样式
|
|||
|
/// </summary>
|
|||
|
ButtonMouseOver,
|
|||
|
/// <summary>
|
|||
|
/// 获得焦点并鼠标经过
|
|||
|
/// </summary>
|
|||
|
ButtonFocuseAndMouseOver
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// 自定义GDI工具,绘制按钮
|
|||
|
/// </summary>
|
|||
|
class Util_GDI
|
|||
|
{
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 绘制圆形按钮(用法同矩形按钮)
|
|||
|
/// </summary>
|
|||
|
/// <param name="text"></param>
|
|||
|
/// <param name="g"></param>
|
|||
|
/// <param name="Location"></param>
|
|||
|
/// <param name="r"></param>
|
|||
|
/// <param name="btnStyle"></param>
|
|||
|
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);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
/// <summary>
|
|||
|
/// 绘制圆角按钮
|
|||
|
/// </summary>
|
|||
|
/// <param name="Text">要绘制的文字</param>
|
|||
|
/// <param name="g">Graphics 对象</param>
|
|||
|
/// <param name="rect">要填充的矩形</param>
|
|||
|
/// <param name="btnStyle"></param>
|
|||
|
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;
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 根据普通矩形得到圆角矩形的路径
|
|||
|
/// </summary>
|
|||
|
/// <param name="rectangle">原始矩形</param>
|
|||
|
/// <param name="r">半径</param>
|
|||
|
/// <returns>图形路径</returns>
|
|||
|
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;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|