HYAppFrame项目地址:https://sourceforge.net/projects/hyappframe/
// 已打开表单集合 private static ArrayList frmList; public static ArrayList FrmLsit { get{ return frmList; } set{ frmList = value; } } // 已打开Tab选项卡 private static ArrayList tabList; public static ArrayList TabList { get{ return tabList; } set{ tabList = value; } }
打开给定窗体,并将窗体加入到全局数组FrmList
private void showForm(Form frm) { frm.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; frm.MdiParent = this; frm.Dock = DockStyle.Fill; frm.Show(); MyFuncLib.FrmLsit.Add(frm); MyFuncLib.ActivedFrm = frm; }
激活给定窗体,并将窗体置于最前。
private void activeForm(Form frm) { frm.Activate(); frm.Focus(); frm.BringToFront(); MyFuncLib.ActivedFrm = frm; }
打开或激活目标窗体,当给定一个窗体时,首先检查这个窗体是否打开,如果打开则激活它,并设置对应的标签选项卡为选中状态,如果未打开,则打开窗体,并在标签栏中加入窗体标签。窗体和标签选项卡名称要完全一致,否则将无法对应。
private voidOpenOrActiveForm(string name, string text) { // 判断传入的是否是窗体 if (!isForm) return; Boolean isOpen = false; #region 判断目标窗体是否打开,如果已打开则激活 foreach (Form frm in MyFuncLib.FrmLsit) { if (frm.Name.Equals(name)) { isOpen = true; foreach (TabPage tabItem inMyFuncLib.TabList) { if (tabItem.Name.Equals(name)) this.tabForms.SelectedTab =tabItem; } // 激活窗体 activeForm(frm); break; } } #endregion #region 如果未曾打开,则打开打开窗体 if (!isOpen) { Form frm = null; Assembly assembly =Assembly.GetExecutingAssembly(); frm =assembly.CreateInstance(namespaceString + "." + name) as Form; if (frm == null) { MyFuncLib.msg("未找到指定的程序窗体", "w"); return; } frm.Name = name ; showForm(frm);// 显示表单 TabPage tabPage = new TabPage(); tabPage.Name = name; tabPage.Text = text; this.tabForms.TabPages.Add(tabPage); this.tabForms.SelectedTab = tabPage; MyFuncLib.TabList.Add(tabPage); } #endregion }
单击标签选项卡时,找到对应的窗体并激活。
private voidtabForms_SelectedIndexChanged(object sender, EventArgs e) { TabPage tab =((TabControl)sender).SelectedTab; if (tab == null) return; foreach (Form frm in MyFuncLib.FrmLsit) { if (frm.Name.Equals(tab.Name)) { activeForm(frm); break; } } }
在TabForms控件DrawItem事件中加入绘制选项卡关闭图标
private void TabForms_DrawItem(object sender,DrawItemEventArgs e) { DrawCloseImage(close16grey, e); } private void DrawCloseImage(Bitmap image,DrawItemEventArgs e) { try { // 取得tabPage选项卡矩形区域 Rectangle rect = this.tabForms.GetTabRect(e.Index); #region 设置tabPage选中时的背景颜色 Color recColor = e.State == DrawItemState.Selected ?Color.FromArgb(214,231,247) : Color.White; using (Brush b = new SolidBrush(recColor)) { e.Graphics.FillRectangle(b, rect); } #endregion // 绘制TabPage e.Graphics.DrawString(this.tabForms.TabPages[e.Index].Text, this.Font,SystemBrushes.ControlText, rect.X + 2, rect.Y + 2); #region 按照关闭图标大小画一个矩形区域 using (Pen p = new Pen(Color.White)) { rect.Offset(rect.Width - (CLOSEIMAGESIZE + 3), 2); rect.Width = CLOSEIMAGESIZE; rect.Height = CLOSEIMAGESIZE; e.Graphics.DrawRectangle(p, rect); } #endregion #region 使用图标填充这个区域 using (Pen objpen = new Pen(Color.Black)) { Bitmap bt = new Bitmap(image); Point p5 = new Point(rect.X, 4); e.Graphics.DrawImage(bt, p5); } #endregion // 释放资源 e.Graphics.Dispose(); } catch (Exception) { } }
在TabForms控件MouseDown事件中加入关闭窗体、移出选项卡的代码,难点在于如何获得鼠标单击坐标,其光标是否在“关闭图标”范围内,如果在则继续执行代码。值得说明的是,这里无法通过tabPage_Click事件达到目的。
private void TabForms_MouseDown(object sender,MouseEventArgs e) { if(e.Button == MouseButtons.Left) { int x = e.X, y = e.Y; //计算关闭区域 Rectangle rect = this.tabForms.GetTabRect(this.tabForms.SelectedIndex); rect.Offset(rect.Width - (CLOSEIMAGESIZE + 3), 2); rect.Width = CLOSEIMAGESIZE; rect.Height = CLOSEIMAGESIZE; //如果鼠标在区域内就关闭选项卡 bool isClose = x > rect.X && x < rect.Right && y> rect.Y && y < rect.Bottom; if (isClose == true) { #region 移除Form和tab选项卡 TabPage tab = this.tabForms.SelectedTab; // 选择左侧tab选项卡 if (this.tabForms.SelectedIndex > 1) this.tabForms.SelectedIndex = this.tabForms.SelectedIndex - 1; this.tabForms.TabPages.Remove(tab); foreach (Form frm in MyFuncLib.FrmLsit) { if (frm.Name.Equals(tab.Name)) { MyFuncLib.FrmLsit.Remove(frm); frm.Close(); break; } } #endregion #region 显示当前Form foreach (Form frm in MyFuncLib.FrmLsit) { if (frm.Name.Equals(this.tabForms.SelectedTab.Name)) { activeForm(frm); break; } } #endregion } } }
本章节中如何窗体名称调用窗体实体类?
如何在父窗体中的按钮执行子窗体中的方法?
如何在子窗体中打开另一个子窗体?
原文地址:http://blog.csdn.net/daiqianjie/article/details/44198303