------ #### MyDb V2.1.2102.1101 - *.[新增]新增Auto类,增加 鼠标模拟操作和按键模拟操作。 - *.[新增]新增WinAPI命名空间,将windows自带的API集中在这个命名空间。
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;
|
||
}
|
||
|
||
}
|
||
}
|