SmartHouseAPI/Source/MyHouse/SkinForms/SkinMdiForm.cs
zilinsoft f0ff641ed4 ## 2025-02-08 星期六更新
### MyHouse    V1.0.2502.0801
- *.[新增]适配新版接口。
### SmartHouseAPI    V1.0.2502.0801
- *.[新增]支持Docker部署,支持NAS。
2025-02-08 17:01:20 +08:00

204 lines
7.4 KiB
C#

using MGdu.WinFormUI;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace RySkins
{
public partial class SkinMdiForm : GMForm
{
/// <summary>
/// 顶部栏
/// </summary>
[Description("顶部栏")]
public Panel TopPanel { get; set; } = null;
public SkinMdiForm()
{
InitializeComponent();
InitMdiSkin();
}
#region
/// <summary>
/// 加载皮肤
/// </summary>
private void InitMdiSkin()
{
_mdiClient = FindMdiClient();
base.SizeChanged += new EventHandler((object sender, EventArgs e) =>
{
if (base.WindowState == FormWindowState.Maximized)
{
base.ControlBoxOffset = new Point(4, base.BorderWidth);
}
else
{
base.ControlBoxOffset = new Point(4, 1);
}
SetFormItemLocation(TopPanel);
});
base.Load += new EventHandler((object sender, EventArgs e) =>
{
base.XTheme = new ThemeForm();
base.XTheme.Mdi_TabMinWidth = 70;
base.XTheme.Mdi_TabNormalWidth = 100;
base.XTheme.Mdi_TabMaxWidth = 145;
base.XTheme.Mdi_ShowNewTabBtn = false;
base.XTheme.Mdi_AlwaysShowListAllBtn = false;
base.XTheme.Mdi_BarBottomRegionHeight = 0;
base.XTheme.Mdi_ShowTabCloseIcon = false;
base.XTheme.Mdi_TabShowBorder = false;
base.XTheme.Mdi_BarMargin = new Padding(6, 0, 100, 0);
base.XTheme.Mdi_TabActiveBackColorTop = Color.White;
base.XTheme.Mdi_TabActiveBackColorBottom = Color.FromArgb(248, 248, 248);
base.XTheme.Mdi_TabDeactiveBackColorTop = Color.FromArgb(230, 230, 230);
base.XTheme.Mdi_TabDeactiveBackColorBottom = Color.FromArgb(230, 230, 230);
//base.XTheme.Mdi_UseMsgToActivateChild
base.MdiNewTabButtonClick += new EventHandler(NewFormClick);
base.MdiTabCloseButtonClick += new EventHandler(ChildFormClose);
//base.XTheme.Mdi_TabTopSpace += 80;
if (_mdiClient != null)
{
_mdiClient.Dock = DockStyle.None;
_mdiClient.BackColor = Color.White;
}
});
base.MdiBarCreated += new EventHandler((object sender, EventArgs e) =>
{
SetFormItemLocation(TopPanel);
Application.DoEvents();
Thread th = new Thread(Start);
th.Start();
void Start()
{
Thread.Sleep(10);
this.Invoke(new Action(() =>
{
this.SuspendLayout();
for (int i = 0; i < MdiForms.Count; i++)
{
CreateNewChild(MdiForms[i]);
}
this.ResumeLayout(false);
//CreateNewChild(typeof(DbOp.FrmCaijiView));
//Application.DoEvents();
if (this.MdiChildren.Length > 0)
{
this.ActivateMdiChildForm(this.MdiChildren[0]);
}
}));
}
});
}
/// <summary>
/// 要初始化加载的Form列表
/// </summary>
public List<Form> MdiForms { get; set; } = new List<Form>();
/// <summary>
/// 创建子窗体
/// </summary>
/// <param name="form"></param>
public void CreateNewChild(Form form)
{
//form.SuspendLayout();
form.FormClosed += new FormClosedEventHandler(base.MdiChildClosed);
form.VisibleChanged += new EventHandler(base.MdiChildVisibleChange);
form.MdiParent = this;
//f.BackColor = Color.White;
form.FormBorderStyle = FormBorderStyle.SizableToolWindow;
form.SizeGripStyle = SizeGripStyle.Show;
form.WindowState = FormWindowState.Maximized;
form.Show();
// form.ResumeLayout(false);
//f.Focus();
}
MdiClient _mdiClient;
private int PanelTopHeight { get; set; } = 43;
private void NewFormClick(object sender, EventArgs e)
{
// CreateNewChild();
}
private void ChildFormClose(object sender, EventArgs e)
{
if (sender is Form f)
f.Close();
}
private MdiClient FindMdiClient()
{
MdiClient mdi = null;
foreach (Control c in Controls)
{
if ((mdi = c as MdiClient) != null)
{
break;
}
}
return mdi;
}
private void SetMdiBarLocation()
{
Padding newMargin = Padding.Empty;
//if (WindowState == FormWindowState.Maximized)
// newMargin = new Padding(BorderWidth, BorderWidth, BorderWidth, 0);
//else
//PnlMenu.Top = BorderWidth + base.XTheme.CaptionHeight;
newMargin = new Padding(BorderWidth, BorderWidth + base.XTheme.CaptionHeight + 0, BorderWidth, 0);
if (base.XTheme.Mdi_BarMargin != newMargin)
{
base.XTheme.Mdi_BarMargin = newMargin;
Invalidate();
}
}
private void SetPanelTopLocation(Panel PnlTop)
{
Point newLocation = new Point(base.MdiBarBounds.Left, base.MdiBarBounds.Bottom);
//if (panelTop.Location == newLocation)
// return;
//var size = new Size(base.MdiBarBounds.Width, PanelTopHeight);
//if (PnlTop != null)
//{
// PnlTop.Anchor = AnchorStyles.None;
// PnlTop.Location = newLocation;
// PnlTop.Size = size;
// PnlTop.Anchor = AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
//}
}
private void SetFormItemLocation(Panel PnlTop)
{
SetMdiBarLocation();
//SetPanelTopLocation(PnlTop);
SetMdiClientLocation(PnlTop);
}
private void SetMdiClientLocation(Panel PnlTop)
{
if (_mdiClient == null)
return;
Point newLocation = Point.Empty;
var size = ClientRectangle.Size;
if (PnlTop != null)
{
newLocation = new Point(PnlTop.Left, PnlTop.Bottom);
if (_mdiClient.Location == newLocation)
return;
int height = base.ClientSize.Height - newLocation.Y -
(base.ClientSize.Width - PnlTop.Width) / 2;
size = new Size(PnlTop.Width, height);
}
_mdiClient.Anchor = AnchorStyles.None;
_mdiClient.Location = newLocation;
_mdiClient.Size = size;
_mdiClient.Anchor =
AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom;
}
#endregion
}
}