#region
using System;
using System.ComponentModel;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
#endregion
namespace CSFrameworkV5.Library.UIForm
{
public enum FormSize
{
NORMAL = 0, //正常大小
MAX = 1 //最大化
}
public partial class frmBaseUI : Form
{
private const int WM_NCHITTEST = 0x0084;
private const int HTLEFT = 10; //左边界
private const int HTRIGHT = 11; //右边界
private const int HTTOP = 12; //上边界
private const int HTTOPLEFT = 13; //左上角
private const int HTTOPRIGHT = 14; //右上角
private const int HTBOTTOM = 15; //下边界
private const int HTBOTTOMLEFT = 0x10; //左下角
private const int HTBOTTOMRIGHT = 17; //右下角
///
/// 窗口默认大小
/// FormSize.NORMAL OR FormSize.MAX
///
private FormSize defaultFormSize = FormSize.NORMAL;
///
/// 是否允许最大化
///
private bool maxVisible = true;
private Point mPoint;
///
/// 窗体标题
///
private string titleText;
///
/// 窗体标题是否显示
///
private bool titleVisible = true;
public frmBaseUI()
{
InitializeComponent();
}
[Description("窗口默认大小")]
public FormSize DefaultFormSize
{
get => defaultFormSize;
set
{
defaultFormSize = value;
if (defaultFormSize == FormSize.MAX)
{
//防止遮挡任务栏
MaximumSize = new Size(
Screen.PrimaryScreen.WorkingArea.Width,
Screen.PrimaryScreen.WorkingArea.Height);
WindowState = FormWindowState.Maximized;
//最大化图标切换
}
}
}
[Description("是否允许最大化")]
public bool MaxVisible
{
get => maxVisible;
set
{
maxVisible = value;
if (!maxVisible)
{
btnEXMin.Location = new Point(btnEXMax.Location.X, 12);
btnEXMax.Visible = false;
}
else
{
btnEXMin.Location = new Point(btnEXMax.Location.X - 20, 12);
btnEXMax.Visible = true;
}
}
}
[Description("窗体标题")]
public string TitleText
{
get => titleText;
set
{
titleText = value;
title.Text = titleText;
}
}
[Description("窗体标题是否显示")]
public bool TitleVisible
{
get => titleVisible;
set
{
titleVisible = value;
title.Visible = titleVisible;
}
}
///
/// 关闭按钮事件
///
///
///
private void btnEXClose_ButtonClick(object sender, EventArgs e)
{
Close();
}
///
/// 最大化按钮事件
///
///
///
private void btnEXMax_ButtonClick(object sender, EventArgs e)
{
MaxNormalSwitch();
}
///
/// 最小化按钮事件
///
///
///
private void btnEXMin_ButtonClick(object sender, EventArgs e)
{
WindowState = FormWindowState.Minimized;
}
private void FormEX_Resize(object sender, EventArgs e)
{
Invalidate(); //使重绘
}
///
/// 最大化和正常状态切换
///
private void MaxNormalSwitch()
{
if (WindowState ==
FormWindowState.Maximized) //如果当前状态是最大化状态 则窗体需要恢复默认大小
{
WindowState = FormWindowState.Normal;
//
}
else
{
//防止遮挡任务栏
MaximumSize = new Size(Screen.PrimaryScreen.WorkingArea.Width,
Screen.PrimaryScreen.WorkingArea.Height);
WindowState = FormWindowState.Maximized;
//最大化图标切换
}
Invalidate(); //使重绘
}
private void titleBar_DoubleClick(object sender, EventArgs e)
{
MaxNormalSwitch();
}
///
/// 鼠标按下标题栏
///
///
///
private void titleBar_MouseDown(object sender, MouseEventArgs e)
{
mPoint = new Point(e.X, e.Y);
}
///
/// 鼠标在移动
///
///
///
private void titleBar_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
Location = new Point(Location.X + e.X - mPoint.X,
Location.Y + e.Y - mPoint.Y);
}
#region 无边框窗体移动、放大、缩小
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_NCHITTEST:
base.WndProc(ref m);
var 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)HTTOPLEFT;
else if (vPoint.Y >= ClientSize.Height - 5)
m.Result = (IntPtr)HTBOTTOMLEFT;
else
m.Result = (IntPtr)HTLEFT;
}
else if (vPoint.X >= ClientSize.Width - 5)
{
if (vPoint.Y <= 5)
m.Result = (IntPtr)HTTOPRIGHT;
else if (vPoint.Y >= ClientSize.Height - 5)
m.Result = (IntPtr)HTBOTTOMRIGHT;
else
m.Result = (IntPtr)HTRIGHT;
}
else if (vPoint.Y <= 5)
{
m.Result = (IntPtr)HTTOP;
}
else if (vPoint.Y >= ClientSize.Height - 5)
{
m.Result = (IntPtr)HTBOTTOM;
}
break;
case WM_NCPAINT: //四周阴影 box shadow
if (m_aeroEnabled)
{
var v = 2;
DwmSetWindowAttribute(Handle, 2, ref v, 4);
var margins = new MARGINS
{
bottomHeight = 1,
leftWidth = 1,
rightWidth = 1,
topHeight = 1
};
DwmExtendFrameIntoClientArea(Handle, ref margins);
}
break;
}
base.WndProc(ref m);
if (m.Msg == WM_NCHITTEST &&
(int)m.Result == HTCLIENT) // drag the form
m.Result = (IntPtr)HTCAPTION;
}
#endregion
#region 窗体四周阴影
[DllImport("dwmapi.dll")]
public static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd,
ref MARGINS pMarInset);
[DllImport("dwmapi.dll")]
public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr,
ref int attrValue, int attrSize);
[DllImport("dwmapi.dll")]
public static extern int DwmIsCompositionEnabled(ref int pfEnabled);
private bool m_aeroEnabled; // variables for box shadow
private const int CS_DROPSHADOW = 0x00020000;
private const int WM_NCPAINT = 0x0085;
private const int WM_ACTIVATEAPP = 0x001C;
public struct MARGINS // struct for box shadow
{
public int leftWidth;
public int rightWidth;
public int topHeight;
public int bottomHeight;
}
//private const int WM_NCHITTEST = 0x84; // variables for dragging the form
private const int HTCLIENT = 0x1;
private const int HTCAPTION = 0x2;
protected override CreateParams CreateParams
{
get
{
m_aeroEnabled = CheckAeroEnabled();
var cp = base.CreateParams;
if (!m_aeroEnabled) cp.ClassStyle |= CS_DROPSHADOW;
return cp;
}
}
private bool CheckAeroEnabled()
{
if (Environment.OSVersion.Version.Major >= 6)
{
var enabled = 0;
DwmIsCompositionEnabled(ref enabled);
return enabled == 1 ? true : false;
}
return false;
}
#endregion
}
}