mirror of https://github.com/dahall/Vanara.git
Cleaned and formatted
parent
eae5d23af2
commit
0387c8b30e
|
@ -7,9 +7,7 @@ using Vanara.Extensions;
|
|||
|
||||
namespace Vanara.Windows.Forms
|
||||
{
|
||||
/// <summary>
|
||||
/// GlassExtenderProvider extends a <see cref="System.Windows.Forms.Form"/> and provides glass margins.
|
||||
/// </summary>
|
||||
/// <summary>GlassExtenderProvider extends a <see cref="Form"/> and provides glass margins.</summary>
|
||||
[ProvideProperty("GlassEnabled", typeof(Form))]
|
||||
[ProvideProperty("GlassMarginMovesForm", typeof(Form))]
|
||||
[ProvideProperty("GlassMargins", typeof(Form))]
|
||||
|
@ -19,112 +17,54 @@ namespace Vanara.Windows.Forms
|
|||
{
|
||||
private readonly Dictionary<Form, GlassFormProperties> formProps = new Dictionary<Form, GlassFormProperties>();
|
||||
|
||||
/// <summary>
|
||||
/// Properties for each form that is extended.
|
||||
/// </summary>
|
||||
private class GlassFormProperties
|
||||
{
|
||||
public Point FormMoveLastMousePos = Point.Empty;
|
||||
public bool FormMoveTracking = false;
|
||||
public bool GlassEnabled = true;
|
||||
public Padding GlassMargins = Padding.Empty;
|
||||
public bool GlassMarginMovesForm = true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="GlassExtenderProvider"/> class.
|
||||
/// </summary>
|
||||
/// <summary>Initializes a new instance of the <see cref="GlassExtenderProvider"/> class.</summary>
|
||||
public GlassExtenderProvider()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets whether glass should be extended into the client space.
|
||||
/// </summary>
|
||||
/// <param name="form">The <see cref="System.Windows.Forms.Form"/> to be extended.</param>
|
||||
/// <summary>Gets whether glass should be extended into the client space.</summary>
|
||||
/// <param name="form">The <see cref="Form"/> to be extended.</param>
|
||||
/// <returns><c>true</c> if the glass is enabled; otherwise <c>false</c>.</returns>
|
||||
[DisplayName("GlassEnabled")]
|
||||
[DefaultValue(true)]
|
||||
[Category("Behavior")]
|
||||
[Description("Indicates whether extending glass into the client area is enabled.")]
|
||||
public bool GetGlassEnabled(Form form)
|
||||
{
|
||||
GlassFormProperties prop;
|
||||
if (formProps.TryGetValue(form, out prop))
|
||||
return prop.GlassEnabled;
|
||||
return true;
|
||||
}
|
||||
public bool GetGlassEnabled(Form form) => formProps.TryGetValue(form, out var prop) ? prop.GlassEnabled : true;
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether clicking and dragging within the top margin will move the form.
|
||||
/// </summary>
|
||||
/// <param name="form">The <see cref="System.Windows.Forms.Form"/> to be extended.</param>
|
||||
/// <summary>Gets a value indicating whether clicking and dragging within the top margin will move the form.</summary>
|
||||
/// <param name="form">The <see cref="Form"/> to be extended.</param>
|
||||
/// <returns><c>true</c> if clicking and dragging on the top margin moves the form; otherwise, <c>false</c>.</returns>
|
||||
[DisplayName("GlassMarginMovesForm")]
|
||||
[DefaultValue(true)]
|
||||
[Category("Behavior")]
|
||||
[Description("Specifies if clicking and dragging within the margin will move the form. ")]
|
||||
public bool GetGlassMarginMovesForm(Form form)
|
||||
{
|
||||
GlassFormProperties prop;
|
||||
if (formProps.TryGetValue(form, out prop))
|
||||
return prop.GlassMarginMovesForm;
|
||||
return true;
|
||||
}
|
||||
public bool GetGlassMarginMovesForm(Form form) => formProps.TryGetValue(form, out var prop) ? prop.GlassMarginMovesForm : true;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the glass margins.
|
||||
/// </summary>
|
||||
/// <param name="form">The <see cref="System.Windows.Forms.Form"/> to be extended.</param>
|
||||
/// <summary>Gets the glass margins.</summary>
|
||||
/// <param name="form">The <see cref="Form"/> to be extended.</param>
|
||||
/// <returns>The margins where the glass will be extended.</returns>
|
||||
[DefaultValue(typeof(Padding), "0")]
|
||||
[DisplayName("GlassMargins")]
|
||||
[Description("Specifies the interior glass margin of the form. Set to -1 for full window glass.")]
|
||||
[Category("Layout")]
|
||||
public Padding GetGlassMargins(Form form)
|
||||
{
|
||||
GlassFormProperties prop;
|
||||
if (formProps.TryGetValue(form, out prop))
|
||||
return prop.GlassMargins;
|
||||
return Padding.Empty;
|
||||
}
|
||||
public Padding GetGlassMargins(Form form) => formProps.TryGetValue(form, out var prop) ? prop.GlassMargins : Padding.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Specifies whether this object can provide its extender properties to the specified object.
|
||||
/// </summary>
|
||||
/// <param name="form">The <see cref="T:System.Object"/> to receive the extender properties.</param>
|
||||
/// <returns>
|
||||
/// true if this object can provide extender properties to the specified object; otherwise, false.
|
||||
/// </returns>
|
||||
bool IExtenderProvider.CanExtend(object form) => (form != this) && (form is Form);
|
||||
|
||||
/// <summary>
|
||||
/// Set whether the glass should be extended into the client space.
|
||||
/// </summary>
|
||||
/// <param name="form">The <see cref="System.Windows.Forms.Form"/> to be extended.</param>
|
||||
/// <summary>Set whether the glass should be extended into the client space.</summary>
|
||||
/// <param name="form">The <see cref="Form"/> to be extended.</param>
|
||||
/// <param name="value">The enabled value.</param>
|
||||
public void SetGlassEnabled(Form form, bool value)
|
||||
{
|
||||
var prop = GetFormProperties(form);
|
||||
prop.GlassEnabled = value;
|
||||
GetFormProperties(form).GlassEnabled = value;
|
||||
GlassifyForm(form);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets a value indicating whether clicking and dragging within the margin will move the form.
|
||||
/// </summary>
|
||||
/// <param name="form">The <see cref="System.Windows.Forms.Form"/> to be extended.</param>
|
||||
/// <summary>Sets a value indicating whether clicking and dragging within the margin will move the form.</summary>
|
||||
/// <param name="form">The <see cref="Form"/> to be extended.</param>
|
||||
/// <param name="value"><c>true</c> if clicking and dragging within the margin moves the form; otherwise, <c>false</c>.</param>
|
||||
public void SetGlassMarginMovesForm(Form form, bool value)
|
||||
{
|
||||
var prop = GetFormProperties(form);
|
||||
prop.GlassMarginMovesForm = value;
|
||||
}
|
||||
public void SetGlassMarginMovesForm(Form form, bool value) => GetFormProperties(form).GlassMarginMovesForm = value;
|
||||
|
||||
/// <summary>
|
||||
/// Sets the glass margins.
|
||||
/// </summary>
|
||||
/// <param name="form">The <see cref="System.Windows.Forms.Form"/> to be extended.</param>
|
||||
/// <summary>Sets the glass margins.</summary>
|
||||
/// <param name="form">The <see cref="Form"/> to be extended.</param>
|
||||
/// <param name="value">The margins where the glass will be extended.</param>
|
||||
public void SetGlassMargins(Form form, Padding value)
|
||||
{
|
||||
|
@ -153,6 +93,11 @@ namespace Vanara.Windows.Forms
|
|||
form.Invalidate();
|
||||
}
|
||||
|
||||
/// <summary>Specifies whether this object can provide its extender properties to the specified object.</summary>
|
||||
/// <param name="form">The <see cref="T:System.Object"/> to receive the extender properties.</param>
|
||||
/// <returns>true if this object can provide extender properties to the specified object; otherwise, false.</returns>
|
||||
bool IExtenderProvider.CanExtend(object form) => !ReferenceEquals(form, this) && form is Form;
|
||||
|
||||
/// <summary>
|
||||
/// Releases the unmanaged resources used by the <see cref="T:System.ComponentModel.Component"/> and optionally releases the managed resources.
|
||||
/// </summary>
|
||||
|
@ -161,7 +106,7 @@ namespace Vanara.Windows.Forms
|
|||
{
|
||||
if (disposing)
|
||||
{
|
||||
foreach (Form form in formProps.Keys)
|
||||
foreach (var form in formProps.Keys)
|
||||
{
|
||||
if (!form.IsDisposed)
|
||||
{
|
||||
|
@ -172,6 +117,14 @@ namespace Vanara.Windows.Forms
|
|||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
private static Rectangle GetNonGlassArea(Form form, GlassFormProperties prop)
|
||||
{
|
||||
if (prop == null)
|
||||
return form.ClientRectangle;
|
||||
return new Rectangle(form.ClientRectangle.Left + prop.GlassMargins.Left, form.ClientRectangle.Top + prop.GlassMargins.Top,
|
||||
form.ClientRectangle.Width - prop.GlassMargins.Horizontal, form.ClientRectangle.Height - prop.GlassMargins.Vertical);
|
||||
}
|
||||
|
||||
private void form_MouseDown(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (e.Button == MouseButtons.Left)
|
||||
|
@ -207,53 +160,36 @@ namespace Vanara.Windows.Forms
|
|||
{
|
||||
if (e.Button == MouseButtons.Left)
|
||||
{
|
||||
var prop = GetFormProperties(sender as Form);
|
||||
prop.FormMoveTracking = false;
|
||||
GetFormProperties(sender as Form).FormMoveTracking = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void form_Paint(object sender, PaintEventArgs e)
|
||||
{
|
||||
GlassifyForm(sender as Form, e.Graphics);
|
||||
}
|
||||
private void form_Paint(object sender, PaintEventArgs e) => GlassifyForm(sender as Form, e.Graphics);
|
||||
|
||||
private void form_Resize(object sender, EventArgs e)
|
||||
{
|
||||
var form = sender as Form;
|
||||
if ((DesktopWindowManager.CompositionEnabled && GetGlassEnabled(form)) || form.IsDesignMode())
|
||||
if (DesktopWindowManager.CompositionEnabled && GetGlassEnabled(form) || form.IsDesignMode())
|
||||
InvalidateNonGlassClientArea(form);
|
||||
}
|
||||
|
||||
private void form_Shown(object sender, EventArgs e)
|
||||
{
|
||||
GlassifyForm(sender as Form);
|
||||
}
|
||||
private void form_Shown(object sender, EventArgs e) => GlassifyForm(sender as Form);
|
||||
|
||||
private GlassFormProperties GetFormProperties(Form form)
|
||||
{
|
||||
GlassFormProperties prop;
|
||||
if (!formProps.TryGetValue(form, out prop))
|
||||
if (!formProps.TryGetValue(form, out var prop))
|
||||
formProps.Add(form, prop = new GlassFormProperties());
|
||||
return prop;
|
||||
}
|
||||
|
||||
private static Rectangle GetNonGlassArea(Form form, GlassFormProperties prop)
|
||||
{
|
||||
if (prop == null)
|
||||
return form.ClientRectangle;
|
||||
return new Rectangle(form.ClientRectangle.Left + prop.GlassMargins.Left, form.ClientRectangle.Top + prop.GlassMargins.Top,
|
||||
form.ClientRectangle.Width - prop.GlassMargins.Horizontal, form.ClientRectangle.Height - prop.GlassMargins.Vertical);
|
||||
}
|
||||
|
||||
private void GlassifyForm(Form form, Graphics g = null)
|
||||
{
|
||||
if (!(DesktopWindowManager.CompositionEnabled && GetGlassEnabled(form)) && !form.IsDesignMode())
|
||||
return;
|
||||
|
||||
if (g == null) g = form.CreateGraphics();
|
||||
if (g is null) g = form.CreateGraphics();
|
||||
|
||||
GlassFormProperties prop;
|
||||
if (!formProps.TryGetValue(form, out prop))
|
||||
if (!formProps.TryGetValue(form, out var prop))
|
||||
return;
|
||||
|
||||
// Paint the glass effect.
|
||||
|
@ -292,5 +228,15 @@ namespace Vanara.Windows.Forms
|
|||
form.Resize -= form_Resize;
|
||||
form.Paint -= form_Paint;
|
||||
}
|
||||
|
||||
/// <summary>Properties for each form that is extended.</summary>
|
||||
private class GlassFormProperties
|
||||
{
|
||||
public Point FormMoveLastMousePos = Point.Empty;
|
||||
public bool FormMoveTracking = false;
|
||||
public bool GlassEnabled = true;
|
||||
public bool GlassMarginMovesForm = true;
|
||||
public Padding GlassMargins = Padding.Empty;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue