mirror of
https://github.com/modernw/App-Installer-For-Windows-8.x-Reset.git
synced 2026-04-11 17:57:19 +10:00
238 lines
5.4 KiB
C#
238 lines
5.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
using System.Drawing;
|
|
using System.Linq;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
using DataUtils;
|
|
namespace WAShell
|
|
{
|
|
[ComVisible (true)]
|
|
[ClassInterface (ClassInterfaceType.AutoDual)]
|
|
public partial class SplashForm: Form
|
|
{
|
|
public enum FadeType
|
|
{
|
|
Gradually,
|
|
Immediately
|
|
};
|
|
private Image splashImage = null;
|
|
private Color background = Color.Transparent;
|
|
private FadeType fadeMode = FadeType.Gradually;
|
|
double opastep = 0.05;
|
|
private Control _host = null;
|
|
public Control Host
|
|
{
|
|
get { return _host; }
|
|
set
|
|
{
|
|
if (ReferenceEquals (_host, value)) return;
|
|
DetachHostEvents (_host);
|
|
_host = value;
|
|
this.Owner = _host as Form;
|
|
AttachHostEvents (_host);
|
|
if (this.Visible)
|
|
{
|
|
ResizeSplashScreen ();
|
|
}
|
|
}
|
|
}
|
|
private void AttachHostEvents (Control host)
|
|
{
|
|
if (host == null) return;
|
|
host.Resize += Host_Changed;
|
|
host.LocationChanged += Host_Changed;
|
|
host.Disposed += Host_Disposed;
|
|
}
|
|
private void DetachHostEvents (Control host)
|
|
{
|
|
if (host == null) return;
|
|
host.Resize -= Host_Changed;
|
|
host.LocationChanged -= Host_Changed;
|
|
host.Disposed -= Host_Disposed;
|
|
}
|
|
private void Host_Changed (object sender, EventArgs e)
|
|
{
|
|
if (this.IsDisposed || !this.IsHandleCreated) return;
|
|
if (this.Owner == null || this.Owner.IsDisposed) return;
|
|
ResizeSplashScreen ();
|
|
}
|
|
private void Host_Disposed (object sender, EventArgs e)
|
|
{
|
|
DetachHostEvents (_host);
|
|
_host = null;
|
|
if (!this.IsDisposed) this.Hide (); // 或 Hide()
|
|
}
|
|
public SplashForm ()
|
|
{
|
|
InitializeComponent ();
|
|
Init ();
|
|
}
|
|
private void Init ()
|
|
{
|
|
this.AllowTransparency = true;
|
|
picbox.Size = new Size (
|
|
(int)(620 * UITheme.DPIDouble),
|
|
(int)(300 * UITheme.DPIDouble)
|
|
);
|
|
try { picbox.Image = splashImage; } catch (Exception) { }
|
|
try { this.BackColor = background; } catch (Exception) { }
|
|
}
|
|
public Image SplashImage
|
|
{
|
|
get { return splashImage; }
|
|
set
|
|
{
|
|
splashImage = value;
|
|
if (picbox != null && picbox.IsHandleCreated)
|
|
{
|
|
picbox.Image = splashImage;
|
|
}
|
|
}
|
|
}
|
|
public Color SplashBackgroundColor
|
|
{
|
|
get { try { return background = this.BackColor; } catch (Exception) { return background; } }
|
|
set
|
|
{
|
|
background = value;
|
|
try { this.BackColor = background; }
|
|
catch (Exception) { background = this.BackColor; }
|
|
}
|
|
}
|
|
private void SplashForm_Load (object sender, EventArgs e)
|
|
{
|
|
ResizeSplashScreen ();
|
|
}
|
|
public void ResizeSplashScreen ()
|
|
{
|
|
if (this.IsDisposed || !this.IsHandleCreated) return;
|
|
Control owner = this.Owner ?? this.Parent;
|
|
if (owner == null || owner.IsDisposed || !owner.IsHandleCreated) return;
|
|
var pt = owner.PointToScreen (Point.Empty);
|
|
this.Location = pt;
|
|
this.Size = owner.ClientSize;
|
|
ResizeSplashImage ();
|
|
}
|
|
private void ResizeSplashImage ()
|
|
{
|
|
if (picbox != null && picbox.IsHandleCreated)
|
|
{
|
|
var sz = this.ClientSize;
|
|
picbox.Location = new Point (
|
|
(int)((sz.Width - picbox.Width) * 0.5),
|
|
(int)((sz.Height - picbox.Height) * 0.5)
|
|
);
|
|
}
|
|
}
|
|
private void SplashForm_Resize (object sender, EventArgs e)
|
|
{
|
|
ResizeSplashImage ();
|
|
}
|
|
private bool fadeAwayArmed = false; // 用于 FadeAway 的“第一次 / 第二次”
|
|
private bool fading = false; // 防止重复启动 Timer
|
|
protected virtual void OnFormFade ()
|
|
{
|
|
switch (fadeMode)
|
|
{
|
|
case FadeType.Gradually:
|
|
if (this.Opacity > 0)
|
|
{
|
|
this.Opacity -= opastep;
|
|
if (this.Opacity < 0) this.Opacity = 0;
|
|
}
|
|
else
|
|
{
|
|
timer.Stop ();
|
|
this.Visible = false;
|
|
fading = false;
|
|
}
|
|
break;
|
|
|
|
case FadeType.Immediately:
|
|
if (fadeAwayArmed)
|
|
{
|
|
this.Opacity = 0;
|
|
timer.Stop ();
|
|
this.Visible = false;
|
|
fading = false;
|
|
}
|
|
else
|
|
{
|
|
fadeAwayArmed = true;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
private void timer_Tick (object sender, EventArgs e)
|
|
{
|
|
OnFormFade ();
|
|
}
|
|
public void OwnerWnd_Resize (object sender, EventArgs e)
|
|
{
|
|
if (this != null && this.IsHandleCreated && this.picbox != null && this.picbox.IsHandleCreated)
|
|
{
|
|
ResizeSplashScreen ();
|
|
}
|
|
}
|
|
// 渐变消失
|
|
public void FadeOut ()
|
|
{
|
|
if (fading) return;
|
|
fadeMode = FadeType.Gradually;
|
|
fadeAwayArmed = false;
|
|
fading = true;
|
|
this.Opacity = Math.Min (this.Opacity, 1.0);
|
|
timer.Interval = 15;
|
|
timer.Start ();
|
|
}
|
|
// 立即消失
|
|
public void FadeAway ()
|
|
{
|
|
if (fading) return;
|
|
fadeMode = FadeType.Immediately;
|
|
fadeAwayArmed = false;
|
|
fading = true;
|
|
timer.Interval = 15;
|
|
timer.Start ();
|
|
}
|
|
public void ResetSplash ()
|
|
{
|
|
this.Opacity = 1.0;
|
|
this.Visible = false;
|
|
this.Enabled = true;
|
|
fadeMode = FadeType.Gradually;
|
|
fadeAwayArmed = false;
|
|
fading = false;
|
|
if (timer != null) timer.Stop ();
|
|
if (picbox != null)
|
|
{
|
|
picbox.Image = splashImage;
|
|
picbox.BackColor = background;
|
|
}
|
|
ResizeSplashScreen ();
|
|
}
|
|
private void SplashForm_FormClosed (object sender, FormClosedEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
DetachHostEvents (_host);
|
|
_host = null;
|
|
// base.OnFormClosed (e);
|
|
}
|
|
catch (Exception) { }
|
|
}
|
|
private void SplashForm_Shown (object sender, EventArgs e)
|
|
{
|
|
//base.OnShown (e);
|
|
this.Opacity = 1.0;
|
|
this.Visible = true;
|
|
this.Enabled = true;
|
|
ResizeSplashScreen ();
|
|
}
|
|
}
|
|
}
|