Messenger/MSGer.tk/ThemedForms.cs

242 lines
9.6 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MSGer.tk
{
public partial class ThemedForms : Form
{ //2014.12.21.
public const int BorderSize = 3;
private bool overridecontrols = false;
public ThemedForms()
{
InitializeComponent();
this.Load += ThemedForms_Load;
overridecontrols = true;
}
protected void ThemedForms_Load(object sender, EventArgs e)
{
List<AnchorStyles> anchors = new List<AnchorStyles>();
foreach (Control control in containerPanel.Controls)
{
anchors.Add(control.Anchor);
control.Anchor = AnchorStyles.Top | AnchorStyles.Left;
}
this.SuspendLayout();
base.FormBorderStyle = FormBorderStyle.None;
this.Size = base.Size;
CloseButton.Location = new Point(this.Size.Width - CloseButton.Size.Width, 0);
MaximizeButton.Location = new Point(this.Size.Width - CloseButton.Size.Width - MaximizeButton.Size.Width, 0);
MinimizeButton.Location = new Point(this.Size.Width - CloseButton.Size.Width - MaximizeButton.Size.Width - MinimizeButton.Size.Width, 0);
titleLabel.Location = new Point(BorderSize, titleLabel.Location.Y);
containerPanel.Location = new Point(BorderSize, titleLabel.Location.Y + titleLabel.Size.Height);
int i = 0;
this.ResumeLayout(true);
foreach (var anchor in anchors)
{
containerPanel.Controls[i].Anchor = anchor;
i++;
}
titleLabel.Anchor = AnchorStyles.Top | AnchorStyles.Left;
CloseButton.Anchor = AnchorStyles.Top | AnchorStyles.Right;
MaximizeButton.Anchor = AnchorStyles.Top | AnchorStyles.Right;
MinimizeButton.Anchor = AnchorStyles.Top | AnchorStyles.Right;
containerPanel.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom;
Theme.SkinControl(Theme.ThemePart.Border, this); //2014.12.24.
Theme.SkinControl(Theme.ThemePart.MinimizeButton, MinimizeButton); //2014.12.24.
Theme.SkinControl(Theme.ThemePart.MaximizeButton, MaximizeButton); //2014.12.24.
Theme.SkinControl(Theme.ThemePart.CloseButton, CloseButton); //2014.12.24.
}
public new Control.ControlCollection Controls
{
get
{
if (overridecontrols)
return containerPanel.Controls;
else
return base.Controls;
}
}
private FormBorderStyle borderstyle = FormBorderStyle.Sizable;
public new FormBorderStyle FormBorderStyle
{
get
{
return borderstyle;
}
set
{
borderstyle = value;
base.FormBorderStyle = FormBorderStyle.None;
}
}
public override string Text
{
get
{
return base.Text;
}
set
{
titleLabel.Text = value;
base.Text = value;
}
}
public new Size Size
{
get
{
return base.Size;
}
set
{
base.Size = new Size(value.Width + containerPanel.Location.X + BorderSize, value.Height + containerPanel.Location.Y + BorderSize);
containerPanel.Size = value;
}
}
private void CloseButton_Click(object sender, EventArgs e)
{
this.Close();
}
private void MaximizeButton_Click(object sender, EventArgs e)
{
if (!MaximizeBox)
return;
FormWindowState ws; //Anti-virus program miatt
if (WindowState == FormWindowState.Normal)
ws = FormWindowState.Maximized;
else
ws = FormWindowState.Normal;
Timer t = new Timer();
t.Interval = 10;
t.Tick += delegate
{
t.Stop();
base.FormBorderStyle = FormBorderStyle.Sizable; //Látszik egy kis időre, de tán így a legkönnyebb
WindowState = ws;
base.FormBorderStyle = FormBorderStyle.None;
};
t.Start();
}
private void MinimizeButton_Click(object sender, EventArgs e)
{
if (!MinimizeBox)
return;
//base.FormBorderStyle = FormBorderStyle.Sizable;
WindowState = FormWindowState.Minimized;
}
private FormWindowState wstate;
private void ThemedForms_Resize(object sender, EventArgs e)
{
if (this.WindowState == wstate)
return;
if (this.WindowState == FormWindowState.Maximized && wstate == FormWindowState.Minimized) //minimized-ről váltott maximized-re
{
this.WindowState = FormWindowState.Normal;
base.FormBorderStyle = FormBorderStyle.Sizable;
this.WindowState = FormWindowState.Maximized;
base.FormBorderStyle = FormBorderStyle.None;
}
wstate = this.WindowState;
}
private bool moving = false;
private int resizing = 0;
private Timer moveresizetimer = new Timer();
//private Point diffcursorpos;
private Point moveresizecursor;
private void ThemedForms_MouseDown(object sender, MouseEventArgs e)
{
Point cursorpos = this.PointToClient(Cursor.Position);
//diffcursorpos = this.PointToClient(Cursor.Position);
moveresizecursor = this.PointToClient(Cursor.Position); //Mindig ehhez igazítsa
if (cursorpos.X > containerPanel.Location.X + containerPanel.Size.Width)
resizing = 1; //right
else if (cursorpos.X < containerPanel.Location.X)
resizing = 2; //left
else if (cursorpos.Y > containerPanel.Location.Y + containerPanel.Size.Height)
resizing = 3; //bottom
else if (cursorpos.Y < containerPanel.Location.Y)
moving = true; //top
if(!moveresizetimer.Enabled)
{
moveresizetimer.Interval = 10;
moveresizetimer.Tick += moveresizetimer_Tick;
moveresizetimer.Start();
}
}
void moveresizetimer_Tick(object sender, EventArgs e)
{
if (moving)
{
//this.Location -= cursorpos - this.PointToClient(Cursor.Position);
/*int diffx = diffcursorpos.X - this.PointToClient(Cursor.Position).X;
int diffy = diffcursorpos.Y - this.PointToClient(Cursor.Position).Y;
this.Location = new Point(this.Location.X - diffx, this.Location.Y - diffy);
diffcursorpos = this.PointToClient(Cursor.Position);*/
int diffx = this.PointToClient(Cursor.Position).X - moveresizecursor.X;
int diffy = this.PointToClient(Cursor.Position).Y - moveresizecursor.Y;
this.Location = new Point(this.Location.X + diffx, this.Location.Y + diffy);
}
if (resizing > 0 && borderstyle == FormBorderStyle.Sizable)
{
/*int diffx = diffcursorpos.X - this.PointToClient(Cursor.Position).X;
int diffy = diffcursorpos.Y - this.PointToClient(Cursor.Position).Y;
switch(resizing)
{
case 1: //right
base.Size = new Size(this.Size.Width - diffx, this.Size.Height);
break;
}
diffcursorpos = this.PointToClient(Cursor.Position);*/
if (resizing == 1)
base.Size = new Size(Cursor.Position.X - base.Location.X, base.Size.Height);
else if (resizing == 2)
{
int diff = base.Location.X - Cursor.Position.X;
base.Location = new Point(Cursor.Position.X, base.Location.Y);
base.Size = new Size(base.Size.Width + diff, base.Size.Height);
}
else if (resizing == 3)
base.Size = new Size(base.Size.Width, Cursor.Position.Y - base.Location.Y);
}
}
private void ThemedForms_MouseUp(object sender, MouseEventArgs e)
{
moving = false;
resizing = 0;
moveresizetimer.Stop();
}
private void ThemedForms_DoubleClick(object sender, EventArgs e)
{
if (this.PointToClient(Cursor.Position).Y < containerPanel.Location.Y)
{
if (this.WindowState == FormWindowState.Normal)
{
this.WindowState = FormWindowState.Normal;
base.FormBorderStyle = FormBorderStyle.Sizable;
this.WindowState = FormWindowState.Maximized;
base.FormBorderStyle = FormBorderStyle.None;
}
else
this.WindowState = FormWindowState.Normal;
}
}
}
}