449 lines
17 KiB
C#
449 lines
17 KiB
C#
using System.Windows.Forms;
|
|
using System.Runtime.InteropServices;
|
|
using System.Drawing;
|
|
using System;
|
|
|
|
namespace Switch_Toolbox.Library.Forms
|
|
{
|
|
public class STForm : Form
|
|
{
|
|
private bool canResize = true;
|
|
public bool CanResize
|
|
{
|
|
get
|
|
{
|
|
return canResize;
|
|
}
|
|
set
|
|
{
|
|
canResize = value;
|
|
|
|
if (BtnMinMax != null)
|
|
BtnMinMax.Visible = value;
|
|
}
|
|
}
|
|
|
|
public void AddControl(Control control) {
|
|
contentContainer.Controls.Add(control);
|
|
}
|
|
|
|
public override string Text
|
|
{
|
|
get
|
|
{
|
|
return base.Text;
|
|
}
|
|
set
|
|
{
|
|
base.Text = value;
|
|
|
|
if (LblTitle != null)
|
|
LblTitle.Text = value;
|
|
}
|
|
}
|
|
|
|
private int BorderSize = 5;
|
|
|
|
private Color BorderColor;
|
|
|
|
private const int cGrip = 16; // Grip size
|
|
private const int cCaption = 32; // Caption bar height;
|
|
|
|
private const int HTCLIENT = 0x1;
|
|
private const int HT_CAPTION = 0x2;
|
|
private const int WM_SETREDRAW = 0xb;
|
|
private const int WM_NCHITTEST = 0x84;
|
|
protected STPanel contentContainer;
|
|
private const int WM_NCLBUTTONDOWN = 0xa1;
|
|
|
|
[DllImport("user32.dll")]
|
|
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
|
|
[DllImport("user32.dll")]
|
|
public static extern bool ReleaseCapture();
|
|
|
|
private Panel TitleBar;
|
|
private Label LblTitle;
|
|
private PictureBox PicIcon;
|
|
private PictureBox BtnMinimize;
|
|
private PictureBox BtnMinMax;
|
|
private PictureBox BtnClose;
|
|
|
|
public STForm()
|
|
{
|
|
InitializeComponent();
|
|
|
|
mLastState = this.WindowState;
|
|
|
|
SetStyle(ControlStyles.ResizeRedraw, true);
|
|
|
|
ForeColor = FormThemes.BaseTheme.FormForeColor;
|
|
BackColor = FormThemes.BaseTheme.FormBackColor;
|
|
BorderColor = FormThemes.BaseTheme.MDIChildBorderColor;
|
|
TitleBar.BackColor = BorderColor;
|
|
|
|
StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
|
|
}
|
|
|
|
protected override void OnCreateControl()
|
|
{
|
|
this.ControlBox = false;
|
|
this.DoubleBuffered = true;
|
|
|
|
base.OnCreateControl();
|
|
}
|
|
|
|
private void InitializeComponent()
|
|
{
|
|
this.contentContainer = new Switch_Toolbox.Library.Forms.STPanel();
|
|
this.TitleBar = new System.Windows.Forms.Panel();
|
|
this.LblTitle = new System.Windows.Forms.Label();
|
|
this.PicIcon = new System.Windows.Forms.PictureBox();
|
|
this.BtnMinimize = new System.Windows.Forms.PictureBox();
|
|
this.BtnMinMax = new System.Windows.Forms.PictureBox();
|
|
this.BtnClose = new System.Windows.Forms.PictureBox();
|
|
this.contentContainer.SuspendLayout();
|
|
this.TitleBar.SuspendLayout();
|
|
((System.ComponentModel.ISupportInitialize)(this.PicIcon)).BeginInit();
|
|
((System.ComponentModel.ISupportInitialize)(this.BtnMinimize)).BeginInit();
|
|
((System.ComponentModel.ISupportInitialize)(this.BtnMinMax)).BeginInit();
|
|
((System.ComponentModel.ISupportInitialize)(this.BtnClose)).BeginInit();
|
|
this.SuspendLayout();
|
|
//
|
|
// contentContainer
|
|
//
|
|
this.contentContainer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
|
|
| System.Windows.Forms.AnchorStyles.Left)
|
|
| System.Windows.Forms.AnchorStyles.Right)));
|
|
this.contentContainer.Controls.Add(this.TitleBar);
|
|
this.contentContainer.Location = new System.Drawing.Point(3, 2);
|
|
this.contentContainer.Name = "contentContainer";
|
|
this.contentContainer.Size = new System.Drawing.Size(543, 393);
|
|
this.contentContainer.TabIndex = 11;
|
|
//
|
|
// TitleBar
|
|
//
|
|
this.TitleBar.BackColor = System.Drawing.Color.White;
|
|
this.TitleBar.Controls.Add(this.LblTitle);
|
|
this.TitleBar.Controls.Add(this.PicIcon);
|
|
this.TitleBar.Controls.Add(this.BtnMinimize);
|
|
this.TitleBar.Controls.Add(this.BtnMinMax);
|
|
this.TitleBar.Controls.Add(this.BtnClose);
|
|
this.TitleBar.Dock = System.Windows.Forms.DockStyle.Top;
|
|
this.TitleBar.Location = new System.Drawing.Point(0, 0);
|
|
this.TitleBar.Name = "TitleBar";
|
|
this.TitleBar.Size = new System.Drawing.Size(543, 25);
|
|
this.TitleBar.TabIndex = 10;
|
|
this.TitleBar.DoubleClick += new System.EventHandler(this.TitleBar_DoubleClick);
|
|
this.TitleBar.MouseDown += new System.Windows.Forms.MouseEventHandler(this.TitleBar_MouseDown);
|
|
//
|
|
// LblTitle
|
|
//
|
|
this.LblTitle.AutoSize = true;
|
|
this.LblTitle.Font = new System.Drawing.Font("Segoe UI Semibold", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
|
this.LblTitle.Location = new System.Drawing.Point(20, 3);
|
|
this.LblTitle.Name = "LblTitle";
|
|
this.LblTitle.Size = new System.Drawing.Size(33, 17);
|
|
this.LblTitle.TabIndex = 5;
|
|
this.LblTitle.Text = "Title";
|
|
this.LblTitle.MouseDown += new System.Windows.Forms.MouseEventHandler(this.TitleBar_MouseDown);
|
|
//
|
|
// PicIcon
|
|
//
|
|
this.PicIcon.Location = new System.Drawing.Point(5, 5);
|
|
this.PicIcon.Name = "PicIcon";
|
|
this.PicIcon.Size = new System.Drawing.Size(16, 16);
|
|
this.PicIcon.TabIndex = 4;
|
|
this.PicIcon.TabStop = false;
|
|
//
|
|
// BtnMinimize
|
|
//
|
|
this.BtnMinimize.BackColor = System.Drawing.Color.Transparent;
|
|
this.BtnMinimize.Dock = System.Windows.Forms.DockStyle.Right;
|
|
this.BtnMinimize.Image = global::Switch_Toolbox.Library.Properties.Resources.minimize;
|
|
this.BtnMinimize.Location = new System.Drawing.Point(429, 0);
|
|
this.BtnMinimize.Name = "BtnMinimize";
|
|
this.BtnMinimize.Size = new System.Drawing.Size(38, 25);
|
|
this.BtnMinimize.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
|
|
this.BtnMinimize.TabIndex = 3;
|
|
this.BtnMinimize.TabStop = false;
|
|
this.BtnMinimize.Click += new System.EventHandler(this.BtnMinimize_Click);
|
|
this.BtnMinimize.MouseEnter += new System.EventHandler(this.BtnMinimize_MouseEnter);
|
|
this.BtnMinimize.MouseLeave += new System.EventHandler(this.BtnMinimize_MouseLeave);
|
|
//
|
|
// BtnMinMax
|
|
//
|
|
this.BtnMinMax.BackColor = System.Drawing.Color.Transparent;
|
|
this.BtnMinMax.Dock = System.Windows.Forms.DockStyle.Right;
|
|
this.BtnMinMax.Image = global::Switch_Toolbox.Library.Properties.Resources.maximize;
|
|
this.BtnMinMax.Location = new System.Drawing.Point(467, 0);
|
|
this.BtnMinMax.Name = "BtnMinMax";
|
|
this.BtnMinMax.Size = new System.Drawing.Size(38, 25);
|
|
this.BtnMinMax.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
|
|
this.BtnMinMax.TabIndex = 2;
|
|
this.BtnMinMax.TabStop = false;
|
|
this.BtnMinMax.Click += new System.EventHandler(this.BtnMinMax_Click);
|
|
this.BtnMinMax.MouseEnter += new System.EventHandler(this.BtnMinMax_MouseEnter);
|
|
this.BtnMinMax.MouseLeave += new System.EventHandler(this.BtnMinMax_MouseLeave);
|
|
//
|
|
// BtnClose
|
|
//
|
|
this.BtnClose.BackColor = System.Drawing.Color.Transparent;
|
|
this.BtnClose.Dock = System.Windows.Forms.DockStyle.Right;
|
|
this.BtnClose.Image = global::Switch_Toolbox.Library.Properties.Resources.Close;
|
|
this.BtnClose.Location = new System.Drawing.Point(505, 0);
|
|
this.BtnClose.Name = "BtnClose";
|
|
this.BtnClose.Size = new System.Drawing.Size(38, 25);
|
|
this.BtnClose.SizeMode = System.Windows.Forms.PictureBoxSizeMode.CenterImage;
|
|
this.BtnClose.TabIndex = 1;
|
|
this.BtnClose.TabStop = false;
|
|
this.BtnClose.Click += new System.EventHandler(this.BtnClose_Click);
|
|
this.BtnClose.MouseEnter += new System.EventHandler(this.BtnClose_MouseEnter);
|
|
this.BtnClose.MouseLeave += new System.EventHandler(this.BtnClose_MouseLeave);
|
|
//
|
|
// STForm
|
|
//
|
|
this.ClientSize = new System.Drawing.Size(549, 398);
|
|
this.ControlBox = false;
|
|
this.Controls.Add(this.contentContainer);
|
|
this.DoubleBuffered = true;
|
|
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
|
|
this.Name = "STForm";
|
|
this.Shown += new System.EventHandler(this.STForm_Shown);
|
|
this.Paint += new System.Windows.Forms.PaintEventHandler(this.STForm_Paint);
|
|
this.Enter += new System.EventHandler(this.STForm_Enter);
|
|
this.Leave += new System.EventHandler(this.STForm_Leave);
|
|
this.contentContainer.ResumeLayout(false);
|
|
this.TitleBar.ResumeLayout(false);
|
|
this.TitleBar.PerformLayout();
|
|
((System.ComponentModel.ISupportInitialize)(this.PicIcon)).EndInit();
|
|
((System.ComponentModel.ISupportInitialize)(this.BtnMinimize)).EndInit();
|
|
((System.ComponentModel.ISupportInitialize)(this.BtnMinMax)).EndInit();
|
|
((System.ComponentModel.ISupportInitialize)(this.BtnClose)).EndInit();
|
|
this.ResumeLayout(false);
|
|
|
|
}
|
|
|
|
#region Events
|
|
|
|
private void BtnMinimize_Click(object sender, System.EventArgs e)
|
|
{
|
|
WindowState = FormWindowState.Minimized;
|
|
}
|
|
|
|
private void BtnMinMax_Click(object sender, System.EventArgs e)
|
|
{
|
|
CheckWindowState();
|
|
}
|
|
public void Maximize()
|
|
{
|
|
MaximumSize = Screen.FromControl(this).WorkingArea.Size;
|
|
WindowState = FormWindowState.Maximized;
|
|
|
|
if (IsMdiChild)
|
|
MDIMaximized();
|
|
}
|
|
private void CheckWindowState()
|
|
{
|
|
if (WindowState == FormWindowState.Maximized)
|
|
{
|
|
BtnMinMax.Image = Properties.Resources.maximize;
|
|
WindowState = FormWindowState.Normal;
|
|
|
|
if (IsMdiChild)
|
|
MDIWindowed();
|
|
}
|
|
else
|
|
{
|
|
BtnMinMax.Image = Properties.Resources.maximized;
|
|
|
|
Maximize();
|
|
}
|
|
Refresh();
|
|
}
|
|
|
|
public void MDIWindowed()
|
|
{
|
|
TitleBar.Show();
|
|
|
|
this.ClientSize = new System.Drawing.Size(549, 398);
|
|
}
|
|
public void MDIMaximized()
|
|
{
|
|
TitleBar.Hide();
|
|
}
|
|
|
|
private void BtnClose_Click(object sender, System.EventArgs e)
|
|
{
|
|
Close();
|
|
}
|
|
|
|
private void BtnClose_MouseEnter(object sender, System.EventArgs e)
|
|
{
|
|
BtnClose.Image = Properties.Resources.Close_Hover;
|
|
}
|
|
|
|
private void BtnClose_MouseLeave(object sender, System.EventArgs e)
|
|
{
|
|
BtnClose.Image = Properties.Resources.Close;
|
|
}
|
|
|
|
private void BtnMinMax_MouseEnter(object sender, EventArgs e)
|
|
{
|
|
BtnMinMax.Image = Properties.Resources.maximize_sele;
|
|
}
|
|
|
|
private void BtnMinMax_MouseLeave(object sender, EventArgs e)
|
|
{
|
|
BtnMinMax.Image = Properties.Resources.maximize;
|
|
}
|
|
|
|
private void BtnMinimize_MouseEnter(object sender, EventArgs e)
|
|
{
|
|
BtnMinimize.Image = Properties.Resources.minimize_sele;
|
|
}
|
|
|
|
private void BtnMinimize_MouseLeave(object sender, EventArgs e)
|
|
{
|
|
BtnMinimize.Image = Properties.Resources.minimize;
|
|
}
|
|
|
|
|
|
private void TitleBar_MouseDown(object sender, MouseEventArgs e)
|
|
{
|
|
if (e.Button == MouseButtons.Left && e.Y < 28)
|
|
{
|
|
ReleaseCapture();
|
|
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
|
|
}
|
|
}
|
|
|
|
private void STForm_Paint(object sender, PaintEventArgs e)
|
|
{
|
|
e.Graphics.DrawRectangle(new Pen(BorderColor, BorderSize),
|
|
this.DisplayRectangle);
|
|
|
|
using (SolidBrush brush = new SolidBrush(BorderColor))
|
|
{
|
|
e.Graphics.FillRectangle(brush, Top);
|
|
e.Graphics.FillRectangle(brush, Left);
|
|
e.Graphics.FillRectangle(brush, Right);
|
|
e.Graphics.FillRectangle(brush, Bottom);
|
|
}
|
|
}
|
|
|
|
private void STForm_Leave(object sender, EventArgs e)
|
|
{
|
|
return;
|
|
|
|
BorderColor = FormThemes.BaseTheme.DisabledBorderColor;
|
|
TitleBar.BackColor = BorderColor;
|
|
LblTitle.ForeColor = FormThemes.BaseTheme.DisabledItemColor;
|
|
Refresh();
|
|
}
|
|
|
|
private void STForm_Enter(object sender, EventArgs e)
|
|
{
|
|
return;
|
|
|
|
BorderColor = FormThemes.BaseTheme.MDIChildBorderColor;
|
|
TitleBar.BackColor = BorderColor;
|
|
LblTitle.ForeColor = FormThemes.BaseTheme.TextForeColor;
|
|
Refresh();
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
#region Shadow
|
|
|
|
private void STForm_Shown(object sender, EventArgs e)
|
|
{
|
|
|
|
}
|
|
|
|
private FormWindowState mLastState;
|
|
|
|
protected override void OnClientSizeChanged(EventArgs e)
|
|
{
|
|
/* if (this.WindowState != mLastState)
|
|
{
|
|
mLastState = this.WindowState;
|
|
OnWindowStateChanged(e);
|
|
}
|
|
base.OnClientSizeChanged(e);*/
|
|
}
|
|
protected void OnWindowStateChanged(EventArgs e)
|
|
{
|
|
if (this.WindowState == FormWindowState.Normal)
|
|
{
|
|
if (IsMdiChild)
|
|
MDIWindowed();
|
|
}
|
|
else if (this.WindowState == FormWindowState.Maximized)
|
|
{
|
|
if (IsMdiChild)
|
|
MDIMaximized();
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Border
|
|
private const int
|
|
HTLEFT = 10,
|
|
HTRIGHT = 11,
|
|
HTTOP = 12,
|
|
HTTOPLEFT = 13,
|
|
HTTOPRIGHT = 14,
|
|
HTBOTTOM = 15,
|
|
HTBOTTOMLEFT = 16,
|
|
HTBOTTOMRIGHT = 17;
|
|
|
|
Rectangle Top { get { return new Rectangle(0, 0, this.ClientSize.Width, BorderSize); } }
|
|
Rectangle Left { get { return new Rectangle(0, 0, BorderSize, this.ClientSize.Height); } }
|
|
|
|
private void TitleBar_DoubleClick(object sender, EventArgs e)
|
|
{
|
|
if (canResize)
|
|
{
|
|
Maximize();
|
|
}
|
|
}
|
|
|
|
Rectangle Bottom { get { return new Rectangle(0, this.ClientSize.Height - BorderSize, this.ClientSize.Width, BorderSize); } }
|
|
Rectangle Right { get { return new Rectangle(this.ClientSize.Width - BorderSize, 0, BorderSize, this.ClientSize.Height); } }
|
|
|
|
Rectangle TopLeft { get { return new Rectangle(0, 0, BorderSize, BorderSize); } }
|
|
Rectangle TopRight { get { return new Rectangle(this.ClientSize.Width - BorderSize, 0, BorderSize, BorderSize); } }
|
|
Rectangle BottomLeft { get { return new Rectangle(0, this.ClientSize.Height - BorderSize, BorderSize, BorderSize); } }
|
|
Rectangle BottomRight { get { return new Rectangle(this.ClientSize.Width - BorderSize, this.ClientSize.Height - BorderSize, BorderSize, BorderSize); } }
|
|
|
|
protected override void WndProc(ref Message message)
|
|
{
|
|
base.WndProc(ref message);
|
|
|
|
if (message.Msg == WM_NCHITTEST && CanResize && WindowState == FormWindowState.Normal)
|
|
{
|
|
int x = message.LParam.ToInt32() & 0xffff;
|
|
int y = (int)((message.LParam.ToInt32() & 0xffff0000) >> 16);
|
|
|
|
Point cursor = PointToClient(new Point(x, y));
|
|
|
|
// var cursor = this.PointToClient(Cursor.Position);
|
|
|
|
if (TopLeft.Contains(cursor)) message.Result = (IntPtr)HTTOPLEFT;
|
|
else if (TopRight.Contains(cursor)) message.Result = (IntPtr)HTTOPRIGHT;
|
|
else if (BottomLeft.Contains(cursor)) message.Result = (IntPtr)HTBOTTOMLEFT;
|
|
else if (BottomRight.Contains(cursor)) message.Result = (IntPtr)HTBOTTOMRIGHT;
|
|
|
|
else if (Top.Contains(cursor)) message.Result = (IntPtr)HTTOP;
|
|
else if (Left.Contains(cursor)) message.Result = (IntPtr)HTLEFT;
|
|
else if (Right.Contains(cursor)) message.Result = (IntPtr)HTRIGHT;
|
|
else if (Bottom.Contains(cursor)) message.Result = (IntPtr)HTBOTTOM;
|
|
}
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
}
|