diff --git a/Bin/net40/SunnyUI.Demo.exe b/Bin/net40/SunnyUI.Demo.exe
index cae0129a..8b5fab57 100644
Binary files a/Bin/net40/SunnyUI.Demo.exe and b/Bin/net40/SunnyUI.Demo.exe differ
diff --git a/Bin/net40/SunnyUI.dll b/Bin/net40/SunnyUI.dll
index 08d5d68e..d3daf149 100644
Binary files a/Bin/net40/SunnyUI.dll and b/Bin/net40/SunnyUI.dll differ
diff --git a/Bin/net5.0-windows/SunnyUI.dll b/Bin/net5.0-windows/SunnyUI.dll
index 3df23e84..8dbcb197 100644
Binary files a/Bin/net5.0-windows/SunnyUI.dll and b/Bin/net5.0-windows/SunnyUI.dll differ
diff --git a/Bin/net5.0-windows/ref/SunnyUI.dll b/Bin/net5.0-windows/ref/SunnyUI.dll
index c12b5264..331377e4 100644
Binary files a/Bin/net5.0-windows/ref/SunnyUI.dll and b/Bin/net5.0-windows/ref/SunnyUI.dll differ
diff --git a/Bin/netcoreapp3.1/SunnyUI.dll b/Bin/netcoreapp3.1/SunnyUI.dll
index f8a8eeae..a2c52049 100644
Binary files a/Bin/netcoreapp3.1/SunnyUI.dll and b/Bin/netcoreapp3.1/SunnyUI.dll differ
diff --git a/SunnyUI.Demo/FMain.Designer.cs b/SunnyUI.Demo/FMain.Designer.cs
index 9e563d76..5c47fe1b 100644
--- a/SunnyUI.Demo/FMain.Designer.cs
+++ b/SunnyUI.Demo/FMain.Designer.cs
@@ -37,7 +37,11 @@
this.uiLogo1 = new Sunny.UI.UILogo();
this.uiAvatar = new Sunny.UI.UIAvatar();
this.StyleManager = new Sunny.UI.UIStyleManager(this.components);
+ this.uiContextMenuStrip1 = new Sunny.UI.UIContextMenuStrip();
+ this.关于ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
+ this.关于ToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
this.Header.SuspendLayout();
+ this.uiContextMenuStrip1.SuspendLayout();
this.SuspendLayout();
//
// Aside
@@ -99,11 +103,36 @@
this.uiAvatar.TabIndex = 4;
this.uiAvatar.Text = "uiAvatar1";
//
+ // uiContextMenuStrip1
+ //
+ this.uiContextMenuStrip1.Font = new System.Drawing.Font("微软雅黑", 12F);
+ this.uiContextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+ this.关于ToolStripMenuItem,
+ this.关于ToolStripMenuItem1});
+ this.uiContextMenuStrip1.Name = "uiContextMenuStrip1";
+ this.uiContextMenuStrip1.Size = new System.Drawing.Size(181, 78);
+ //
+ // 关于ToolStripMenuItem
+ //
+ this.关于ToolStripMenuItem.Name = "关于ToolStripMenuItem";
+ this.关于ToolStripMenuItem.Size = new System.Drawing.Size(180, 26);
+ this.关于ToolStripMenuItem.Text = "主页";
+ this.关于ToolStripMenuItem.Click += new System.EventHandler(this.关于ToolStripMenuItem_Click);
+ //
+ // 关于ToolStripMenuItem1
+ //
+ this.关于ToolStripMenuItem1.Name = "关于ToolStripMenuItem1";
+ this.关于ToolStripMenuItem1.Size = new System.Drawing.Size(180, 26);
+ this.关于ToolStripMenuItem1.Text = "关于";
+ this.关于ToolStripMenuItem1.Click += new System.EventHandler(this.关于ToolStripMenuItem1_Click);
+ //
// FMain
//
this.AutoScaleDimensions = new System.Drawing.SizeF(10F, 21F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1024, 720);
+ this.ExtendBox = true;
+ this.ExtendMenu = this.uiContextMenuStrip1;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MinimumSize = new System.Drawing.Size(1024, 720);
this.Name = "FMain";
@@ -114,7 +143,10 @@
this.ShowShadow = true;
this.Text = "SunnyUI.Net";
this.Selecting += new Sunny.UI.UIMainFrame.OnSelecting(this.FMain_Selecting);
+ this.Controls.SetChildIndex(this.Header, 0);
+ this.Controls.SetChildIndex(this.Aside, 0);
this.Header.ResumeLayout(false);
+ this.uiContextMenuStrip1.ResumeLayout(false);
this.ResumeLayout(false);
}
@@ -124,5 +156,8 @@
private UILogo uiLogo1;
private UIAvatar uiAvatar;
private UIStyleManager StyleManager;
+ private UIContextMenuStrip uiContextMenuStrip1;
+ private System.Windows.Forms.ToolStripMenuItem 关于ToolStripMenuItem;
+ private System.Windows.Forms.ToolStripMenuItem 关于ToolStripMenuItem1;
}
}
\ No newline at end of file
diff --git a/SunnyUI.Demo/FMain.cs b/SunnyUI.Demo/FMain.cs
index 8595bcba..e90ad31a 100644
--- a/SunnyUI.Demo/FMain.cs
+++ b/SunnyUI.Demo/FMain.cs
@@ -89,5 +89,15 @@ namespace Sunny.UI.Demo
{
page?.Text.ConsoleWriteLine();
}
+
+ private void 关于ToolStripMenuItem1_Click(object sender, EventArgs e)
+ {
+ UIMessageBox.Show("SunnyUI.Net V3.0", "关于", Style, UIMessageBoxButtons.OK, false);
+ }
+
+ private void 关于ToolStripMenuItem_Click(object sender, EventArgs e)
+ {
+ System.Diagnostics.Process.Start("https://gitee.com/yhuse/SunnyUI");
+ }
}
}
\ No newline at end of file
diff --git a/SunnyUI.Demo/FMain.resx b/SunnyUI.Demo/FMain.resx
index 8afef9d3..06a8efcd 100644
--- a/SunnyUI.Demo/FMain.resx
+++ b/SunnyUI.Demo/FMain.resx
@@ -120,6 +120,9 @@
17, 17
+
+ 150, 17
+
diff --git a/SunnyUI/Forms/UIForm.cs b/SunnyUI/Forms/UIForm.cs
index f13d720f..723fd814 100644
--- a/SunnyUI/Forms/UIForm.cs
+++ b/SunnyUI/Forms/UIForm.cs
@@ -22,12 +22,14 @@
* 2020-07-05: V2.2.6 更新窗体控制按钮圆角和跟随窗体圆角变化。
* 2020-09-17: V2.2.7 重写WindowState相关代码
* 2020-09-17: V2.2.7 增加了窗体可拉拽调整大小ShowDragStretch属性
+ * 2021-02-04: V3.0.1 标题栏增加扩展按钮
******************************************************************************/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
+using System.Drawing.Design;
using System.Windows.Forms;
namespace Sunny.UI
@@ -57,10 +59,76 @@ namespace Sunny.UI
UpdateStyles();
Version = UIGlobal.Version;
+ extendSymbol = 0;
FormBorderStyle = FormBorderStyle.None;
m_aeroEnabled = false;
+ showTitleIcon = false;
}
+ private bool extendBox;
+
+ [DefaultValue(false)]
+ [Description("显示扩展按钮"), Category("SunnyUI")]
+ public bool ExtendBox
+ {
+ get => extendBox;
+ set
+ {
+ extendBox = value;
+ CalcSystemBoxPos();
+ Invalidate();
+ }
+ }
+
+ private int extendSymbol;
+
+ [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
+ [Editor(typeof(UIImagePropertyEditor), typeof(UITypeEditor))]
+ [DefaultValue(0)]
+ [Description("扩展按钮字体图标"), Category("SunnyUI")]
+ public int ExtendSymbol
+ {
+ get => extendSymbol;
+ set
+ {
+ extendSymbol = value;
+ Invalidate();
+ }
+ }
+
+ private int _symbolSize = 24;
+
+ [DefaultValue(24)]
+ [Description("扩展按钮字体图标大小"), Category("SunnyUI")]
+ public int ExtendSymbolSize
+ {
+ get => _symbolSize;
+ set
+ {
+ _symbolSize = Math.Max(value, 16);
+ _symbolSize = Math.Min(value, 64);
+ Invalidate();
+ }
+ }
+
+ private Point extendSymbolOffset = new Point(0, 0);
+
+ [DefaultValue(typeof(Point), "0, 0")]
+ [Description("扩展按钮字体图标偏移量"), Category("SunnyUI")]
+ public Point ExtendSymbolOffset
+ {
+ get => extendSymbolOffset;
+ set
+ {
+ extendSymbolOffset = value;
+ Invalidate();
+ }
+ }
+
+ [DefaultValue(null)]
+ [Description("扩展按钮菜单"), Category("SunnyUI")]
+ public UIContextMenuStrip ExtendMenu { get; set; }
+
//不显示FormBorderStyle属性
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
@@ -321,6 +389,8 @@ namespace Sunny.UI
private Rectangle MinimizeBoxRect;
+ private Rectangle ExtendBoxRect;
+
private int ControlBoxLeft;
private void CalcSystemBoxPos()
@@ -351,10 +421,22 @@ namespace Sunny.UI
{
MinimizeBoxRect = new Rectangle(Width + 1, Height + 1, 1, 1);
}
+
+ if (ExtendBox)
+ {
+ if (MinimizeBox)
+ {
+ ExtendBoxRect = new Rectangle(MinimizeBoxRect.Left - 28 - 2, ControlBoxRect.Top, 28, 28);
+ }
+ else
+ {
+ ExtendBoxRect = new Rectangle(ControlBoxRect.Left - 28 - 2, ControlBoxRect.Top, 28, 28);
+ }
+ }
}
else
{
- MaximizeBoxRect = MinimizeBoxRect = ControlBoxRect = new Rectangle(Width + 1, Height + 1, 1, 1);
+ ExtendBoxRect = MaximizeBoxRect = MinimizeBoxRect = ControlBoxRect = new Rectangle(Width + 1, Height + 1, 1, 1);
}
}
@@ -435,9 +517,24 @@ namespace Sunny.UI
InMaxBox = false;
ShowMaximize();
}
+
+ if (InExtendBox)
+ {
+ InExtendBox = false;
+ if (ExtendMenu != null)
+ {
+ this.ShowContextMenuStrip(ExtendMenu, ExtendBoxRect.Left, TitleHeight - 1);
+ }
+ else
+ {
+ ExtendBoxClick?.Invoke(this, null);
+ }
+ }
}
}
+ public event EventHandler ExtendBoxClick;
+
///
/// 窗体最大化前的大小
///
@@ -500,7 +597,7 @@ namespace Sunny.UI
{
base.OnMouseDown(e);
- if (InControlBox || InMaxBox || InMinBox) return;
+ if (InControlBox || InMaxBox || InMinBox || InExtendBox) return;
if (!ShowTitle) return;
if (e.Y > Padding.Top) return;
@@ -517,7 +614,7 @@ namespace Sunny.UI
base.OnMouseDoubleClick(e);
if (!MaximizeBox) return;
- if (InControlBox || InMaxBox || InMinBox) return;
+ if (InControlBox || InMaxBox || InMinBox || InExtendBox) return;
if (!ShowTitle) return;
if (e.Y > Padding.Top) return;
@@ -623,6 +720,7 @@ namespace Sunny.UI
bool inControlBox = e.Location.InRect(ControlBoxRect);
bool inMaxBox = e.Location.InRect(MaximizeBoxRect);
bool inMinBox = e.Location.InRect(MinimizeBoxRect);
+ bool inExtendBox = e.Location.InRect(ExtendBoxRect);
bool isChange = false;
if (inControlBox != InControlBox)
@@ -643,6 +741,12 @@ namespace Sunny.UI
isChange = true;
}
+ if (inExtendBox != InExtendBox)
+ {
+ InExtendBox = inExtendBox;
+ isChange = true;
+ }
+
if (isChange)
{
Invalidate();
@@ -650,7 +754,7 @@ namespace Sunny.UI
}
else
{
- InControlBox = InMaxBox = InMinBox = false;
+ InExtendBox = InControlBox = InMaxBox = InMinBox = false;
}
}
@@ -660,11 +764,11 @@ namespace Sunny.UI
protected override void OnMouseLeave(EventArgs e)
{
base.OnMouseLeave(e);
- InControlBox = InMaxBox = InMinBox = false;
+ InExtendBox = InControlBox = InMaxBox = InMinBox = false;
Invalidate();
}
- private bool InControlBox, InMaxBox, InMinBox;
+ private bool InControlBox, InMaxBox, InMinBox, InExtendBox;
///
/// 是否屏蔽Alt+F4
@@ -854,11 +958,41 @@ namespace Sunny.UI
e.Graphics.DrawLine(Color.White,
MinimizeBoxRect.Left + MinimizeBoxRect.Width / 2 - 6,
MinimizeBoxRect.Top + MinimizeBoxRect.Height / 2,
- MinimizeBoxRect.Left + MinimizeBoxRect.Width / 2 + 6,
+ MinimizeBoxRect.Left + MinimizeBoxRect.Width / 2 + 5,
MinimizeBoxRect.Top + MinimizeBoxRect.Height / 2);
//e.Graphics.DrawFontImage(62161, 24, Color.White, MinimizeBoxRect, 1);
}
+ if (ExtendBox)
+ {
+ if (InExtendBox)
+ {
+ if (ShowRadius)
+ e.Graphics.FillRoundRectangle(btn.FillHoverColor, ExtendBoxRect, 5);
+ else
+ e.Graphics.FillRectangle(btn.FillHoverColor, ExtendBoxRect);
+ }
+
+ if (ExtendSymbol == 0)
+ {
+ e.Graphics.DrawLine(Color.White,
+ ExtendBoxRect.Left + ExtendBoxRect.Width / 2 - 5 - 1,
+ ExtendBoxRect.Top + ExtendBoxRect.Height / 2 - 2,
+ ExtendBoxRect.Left + ExtendBoxRect.Width / 2 - 1,
+ ExtendBoxRect.Top + ExtendBoxRect.Height / 2 + 3);
+
+ e.Graphics.DrawLine(Color.White,
+ ExtendBoxRect.Left + ExtendBoxRect.Width / 2 + 5 - 1,
+ ExtendBoxRect.Top + ExtendBoxRect.Height / 2 - 2,
+ ExtendBoxRect.Left + ExtendBoxRect.Width / 2 - 1,
+ ExtendBoxRect.Top + ExtendBoxRect.Height / 2 + 3);
+ }
+ else
+ {
+ e.Graphics.DrawFontImage(extendSymbol, ExtendSymbolSize, Color.White, ExtendBoxRect, ExtendSymbolOffset.X, ExtendSymbolOffset.Y);
+ }
+ }
+
e.Graphics.SetDefaultQuality();
if (ShowTitleIcon && Icon != null)
@@ -877,7 +1011,7 @@ namespace Sunny.UI
}
}
- private bool showTitleIcon = false;
+ private bool showTitleIcon;
[Description("显示标题栏图标"), Category("SunnyUI")]
[DefaultValue(false)]