* 增加XML文档文件

This commit is contained in:
Sunny 2022-06-30 10:20:53 +08:00
parent 513c8cf171
commit 307ace2d85
10 changed files with 463 additions and 120 deletions

View File

@ -108,6 +108,10 @@ namespace Sunny.UI
/// </summary>
public uint ImportantColors { get; set; }
/// <summary>
/// 以图片初始化类
/// </summary>
/// <param name="bitmap">图片</param>
public void Init(Bitmap bitmap)
{
Head = 0x4D42;
@ -123,6 +127,11 @@ namespace Sunny.UI
FileSize = BitmapDataOffset + BitmapDataSize;
}
/// <summary>
/// 以宽高初始化类
/// </summary>
/// <param name="width">宽</param>
/// <param name="height">高</param>
public void Init(int width, int height)
{
Head = 0x4D42;
@ -139,6 +148,9 @@ namespace Sunny.UI
}
}
/// <summary>
/// 24bit 真彩色位图文件
/// </summary>
public class BmpFile
{
BmpHead head;
@ -205,13 +217,24 @@ namespace Sunny.UI
}
}
/// <summary>
/// 二进制数据
/// </summary>
public byte[] Data => data;
/// <summary>
/// 保存文件
/// </summary>
/// <param name="fileName">文件名</param>
public void SaveToFile(string fileName)
{
File.WriteAllBytes(fileName, data);
}
/// <summary>
/// 图片
/// </summary>
/// <returns>图片</returns>
public Bitmap Bitmap()
{
MemoryStream ms = new MemoryStream(data);

View File

@ -36,6 +36,11 @@ namespace Sunny.UI
/// </summary>
public static class ControlEx
{
/// <summary>
/// 定时器重置
/// </summary>
/// <param name="timer">定时器</param>
/// <returns>定时器</returns>
public static Timer ReStart(this Timer timer)
{
timer.Stop();
@ -43,26 +48,51 @@ namespace Sunny.UI
return timer;
}
/// <summary>
/// 控件是否为空
/// </summary>
/// <param name="ctrl">控件</param>
/// <returns>是否为空</returns>
public static bool IsNull(this Control ctrl)
{
return ctrl == null;
}
/// <summary>
/// 控件是否有效
/// </summary>
/// <param name="ctrl">控件</param>
/// <returns>是否有效</returns>
public static bool IsValid(this Control ctrl)
{
return ctrl != null;
}
/// <summary>
/// 控件位于屏幕的区域
/// </summary>
/// <param name="ctrl">控件</param>
/// <returns>区域</returns>
public static Rectangle ScreenRectangle(this Control ctrl)
{
return ctrl.RectangleToScreen(ctrl.ClientRectangle);
}
/// <summary>
/// 控件位于屏幕的位置
/// </summary>
/// <param name="ctrl">控件</param>
/// <returns>位置</returns>
public static Point ScreenLocation(this Control ctrl)
{
return ctrl.PointToScreen(new Point(0, 0));
}
/// <summary>
/// 控件的根窗体
/// </summary>
/// <param name="ctrl">控件</param>
/// <returns>根窗体</returns>
public static Form RootForm(this Control ctrl)
{
if (ctrl == null) return null;
@ -74,11 +104,21 @@ namespace Sunny.UI
return ctrl as Form;
}
/// <summary>
/// 设置控件位于容器的中心
/// </summary>
/// <param name="ctrl">控件</param>
/// <returns>控件</returns>
public static Control SetToTheCenterOfParent(this Control ctrl)
{
return ctrl.SetToTheHorizontalCenterOfParent().SetToTheVerticalCenterOfParent();
}
/// <summary>
/// 设置控件位于容器的水平方向的中心
/// </summary>
/// <param name="ctrl">控件</param>
/// <returns>控件</returns>
public static Control SetToTheHorizontalCenterOfParent(this Control ctrl)
{
if (ctrl != null && ctrl.Parent != null)
@ -87,6 +127,11 @@ namespace Sunny.UI
return ctrl;
}
/// <summary>
/// 设置控件位于容器的垂直方向的中心
/// </summary>
/// <param name="ctrl">控件</param>
/// <returns>控件</returns>
public static Control SetToTheVerticalCenterOfParent(this Control ctrl)
{
if (ctrl != null && ctrl.Parent != null)
@ -95,26 +140,11 @@ namespace Sunny.UI
return ctrl;
}
public static Form GetParentForm(this Control ctrl)
{
while (!IsForm(ctrl.Parent))
{
ctrl = ctrl.Parent;
}
return ctrl.Parent as Form;
}
private static bool IsForm(Control ctrl)
{
return ctrl is Form;
}
/// <summary>
/// 边框宽度
/// 窗体边框宽度
/// </summary>
/// <param name="form"></param>
/// <returns></returns>
/// <param name="form">窗体</param>
/// <returns>边框宽度</returns>
public static int BorderSize(this Form form)
{
return (form.Width - form.ClientSize.Width) / 2;
@ -123,8 +153,8 @@ namespace Sunny.UI
/// <summary>
/// 标题栏高度
/// </summary>
/// <param name="form"></param>
/// <returns></returns>
/// <param name="form">窗体</param>
/// <returns>标题栏高度</returns>
public static int TitleHeight(this Form form)
{
return (form.Height - form.ClientSize.Height) - form.BorderSize();

View File

@ -3,41 +3,124 @@ using System.Windows.Forms;
namespace Sunny.UI
{
/// <summary>
/// 日期控件选择类型
/// </summary>
public enum UIDateType
{
/// <summary>
/// 年月日
/// </summary>
YearMonthDay,
/// <summary>
/// 年月
/// </summary>
YearMonth,
/// <summary>
/// 年
/// </summary>
Year
}
/// <summary>
/// 接口
/// </summary>
public interface IToolTip
{
/// <summary>
/// 需要额外设置工具提示的控件
/// </summary>
/// <returns>控件</returns>
Control ExToolTipControl();
}
/// <summary>
/// 线头部类型
/// </summary>
public enum UILineCap
{
/// <summary>
/// 无
/// </summary>
None,
/// <summary>
/// 正方形
/// </summary>
Square,
/// <summary>
/// 菱形
/// </summary>
Diamond,
/// <summary>
/// 三角形
/// </summary>
Triangle,
/// <summary>
/// 圆形
/// </summary>
Circle
}
/// <summary>
/// 线型
/// </summary>
public enum UILineDashStyle
{
/// <summary>
/// 实线
/// </summary>
Solid,
/// <summary>
/// 虚线
/// </summary>
Dash,
/// <summary>
/// 由重复的点图案构成的直线
/// </summary>
Dot,
/// <summary>
/// 由重复的点划线图案构成的直线
/// </summary>
DashDot,
/// <summary>
/// 由重复的双点划线图案构成的直线
/// </summary>
DashDotDot,
/// <summary>
/// 自定义
/// </summary>
Custom,
/// <summary>
/// 不设置线型
/// </summary>
None
}
/// <summary>
/// 树节点绘制
/// </summary>
public class UITreeNodePainter
{
/// <summary>
/// 背景色
/// </summary>
public Color BackColor;
/// <summary>
/// 前景色
/// </summary>
public Color ForeColor;
}
}

View File

@ -20,14 +20,15 @@
******************************************************************************/
using Microsoft.Win32;
using System;
namespace Sunny.UI
{
/// <summary>
/// .Net版本
/// </summary>
public static class UEnvironment
{
// Checking the version using >= enables forward compatibility.
public static string CheckFor45PlusVersion(int releaseKey)
private static string CheckFor45PlusVersion(int releaseKey)
{
if (releaseKey >= 528040)
return "4.8 or later";
@ -54,6 +55,10 @@ namespace Sunny.UI
return "No 4.5 or later version detected";
}
/// <summary>
/// 检查.Net版本
/// </summary>
/// <returns>.Net版本</returns>
public static string CheckVersion()
{
const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\";
@ -69,87 +74,5 @@ namespace Sunny.UI
}
}
}
public static void CheckOtherVersion()
{
// Open the registry key for the .NET Framework entry.
using (RegistryKey ndpKey =
RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32)
.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\"))
{
foreach (var versionKeyName in ndpKey.GetSubKeyNames())
{
// Skip .NET Framework 4.5 version information.
if (versionKeyName == "v4")
{
continue;
}
if (versionKeyName.StartsWith("v"))
{
RegistryKey versionKey = ndpKey.OpenSubKey(versionKeyName);
// Get the .NET Framework version value.
var name = (string)versionKey.GetValue("Version", "");
// Get the service pack (SP) number.
var sp = versionKey.GetValue("SP", "").ToString();
// Get the installation flag.
var install = versionKey.GetValue("Install", "").ToString();
if (string.IsNullOrEmpty(install))
{
// No install info; it must be in a child subkey.
Console.WriteLine($"{versionKeyName} {name}");
}
else if (install == "1")
{
// Install = 1 means the version is installed.
if (!string.IsNullOrEmpty(sp))
{
Console.WriteLine($"{versionKeyName} {name} SP{sp}");
}
else
{
Console.WriteLine($"{versionKeyName} {name}");
}
}
if (!string.IsNullOrEmpty(name))
{
continue;
}
// else print out info from subkeys...
// Iterate through the subkeys of the version subkey.
foreach (var subKeyName in versionKey.GetSubKeyNames())
{
RegistryKey subKey = versionKey.OpenSubKey(subKeyName);
name = (string)subKey.GetValue("Version", "");
if (!string.IsNullOrEmpty(name))
sp = subKey.GetValue("SP", "").ToString();
install = subKey.GetValue("Install", "").ToString();
if (string.IsNullOrEmpty(install))
{
// No install info; it must be later.
Console.WriteLine($"{versionKeyName} {name}");
}
else if (install == "1")
{
if (!string.IsNullOrEmpty(sp))
{
Console.WriteLine($"{subKeyName} {name} SP{sp}");
}
else
{
Console.WriteLine($" {subKeyName} {name}");
}
}
}
}
}
}
}
}
}

View File

@ -28,11 +28,7 @@
******************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace Sunny.UI
{
@ -60,6 +56,9 @@ namespace Sunny.UI
public static extern int FastLZ_Decompress(void* input, int length, void* output, int maxout);
}
/// <summary>
/// FastLZ压缩解压类
/// </summary>
public static unsafe class FastLZ
{
/// <summary>
@ -71,6 +70,13 @@ namespace Sunny.UI
return IntPtr.Size == 8;
}
/// <summary>
/// 压缩
/// </summary>
/// <param name="input">输入</param>
/// <param name="begin">起始位置</param>
/// <param name="len">长度</param>
/// <returns>压缩结果</returns>
public static byte[] Compress(byte[] input, int begin, int len)
{
byte[] output = new byte[input.Length];
@ -84,6 +90,14 @@ namespace Sunny.UI
}
}
/// <summary>
/// 压缩
/// </summary>
/// <param name="level">压缩级别</param>
/// <param name="input">输入</param>
/// <param name="begin">起始位置</param>
/// <param name="len">长度</param>
/// <returns>压缩结果</returns>
public static byte[] Compress(int level, byte[] input, int begin, int len)
{
byte[] output = new byte[input.Length];
@ -97,6 +111,14 @@ namespace Sunny.UI
}
}
/// <summary>
/// 解压缩
/// </summary>
/// <param name="input">输入</param>
/// <param name="begin">起始位置</param>
/// <param name="length">长度</param>
/// <param name="maxout">解压结果最大长度</param>
/// <returns>解压缩结果</returns>
public static byte[] Decompress(byte[] input, int begin, int length, int maxout)
{
byte[] output = new byte[maxout];

View File

@ -770,6 +770,11 @@ namespace Sunny.UI
return crc.ToString("X").PadLeft(8, '0');
}
/// <summary>
/// 文件名是否有效
/// </summary>
/// <param name="name">文件名</param>
/// <returns>是否有效</returns>
public static bool IsValidFileName(string name)
{
if (name.IsNullOrEmpty())

View File

@ -13,10 +13,23 @@ namespace Sunny.UI
/// </summary>
public class FolderNameEditorEx : UITypeEditor
{
/// <summary>
/// GetEditStyle
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
return UITypeEditorEditStyle.Modal;
}
/// <summary>
/// EditValue
/// </summary>
/// <param name="context"></param>
/// <param name="provider"></param>
/// <param name="value"></param>
/// <returns></returns>
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
FolderBrowserDialogEx browser = new FolderBrowserDialogEx();

View File

@ -27,6 +27,9 @@ using System.Drawing.Drawing2D;
namespace Sunny.UI
{
/// <summary>
/// GDI扩展类
/// </summary>
public static class GDI
{
/// <summary>
@ -57,6 +60,11 @@ namespace Sunny.UI
}
}
/// <summary>
/// 颜色是否是浅色
/// </summary>
/// <param name="color">颜色</param>
/// <returns>是否是浅色</returns>
public static bool IsLightColor(this Color color)
{
return (0.299 * color.R + 0.587 * color.G + 0.114 * color.B) / 255 > 0.5;
@ -65,29 +73,53 @@ namespace Sunny.UI
/// <summary>
/// 根据背景色判断前景色
/// </summary>
/// <param name="backColor"></param>
/// <returns></returns>
/// <param name="backColor">背景色</param>
/// <returns>前景色</returns>
public static Color ForeColor(Color backColor)
{
double gray = (0.299 * backColor.R + 0.587 * backColor.G + 0.114 * backColor.B) / 255;
return gray > 0.5 ? Color.Black : Color.White;
return backColor.IsLightColor() ? Color.Black : Color.White;
}
/// <summary>
/// SizeF转Size
/// </summary>
/// <param name="size">SizeF</param>
/// <returns>Size</returns>
public static Size Size(this SizeF size)
{
return new Size(size.Width.RoundEx(), size.Height.RoundEx());
}
/// <summary>
/// PointF转Point
/// </summary>
/// <param name="point">PointF</param>
/// <returns>Point</returns>
public static Point Point(this PointF point)
{
return new Point(point.X.RoundEx(), point.Y.RoundEx());
}
/// <summary>
/// Size增加长宽
/// </summary>
/// <param name="size">Size</param>
/// <param name="width">宽</param>
/// <param name="height">长</param>
/// <returns>结果</returns>
public static Size Add(this Size size, int width, int height)
{
return new Size(size.Width + width, size.Height + height);
}
/// <summary>
/// SizeF增加长宽
/// </summary>
/// <param name="size">SizeF</param>
/// <param name="width">宽</param>
/// <param name="height">长</param>
/// <returns>结果</returns>
public static SizeF Add(this SizeF size, float width, float height)
{
return new SizeF(size.Width + width, size.Height + height);
@ -177,6 +209,13 @@ namespace Sunny.UI
return Graphics().MeasureString(text, font);
}
/// <summary>
/// 获取起始颜色到终止颜色之间的渐变颜色
/// </summary>
/// <param name="startColor">起始颜色</param>
/// <param name="endColor">终止颜色</param>
/// <param name="count">个数</param>
/// <returns>渐变颜色列表</returns>
public static Color[] GradientColors(this Color startColor, Color endColor, int count)
{
count = Math.Max(count, 2);
@ -208,6 +247,12 @@ namespace Sunny.UI
return colors;
}
/// <summary>
/// 开启高质量绘图
/// </summary>
/// <param name="g">绘图图面</param>
/// <param name="smooth">是否平滑</param>
/// <returns>绘图图面</returns>
public static Graphics Smooth(this Graphics g, bool smooth = true)
{
if (smooth)
@ -222,17 +267,43 @@ namespace Sunny.UI
return g;
}
/// <summary>
/// 创建圆角路径
/// </summary>
/// <param name="g">绘图图面</param>
/// <param name="rect">区域</param>
/// <param name="radius">圆角大小</param>
/// <param name="radiusSides">圆角的方位</param>
/// <returns>路径</returns>
public static GraphicsPath CreateRoundedRectanglePath(this Graphics g, Rectangle rect, int radius, UICornerRadiusSides radiusSides)
{
return rect.CreateRoundedRectanglePath(radius, radiusSides);
}
/// <summary>
/// 创建圆角路径
/// </summary>
/// <param name="g">绘图图面</param>
/// <param name="rect">区域</param>
/// <param name="radius">圆角大小</param>
/// <param name="cornerLeftTop">左上角</param>
/// <param name="cornerRightTop">右上角</param>
/// <param name="cornerRightBottom">右下角</param>
/// <param name="cornerLeftBottom">左下角</param>
/// <returns>路径</returns>
public static GraphicsPath CreateRoundedRectanglePath(this Graphics g, Rectangle rect, int radius, bool cornerLeftTop = true, bool cornerRightTop = true, bool cornerRightBottom = true, bool cornerLeftBottom = true)
{
return rect.CreateRoundedRectanglePath(radius, cornerLeftTop, cornerRightTop, cornerRightBottom, cornerLeftBottom);
}
/// <summary>
/// 创建圆角路径
/// </summary>
/// <param name="rect">区域</param>
/// <param name="radius">圆角大小</param>
/// <param name="radiusSides">圆角的方位</param>
/// <param name="lineSize">线宽</param>
/// <returns></returns>
public static GraphicsPath CreateRoundedRectanglePath(this Rectangle rect, int radius, UICornerRadiusSides radiusSides, int lineSize = 1)
{
GraphicsPath path;
@ -257,6 +328,11 @@ namespace Sunny.UI
return path;
}
/// <summary>
/// 绘图路径
/// </summary>
/// <param name="rect">区域</param>
/// <returns>路径</returns>
public static GraphicsPath GraphicsPath(this Rectangle rect)
{
Point[] points = new Point[] {
@ -268,21 +344,59 @@ namespace Sunny.UI
return points.Path();
}
/// <summary>
/// 创建扇形绘图路径
/// </summary>
/// <param name="g">绘图图面</param>
/// <param name="center">圆心</param>
/// <param name="d1">内径</param>
/// <param name="d2">外径</param>
/// <param name="startAngle">起始角度</param>
/// <param name="sweepAngle">终止角度</param>
/// <returns>扇形绘图路径</returns>
public static GraphicsPath CreateFanPath(this Graphics g, Point center, float d1, float d2, float startAngle, float sweepAngle)
{
return center.CreateFanPath(d1, d2, startAngle, sweepAngle);
}
/// <summary>
/// 创建扇形绘图路径
/// </summary>
/// <param name="g">绘图图面</param>
/// <param name="center">圆心</param>
/// <param name="d1">内径</param>
/// <param name="d2">外径</param>
/// <param name="startAngle">起始角度</param>
/// <param name="sweepAngle">终止角度</param>
/// <returns>扇形绘图路径</returns>
public static GraphicsPath CreateFanPath(this Graphics g, PointF center, float d1, float d2, float startAngle, float sweepAngle)
{
return center.CreateFanPath(d1, d2, startAngle, sweepAngle);
}
/// <summary>
/// 创建扇形绘图路径
/// </summary>
/// <param name="center">圆心</param>
/// <param name="d1">内径</param>
/// <param name="d2">外径</param>
/// <param name="startAngle">起始角度</param>
/// <param name="sweepAngle">终止角度</param>
/// <returns>扇形绘图路径</returns>
public static GraphicsPath CreateFanPath(this Point center, float d1, float d2, float startAngle, float sweepAngle)
{
return new PointF(center.X, center.Y).CreateFanPath(d1, d2, startAngle, sweepAngle);
}
/// <summary>
/// 创建扇形绘图路径
/// </summary>
/// <param name="center">圆心</param>
/// <param name="d1">内径</param>
/// <param name="d2">外径</param>
/// <param name="startAngle">起始角度</param>
/// <param name="sweepAngle">终止角度</param>
/// <returns>扇形绘图路径</returns>
public static GraphicsPath CreateFanPath(this PointF center, float d1, float d2, float startAngle, float sweepAngle)
{
GraphicsPath path = new GraphicsPath();
@ -292,6 +406,18 @@ namespace Sunny.UI
return path;
}
/// <summary>
/// 创建圆角路径
/// </summary>
/// <param name="g">绘图图面</param>
/// <param name="rect">区域</param>
/// <param name="radius">圆角大小</param>
/// <param name="cornerLeftTop">左上角</param>
/// <param name="cornerRightTop">右上角</param>
/// <param name="cornerRightBottom">右下角</param>
/// <param name="cornerLeftBottom">左下角</param>
/// <param name="lineSize">线宽</param>
/// <returns>路径</returns>
public static GraphicsPath CreateRoundedRectanglePath(this Rectangle rect, int radius,
bool cornerLeftTop = true, bool cornerRightTop = true, bool cornerRightBottom = true, bool cornerLeftBottom = true,
int lineSize = 1)
@ -356,56 +482,116 @@ namespace Sunny.UI
return g;
}
/// <summary>
/// Color转HTML
/// </summary>
/// <param name="color">Color</param>
/// <returns>HTML</returns>
public static string ToHTML(this Color color)
{
return ColorTranslator.ToHtml(color);
}
/// <summary>
/// HTML转Color
/// </summary>
/// <param name="htmlColor">HTML</param>
/// <param name="alpha">透明度</param>
/// <returns>Color</returns>
public static Color ToColor(this string htmlColor, int alpha = 255)
{
return Color.FromArgb(alpha > 255 ? 255 : alpha, ColorTranslator.FromHtml(htmlColor));
}
/// <summary>
/// 颜色是否为空
/// </summary>
/// <param name="color">颜色</param>
/// <returns>是否为空</returns>
public static bool IsNullOrEmpty(this Color color)
{
return color == Color.Empty || color == Color.Transparent;
}
/// <summary>
/// 画刷
/// </summary>
/// <param name="color">颜色</param>
/// <returns>画刷</returns>
public static SolidBrush Brush(this Color color)
{
return new SolidBrush(color);
}
/// <summary>
/// 画笔
/// </summary>
/// <param name="color">颜色</param>
/// <param name="size">线宽</param>
/// <returns>画笔</returns>
public static Pen Pen(this Color color, float size = 1)
{
return new Pen(color, size);
}
/// <summary>
/// HTML颜色生成画刷
/// </summary>
/// <param name="htmlColor">HTML颜色</param>
/// <param name="alpha">透明度</param>
/// <returns>画刷</returns>
public static SolidBrush Brush(this string htmlColor, int alpha = 255)
{
return new SolidBrush(Color.FromArgb(alpha > 255 ? 255 : alpha, ColorTranslator.FromHtml(htmlColor)));
}
/// <summary>
/// HTML颜色生成画笔
/// </summary>
/// <param name="htmlColor">HTML颜色</param>
/// <param name="alpha">透明度</param>
/// <param name="size">线宽</param>
/// <param name="startCap">起始线帽样式</param>
/// <param name="endCap">结束线帽样式</param>
/// <returns>画笔</returns>
public static Pen Pen(this string htmlColor, int alpha = 255, float size = 1, LineCap startCap = LineCap.Custom, LineCap endCap = LineCap.Custom)
{
return new Pen(Color.FromArgb(alpha > 255 ? 255 : alpha, ColorTranslator.FromHtml(htmlColor)), size) { StartCap = startCap, EndCap = endCap };
}
public static Font ToFont(this string fontName, float size, FontStyle fontStyle = FontStyle.Regular, GraphicsUnit unit = GraphicsUnit.Pixel)
{
return new Font(fontName, size, fontStyle, unit);
}
/// <summary>
/// 渐变画刷
/// </summary>
/// <param name="centerColor"></param>
/// <param name="surroundColor"></param>
/// <param name="point"></param>
/// <param name="gp"></param>
/// <param name="wrapMode"></param>
/// <returns></returns>
public static Brush GlowBrush(Color centerColor, Color[] surroundColor, PointF point, GraphicsPath gp, WrapMode wrapMode = WrapMode.Clamp)
{
return new PathGradientBrush(gp) { CenterColor = centerColor, SurroundColors = surroundColor, FocusScales = point, WrapMode = wrapMode };
}
/// <summary>
/// 渐变画刷
/// </summary>
/// <param name="centerColor"></param>
/// <param name="surroundColor"></param>
/// <param name="point"></param>
/// <param name="wrapMode"></param>
/// <returns></returns>
public static Brush GlowBrush(Color centerColor, Color[] surroundColor, PointF[] point, WrapMode wrapMode = WrapMode.Clamp)
{
return new PathGradientBrush(point) { CenterColor = centerColor, SurroundColors = surroundColor, WrapMode = wrapMode };
}
/// <summary>
/// 文本布局
/// </summary>
/// <param name="horizontalAlignment">水平方向</param>
/// <param name="verticalAlignment">垂直方向</param>
/// <returns>文本布局</returns>
public static StringFormat SetAlignment(StringAlignment horizontalAlignment = StringAlignment.Center, StringAlignment verticalAlignment = StringAlignment.Center)
{
return new StringFormat { Alignment = horizontalAlignment, LineAlignment = verticalAlignment };

View File

@ -41,8 +41,15 @@ using System.Windows.Forms;
namespace Sunny.UI
{
/// <summary>
/// GIF图片帮助类
/// </summary>
public class Gif : IDisposable
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="fileName">文件名</param>
public Gif(string fileName)
{
timer = new Timer();
@ -54,6 +61,10 @@ namespace Sunny.UI
}
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="img">图片</param>
public Gif(Image img)
{
timer = new Timer();
@ -79,11 +90,18 @@ namespace Sunny.UI
ShowImage = null;
}
/// <summary>
/// 是否循环
/// </summary>
public bool Loop
{
get; set;
}
/// <summary>
/// 跳帧
/// </summary>
/// <param name="frameIndex">帧号</param>
public void JumpToFrame(int frameIndex)
{
if (ImageCount == 0) return;
@ -142,8 +160,16 @@ namespace Sunny.UI
timer.Enabled = IsGif && active;
}
/// <summary>
/// 图片切换事件
/// </summary>
/// <param name="sender">对象</param>
/// <param name="image">图片</param>
public delegate void OnImageChanged(object sender, Image image);
/// <summary>
/// 图片切换事件
/// </summary>
public event OnImageChanged ImageChanged;
private readonly Timer timer;
@ -151,8 +177,15 @@ namespace Sunny.UI
private Image image;
private int ImageCount => image == null ? 0 : image.GifFrameCount();
/// <summary>
/// 图片是否是GIF图片
/// </summary>
public bool IsGif => ImageCount > 0;
/// <summary>
/// 图片
/// </summary>
public Image Image
{
get => image;
@ -171,6 +204,9 @@ namespace Sunny.UI
}
}
/// <summary>
/// 刷新
/// </summary>
public void Invalidate()
{
if (!Active)
@ -181,6 +217,10 @@ namespace Sunny.UI
private int FrameIndex;
private bool active;
/// <summary>
/// 图片动画
/// </summary>
public bool Active
{
get => active;
@ -193,13 +233,26 @@ namespace Sunny.UI
}
}
/// <summary>
/// GIF图片帮助类
/// </summary>
public static class GifHelper
{
/// <summary>
/// 获取图像框架的维度
/// </summary>
/// <param name="img">图片</param>
/// <returns>图像框架的维度</returns>
public static FrameDimension GifFrameDimension(this Image img)
{
return new FrameDimension(img.FrameDimensionsList[0]);
}
/// <summary>
/// 获取图像的帧数
/// </summary>
/// <param name="img">图像</param>
/// <returns>帧数</returns>
public static int GifFrameCount(this Image img)
{
if (img == null) return 0;
@ -207,6 +260,11 @@ namespace Sunny.UI
return img.GetFrameCount(fd);
}
/// <summary>
/// 获取图像的帧间隔
/// </summary>
/// <param name="img">图像</param>
/// <returns>帧间隔</returns>
public static int GifFrameInterval(this Image img)
{
FrameDimension dim = new FrameDimension(img.FrameDimensionsList[0]);

View File

@ -21,7 +21,7 @@
<AssemblyOriginatorKeyFile>D:\MyDocuments\SunnyUI.pfx</AssemblyOriginatorKeyFile>
<DelaySign>False</DelaySign>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<GenerateDocumentationFile>False</GenerateDocumentationFile>
<GenerateDocumentationFile>True</GenerateDocumentationFile>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">