您的位置:首页 > 移动开发 > Objective-C

给你的MDI程序加上一个标签栏,方便地切换和关闭子窗体

2007-05-25 09:30 239 查看
效果如下图所示,应该说还不错吧,菜单简陋了一点,不过你可以根据自己的需要扩充。
因为能力有限,没能实现给当前的TabPage加一些修饰,不像专业软件那么漂亮,不过还能凑合用^_^





做法如下:
首先创建一个MDI子窗口的基类

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace ECHaierHR.Common
{
/// <summary>
/// MDIChild 的摘要说明。
/// </summary>
public class MDIChild : System.Windows.Forms.Form
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
private TabControl tabCtrl;
private TabPage tabPag;

public MDIChild()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();

//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose(disposing);
}

#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
//
// MDIChild
//
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Name = "MDIChild";
this.Text = "MDIChild";
this.Closing += new System.ComponentModel.CancelEventHandler(this.MDIChild_Closing);
this.Activated += new System.EventHandler(this.MDIChild_Activated);

}
#endregion

private void MDIChild_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
//Destroy the corresponding Tabpage when closing MDI child form
if (this.tabPag != null)
this.tabPag.Dispose();

//If no Tabpage left
if (this.tabCtrl != null && !tabCtrl.HasChildren)
{
tabCtrl.Visible = false;
}
}

private void MDIChild_Activated(object sender, System.EventArgs e)
{
//Activate the corresponding Tabpage
tabCtrl.SelectedTab = tabPag;

if (!tabCtrl.Visible)
{
tabCtrl.Visible = true;
}
}

public TabControl TabCtrl
{
set { this.tabCtrl = value; }
}
public TabPage TabPag
{
get { return this.tabPag; }
set { this.tabPag = value; }
}
}
}


然后,在MDI的主窗体中拖上一个TabControl,加入一下代码

#region 把MDI窗口与TabControl关联并加入快捷菜单

private void tabControl1_SelectedIndexChanged(object sender, System.EventArgs e)
{
foreach (MDIChild childForm in this.MdiChildren)
{
//Check for its corresponding MDI child form
if (childForm.TabPag.Equals(tabControl1.SelectedTab))
{
//Activate the MDI child form
childForm.Select();
}
}
}
private void AddMDIChildToTabCtrl(MDIChild frmChild)
{
frmChild.MdiParent = this;

//child Form will now hold a reference value to the tab control
frmChild.TabCtrl = tabControl1;

//Add a Tabpage and enables it
TabPage tp = new TabPage();
tp.Parent = tabControl1;
tp.Text = frmChild.Text;
tp.Show();

//child Form will now hold a reference value to a tabpage
frmChild.TabPag = tp;
frmChild.Show();
}

private void ctxmnuClose_Click(object sender, System.EventArgs e)
{
if (this.tabControl1.Visible)
{
MDIChild childForm = (MDIChild) this.ActiveMdiChild;
childForm.Close();
}
}

private void tabControl1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
Rectangle rct;
for (int i = 0; i < tabControl1.TabPages.Count; i++)
{
rct = tabControl1.GetTabRect(i);

if (rct.Contains(e.X, e.Y))
{
//tabControl1.SelectedIndex = i;
tabControl1.SelectedTab = tabControl1.TabPages[i];
break;
}
}
}
}

#endregion


最后,在创建MDI窗口对象时,把它放进TabControl就行了

Employee emp = new Employee();
this.AddMDIChildToTabCtrl(emp);

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐