给你的MDI程序加上一个标签栏,方便地切换和关闭子窗体
2007-05-25 09:30
239 查看
效果如下图所示,应该说还不错吧,菜单简陋了一点,不过你可以根据自己的需要扩充。
因为能力有限,没能实现给当前的TabPage加一些修饰,不像专业软件那么漂亮,不过还能凑合用^_^
![](http://www.chenjiliang.com/Article/ArticleImage/79/1877/MDI1.jpg)
做法如下:
首先创建一个MDI子窗口的基类
然后,在MDI的主窗体中拖上一个TabControl,加入一下代码
最后,在创建MDI窗口对象时,把它放进TabControl就行了
因为能力有限,没能实现给当前的TabPage加一些修饰,不像专业软件那么漂亮,不过还能凑合用^_^
![](http://www.chenjiliang.com/Article/ArticleImage/79/1877/MDI1.jpg)
做法如下:
首先创建一个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);
相关文章推荐
- 给你的MDI程序加上一个标签栏,方便地切换和关闭子窗体
- 给你的MDI程序加上一个标签栏
- 给你的MDI程序加上一个标签栏
- 如何在其它程序窗口(已知窗口的句柄)加上一个按钮
- 一个在unicode文本插入标签的程序小结
- 如何暴力关闭一个服务程序?
- 在图片的左上角加上一个图片标签
- 一个比较方便的关闭进程函数
- 一个可以快速关机和快速锁定并关闭显示的小程序
- 请南京的和方便来南京的程序注意了!正准备搞一个聚会
- Delphi scktsrvr 三层架构程序,解决“远程主机强迫关闭了一个现有的连接”
- Android中实现“程序前后台切换效果”和“返回正在运行的程序,而不是一个新Activity”
- 当一个类被加载后,它的静态变量生命周期是什么,是整个应用程序执行结束(比如java web程序,从类加载到服务器关闭还是该线程执行完毕)还是别的什么?
- 基础问题:在一个 Activity 中定义的串口接收程序,如果 Activity 切换到其它 Activity 后还能接收到串口数据吗?
- Facebook Graph Search (FGS)一个加上社交链、人性化标签的巨大搜索
- Linux中写一个已被关闭的套接字时程序终止的解决方法
- 一个方便打印C程序调试信息的宏
- RzPageControl(pagecontrol)实现多标签的动态添加,切换,关闭
- Python 练习册,每天一个小程序----------000 图片右上角加上红色的数字
- 关于派生类的构造的——一个程序的分析(钱能c++ P353),加上了析构函数