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.Threading;
using System.Windows.Forms;
using DPumpHydr.WinFrmUI.WenSkin.Controls;
using DPumpHydr.WinFrmUI.WenSkin.Properties;
namespace DPumpHydr.WinFrmUI.WenSkin.Forms
{
public class WenForm : Form
{
public WenForm()
{
RefreshPadding();
SystemButtonAdd();
base.SetStyle(
ControlStyles.UserPaint |
ControlStyles.DoubleBuffer |
ControlStyles.OptimizedDoubleBuffer |
ControlStyles.AllPaintingInWmPaint |
ControlStyles.ResizeRedraw |
ControlStyles.SupportsTransparentBackColor, true);
base.UpdateStyles();
this.MaximizedBounds = Screen.PrimaryScreen.WorkingArea;
this.BackColor = Color.FromArgb(37, 37, 38);
this.ForeColor = Color.White;
this.Name = "WenForm";
this.Text = "WenForm";
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
//this.Icon = Properties.Resources.logo;
}
#region 私有属性
private int buttonPointX = 0;
private int frameWidth = 3;
private int titleHeight = 30;
private Color frameColor = Color.FromArgb(45, 45, 48);
private Color backColor = Color.FromArgb(30, 30, 30);
private Color foreColor = Color.FromArgb(255, 255, 255);
private bool configButtonBox;
private bool skinButtonBox;
#endregion
#region 公有属性
[DefaultValue(4), Category("Wen"), Description("边框宽度"), RefreshProperties(RefreshProperties.All)]
public int FrameWidth
{
get => frameWidth;
set
{
frameWidth = value;
RefreshPadding();
}
}
[DefaultValue(30), Category("Wen"), Description("标题高度"), RefreshProperties(RefreshProperties.All)]
public int TitleHeight
{
get => titleHeight;
set
{
titleHeight = value;
RefreshPadding();
}
}
[DefaultValue(typeof(Color), "45, 45, 48"), Category("WenColor"), Description("边框颜色")]
public Color FrameColor
{
get => frameColor;
set
{
frameColor = value;
FrameColorChanged?.Invoke(this, null);
this.Invalidate();
}
}
[DefaultValue(typeof(Color), "255, 255, 255"), Category("WenColor"), Description("前景色")]
public override Color ForeColor
{
get => foreColor;
set
{
foreColor = value;
base.ForeColor = value;
this.Invalidate();
}
}
[DefaultValue(typeof(Color), "37, 37, 38"), Category("WenColor"), Description("背景色")]
public override Color BackColor
{
get => this.backColor;
set
{
//若为系统颜色改为酷黑色
if (value == System.Drawing.SystemColors.Control)
{
value = Color.FromArgb(37, 37, 38);
}
base.BackColor = value;
this.backColor = value;
this.Invalidate();
}
}
[DefaultValue(false), Category("Wen"), Description("是否显示设置按钮")]
public bool ConfigButtonBox
{
get => configButtonBox;
set
{
configButtonBox = value;
SystemButtonAdd();
}
}
[DefaultValue(false), Category("Wen"), Description("是否显示皮肤按钮")]
public bool SkinButtonBox
{
get => skinButtonBox;
set
{
skinButtonBox = value;
SystemButtonAdd();
}
}
[DefaultValue(true), Category("Wen"), Description("窗体是否可拉伸大小")]
public bool Stretching { get; set; } = true;
[DefaultValue(typeof(Padding), "0,30,0,0"), Category("布局"), Description("指定控件内部间距")]
public new Padding Padding { get => base.Padding; set => base.Padding = value; }
#endregion
#region 委托
[Category("Wen"), Description("边框颜色改变事件")]
public event EventHandler FrameColorChanged;
[Category("Wen"), Description("设置按钮点击事件")]
public event EventHandler ConfigButtonClick;
[Category("Wen"), Description("皮肤按钮点击事件")]
public event EventHandler SkinButtonClick;
#endregion
#region 重写属性
public override string Text
{
get => base.Text;
set
{
base.Text = value;
this.Invalidate();
}
}
#endregion
#region 刷新控件边框标题区域
protected virtual void RefreshPadding()
{
base.Padding = new Padding() { Top = TitleHeight, Left = FrameWidth, Bottom = FrameWidth, Right = FrameWidth };
this.Invalidate();
}
#endregion
#region 重绘
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics g = e.Graphics;
WenSkin.Controls.ControlHelper.SetGDIHigh(g);
DrawRecFrame(g);
DrawTitle(g);
}
#endregion
#region 重绘边框
private void DrawRecFrame(Graphics g)
{
//绘制4个框背景
Brush b = new SolidBrush(FrameColor);
//左边
g.FillRectangle(b, 0, 0, FrameWidth, this.Height);
//右边
g.FillRectangle(b, this.Width - FrameWidth, 0, FrameWidth, this.Height);
//底部
g.FillRectangle(b, 0, this.Height - FrameWidth, this.Width, FrameWidth);
//绘制标题行背景
g.FillRectangle(b, 0, 0, this.Width, TitleHeight);
}
#endregion
#region 重绘标题行
private void DrawTitle(Graphics g)
{
try
{
//标题行绘制
if (this.Icon != null)
{
g.DrawImage(this.Icon.ToBitmap(), new Rectangle(7, 7, 16, 16));
}
}
catch { }
Rectangle recText = new Rectangle(30, 0, this.Width - buttonPointX - 30, 30);
g.DrawString(this.Text, Font, new SolidBrush(this.ForeColor), recText, WenSkin.Controls.ControlHelper.StringConters);
}
#endregion
#region 添加系统按钮
public new bool MaximizeBox
{
get => base.MaximizeBox;
set
{
base.MaximizeBox = value;
SystemButtonAdd();
}
}
public new bool MinimizeBox
{
get => base.MinimizeBox;
set
{
base.MinimizeBox = value;
SystemButtonAdd();
}
}
private void SystemButtonAdd()
{
buttonPointX = 0;
CloseButtonAdd();
MaxButtonAdd();
MinButtonAdd();
ConfigButtonAdd();
SkinButtonAdd();
}
#region 添加关闭按钮
private void CloseButtonAdd()
{
if (this.Controls["SystemButtonClose"] is WenControl close)
{
this.Controls.Remove(close);
}
buttonPointX += 46;
int x = buttonPointX;
WenControl wenControl = new WenControl()
{
BackColor = Color.Transparent,
Width = 46,
Height = 30,
Location = new Point(this.Width - x, 0),
Name = "SystemButtonClose"
};
wenControl.MouseEnter += (s, e) =>
{
wenControl.BackColor = Color.FromArgb(63, 63, 65);
};
wenControl.MouseLeave += (s, e) =>
{
wenControl.BackColor = Color.Transparent;
};
wenControl.Paint += (s, e) =>
{
Graphics g = e.Graphics;
g.SetGDIHigh();
using Pen p = new Pen(Color.White, 1);
g.DrawLine(p, 18, 11, 18 + 8, 11 + 8);
g.DrawLine(p, 18, 11 + 8, 18 + 8, 11);
};
wenControl.Click += (s, e) =>
{
this.Close();
};
this.SizeChanged += (s, e) =>
{
wenControl.Location = new Point(this.Width - x, 0);
};
this.Controls.Add(wenControl);
}
#endregion
#region 添加最大化按钮
private void MaxButtonAdd()
{
if (this.Controls["SystemButtonMax"] is WenControl max)
{
this.Controls.Remove(max);
}
if (!MaximizeBox)
return;
buttonPointX += 46;
int x = buttonPointX;
WenControl wenControl = new WenControl()
{
BackColor = Color.Transparent,
Width = 46,
Height = 30,
Location = new Point(this.Width - x, 0),
Name = "SystemButtonMax"
};
wenControl.MouseEnter += (s, e) =>
{
wenControl.BackColor = Color.FromArgb(63, 63, 65);
};
wenControl.MouseLeave += (s, e) =>
{
wenControl.BackColor = Color.Transparent;
};
wenControl.Paint += (s, e) =>
{
Graphics g = e.Graphics;
g.SetGDIHigh();
using Pen p = new Pen(Color.White, 1);
if (this.WindowState == FormWindowState.Maximized)
{
g.DrawRectangle(p, 18, 11 + 2, 6, 6);
g.DrawRectangle(p, 18 + 2, 11, 6, 6);
}
else
{
g.DrawRectangle(p, 18, 11, 8, 8);
}
};
wenControl.Click += (s, e) =>
{
if (WindowState == FormWindowState.Maximized)
{
this.WindowState = FormWindowState.Normal;
}
else
{
this.WindowState = FormWindowState.Maximized;
}
};
this.SizeChanged += (s, e) =>
{
wenControl.Location = new Point(this.Width - x, 0);
};
this.Controls.Add(wenControl);
}
#endregion
#region 最小化按钮
private void MinButtonAdd()
{
if (this.Controls["SystemButtonMin"] is WenControl min)
{
this.Controls.Remove(min);
}
if (!MinimizeBox)
return;
buttonPointX += 46;
int x = buttonPointX;
WenControl wenControl = new WenControl()
{
BackColor = Color.Transparent,
Width = 46,
Height = 30,
Location = new Point(this.Width - x, 0),
Name = "SystemButtonMin"
};
wenControl.MouseEnter += (s, e) =>
{
wenControl.BackColor = Color.FromArgb(63, 63, 65);
};
wenControl.MouseLeave += (s, e) =>
{
wenControl.BackColor = Color.Transparent;
};
wenControl.Paint += (s, e) =>
{
Graphics g = e.Graphics;
g.SetGDIHigh();
using Pen p = new Pen(Color.White, 1);
g.DrawLine(p, 18, 15, 18 + 8, 15);
};
wenControl.Click += (s, e) =>
{
this.WindowState = FormWindowState.Minimized;
};
this.SizeChanged += (s, e) =>
{
wenControl.Location = new Point(this.Width - x, 0);
};
this.Controls.Add(wenControl);
}
#endregion
#region 设置按钮
private void ConfigButtonAdd()
{
if (this.Controls["SystemButtonConfig"] is WenControl c)
{
this.Controls.Remove(c);
}
if (!ConfigButtonBox)
return;
buttonPointX += 46;
int x = buttonPointX;
WenControl wenControl = new WenControl()
{
BackColor = Color.Transparent,
Width = 46,
Height = 30,
Location = new Point(this.Width - x, 0),
Name = "SystemButtonConfig"
};
wenControl.MouseEnter += (s, e) =>
{
wenControl.BackColor = Color.FromArgb(63, 63, 65);
};
wenControl.MouseLeave += (s, e) =>
{
wenControl.BackColor = Color.Transparent;
};
wenControl.Paint += (s, e) =>
{
Graphics g = e.Graphics;
g.SetGDIHigh();
g.DrawImage(DPumpHydr.WinFrmUI.WenSkin.Properties.Resources.setbutton, new Rectangle(13, 5, 20, 20));
};
wenControl.Click += (s, e) =>
{
ConfigButtonClick?.Invoke(this, e);
};
this.SizeChanged += (s, e) =>
{
wenControl.Location = new Point(this.Width - x, 0);
};
this.Controls.Add(wenControl);
}
#endregion
#region 皮肤按钮
private void SkinButtonAdd()
{
if (this.Controls["SystemButtonSkin"] is WenControl c)
{
this.Controls.Remove(c);
}
if (!SkinButtonBox)
return;
buttonPointX += 46;
int x = buttonPointX;
WenControl wenControl = new WenControl()
{
BackColor = Color.Transparent,
Width = 46,
Height = 30,
Location = new Point(this.Width - x, 0),
Name = "SystemButtonSkin"
};
wenControl.MouseEnter += (s, e) =>
{
wenControl.BackColor = Color.FromArgb(63, 63, 65);
};
wenControl.MouseLeave += (s, e) =>
{
wenControl.BackColor = Color.Transparent;
};
wenControl.Paint += (s, e) =>
{
Graphics g = e.Graphics;
g.SetGDIHigh();
g.DrawImage(Properties.Resources.skin, new Rectangle(13, 5, 20, 20));
};
wenControl.Click += (s, e) =>
{
SkinButtonClick?.Invoke(this, e);
};
this.SizeChanged += (s, e) =>
{
wenControl.Location = new Point(this.Width - x, 0);
};
this.Controls.Add(wenControl);
}
#endregion
#endregion
#region 鼠标双击事件
protected override void OnDoubleClick(EventArgs e)
{
base.OnDoubleClick(e);
if (!MaximizeBox)
return;
if (WindowState == FormWindowState.Maximized)
{
this.WindowState = FormWindowState.Normal;
}
else
{
this.WindowState = FormWindowState.Maximized;
}
}
#endregion
#region 窗体拉动大小及拖动窗口
const int Guying_HTLEFT = 10;
const int Guying_HTRIGHT = 11;
const int Guying_HTTOP = 12;
const int Guying_HTTOPLEFT = 13;
const int Guying_HTTOPRIGHT = 14;
const int Guying_HTBOTTOM = 15;
const int Guying_HTBOTTOMLEFT = 0x10;
const int Guying_HTBOTTOMRIGHT = 17;
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case 0x0084:
base.WndProc(ref m);
if (!Stretching)
return;
Point vPoint = new Point((int)m.LParam & 0xFFFF,
(int)m.LParam >> 16 & 0xFFFF);
vPoint = PointToClient(vPoint);
if (vPoint.X <= 5)
if (vPoint.Y <= 5)
m.Result = (IntPtr)Guying_HTTOPLEFT;
else if (vPoint.Y >= ClientSize.Height - 5)
m.Result = (IntPtr)Guying_HTBOTTOMLEFT;
else m.Result = (IntPtr)Guying_HTLEFT;
else if (vPoint.X >= ClientSize.Width - 5)
if (vPoint.Y <= 5)
m.Result = (IntPtr)Guying_HTTOPRIGHT;
else if (vPoint.Y >= ClientSize.Height - 5)
m.Result = (IntPtr)Guying_HTBOTTOMRIGHT;
else m.Result = (IntPtr)Guying_HTRIGHT;
else if (vPoint.Y <= 5)
m.Result = (IntPtr)Guying_HTTOP;
else if (vPoint.Y >= ClientSize.Height - 5)
m.Result = (IntPtr)Guying_HTBOTTOM;
break;
case 0x0201: //鼠标左键按下的消息
m.Msg = 0x00A1; //更改消息为非客户区按下鼠标
m.LParam = IntPtr.Zero; //默认值
m.WParam = new IntPtr(2);//鼠标放在标题栏内
base.WndProc(ref m);
break;
default:
base.WndProc(ref m);
break;
}
}
#endregion
#region 消息提示框
///
/// 消息
///
///
///
public bool MsgBoxInformation(string text)
{
//var m = MessageBox.Show(text, "提醒", MessageBoxButtons.OK, MessageBoxIcon.Information);
var m = new MsgBox(text, MsgBox.MsgBoxIcon.Info).ShowDialog();
if (m == DialogResult.OK)
return true;
else
return false;
}
///
/// 提醒
///
///
///
public bool MsgBoxAsterisk(string text)
{
//var m = MessageBox.Show(text, "提醒", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk);
var m = new MsgBox(text, MsgBox.MsgBoxIcon.Asterisk).ShowDialog();
if (m == DialogResult.OK)
return true;
else
return false;
}
///
/// 警告
///
///
///
public bool MsgBoxWarning(string text)
{
//var m = MessageBox.Show(text, "警告", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
var m = new MsgBox(text, MsgBox.MsgBoxIcon.Warning).ShowDialog();
if (m == DialogResult.OK)
return true;
else
return false;
}
///
/// 错误
///
///
///
public bool MsgBoxError(string text)
{
//var m = MessageBox.Show(text, "错误", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
var m = new MsgBox(text, MsgBox.MsgBoxIcon.Error).ShowDialog();
if (m == DialogResult.OK)
return true;
else
return false;
}
#endregion
}
}