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.Windows.Forms; using DPumpHydr.WinFrmUI.WenSkin.Controls; namespace DPumpHydr.WinFrmUI.WenSkin.Forms { public partial class WenTabControlForm : LeftButtonForm { public WenTabControlForm() { RefreshPadding(); this.Name = "WenTabControlForm"; this.Text = "WenTabControlForm"; tabControl = new WenTabControl() { Dock = DockStyle.Fill, IconEnable=true, }; tabControl.SelectedIndexChanged += (s, e) => { this.Text = $"{DefaultText} - {tabControl.SelectedTab?.Text}"; }; tabControl.ControlRemoved += TabControl_ControlRemoved; this.Controls.Add(tabControl); } private void TabControl_ControlRemoved(object sender, ControlEventArgs e) { e.Control.Dispose(); } private WenTabControl tabControl; #region 公有属性 [Category("Wen"), Description("选项卡点击后默认显示内容"), DefaultValue(null)] public string DefaultText { get; set; } #endregion public void TabPageAdd(Control c, Image image = null) { TabControlAddEventArgs e = new TabControlAddEventArgs(c) { Image = image, }; OnTabControlAdd(e); } protected override void OnLeftMenuClick(LeftMenuItem item) { base.OnLeftMenuClick(item); TabControlAddEventArgs e = new TabControlAddEventArgs(item); OnTabControlAdd(e); } //检查TabPage 是否存在 public TabPage GetTabPage(string text) { foreach (TabPage item in tabControl.TabPages) { if (item.Text == text) return item; } return null; } //显示指定页 public void ShowTabPage(string text) { ShowTabPage(GetTabPage(text)); } //显示指定页 public void ShowTabPage(TabPage tab) { tabControl.SelectedTab = tab; } #region 委托事件 protected virtual void OnTabControlAdd(TabControlAddEventArgs e) { foreach (WenTabPage p in tabControl.TabPages) { if (p.Text == e.Text) { if (p.Controls.Count > 0 && e.Control == null) { e.Control = p.Controls[0]; } tabControl.SelectedTab = p; e.TabPage = p; e.Show = true; e.Refresh = false; e.NewAdd = false; } } if (e.TabPage == null) { e.TabPage = new WenTabPage(e.Text) { BackColor = Color.Transparent, Image = e.Image ?? e.Item.Image }; } TabControlAdd?.Invoke(this, e); if (e.State) { if (e.NewAdd && !tabControl.TabPages.Contains(e.TabPage)) { tabControl.TabPages.Add(e.TabPage); tabControl.SelectedTab = e.TabPage; this.Text = $"{DefaultText} - {e.TabPage.Text}"; } if (e.Control != null && e.Refresh) { e.TabPage.Controls.Clear(); e.Control.Dock = DockStyle.Fill; e.TabPage.Controls.Add(e.Control); Point mouseOff = new Point(0, 0); //鼠标移动位置变量 bool leftFlag = false; //标签是否为左键 e.Control.MouseDown += (s, e) => { if (e.Button == MouseButtons.Left) { var point = this.PointToClient(MousePosition); mouseOff = new Point(-point.X, -point.Y); leftFlag = true; //点击左键按下时标注为true; } }; e.Control.MouseMove += (s, e) => { if (leftFlag) { Point mouseSet = MousePosition; mouseSet.Offset(mouseOff.X, mouseOff.Y); //设置移动后的位置 Location = mouseSet; } }; e.Control.MouseUp += (s, e) => { if (leftFlag) { leftFlag = false; //释放鼠标后标注为false; } }; } } } //声明 API 函数 [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); public class TabControlAddEventArgs : EventArgs { public TabControlAddEventArgs() { TabPage = null; Control = null; Show = false; State = true; Refresh = true; NewAdd = true; } public TabControlAddEventArgs(string text) : this() { Item = new LeftMenuItem(text); Text = text; } public TabControlAddEventArgs(Control c) : this(c.Text) { Control = c; } public TabControlAddEventArgs(LeftMenuItem item) : this() { Item = item; Text = item.Text; } private Control control; private bool newAdd; private string text; private Image image; public LeftMenuItem Item { get; set; } public Control Control { get => control; set { control = value; Refresh = true; } } [Category("Wen"), Description("当前选项卡"), DefaultValue(null)] public WenTabPage TabPage { get; set; } [Category("Wen"), Description("是否已经显示"), DefaultValue(null)] public bool Show { get; set; } [Category("Wen"), Description("是否继续处理事件"), DefaultValue(null)] public bool State { get; set; } [Category("Wen"), Description("标签页显示内容"), DefaultValue(null)] public string Text { get => text; set { text = value; if (TabPage != null) TabPage.Text = value; } } [Category("Wen"), Description("标签页文字显示内容"), DefaultValue(null)] public string TabPageText { get => TabPage.Text; set => TabPage.Text = value; } [Category("Wen"), Description("是否刷新内容"), DefaultValue(null)] public bool Refresh { get; set; } [Category("Wen"), Description("是否添加新标签页"), DefaultValue(null)] public bool NewAdd { get => newAdd; set { newAdd = value; if (!value) State = false; } } [Category("Wen"), Description("标签图标"), DefaultValue(null)] public Image Image { get => image; set { image = value; if (TabPage != null) TabPage.Image = value; } } } #endregion #region 委托 public delegate void TabControlAddEventHandler(object sender, TabControlAddEventArgs e); [Category("Wen"), Description("选项卡添加事件")] public event TabControlAddEventHandler TabControlAdd; #endregion } }