创建一个主窗体(Formmain)、两个副窗体(Form1,Form2);在主窗体中分别添加一个menuStrip控件、tabControl控件,并在menu控件上添加一个主菜单和两个子菜单

 
继而,选中tabControl控件属性修改 DrawMode = OwnerDrawFixed,再根据如下代码添加即可:
public void Add_TabPage(string str, Form myForm)  
       {  
           if (tabControlCheckHave(this.MainTabControl, str))   
           {   
               return;   
           }  
           else  
           {  
               MainTabControl.TabPages.Add(str);  
               MainTabControl.SelectTab(MainTabControl.TabPages.Count - 1);  
                 
               myForm.FormBorderStyle = FormBorderStyle.None;  
               myForm.Dock = DockStyle.Fill;  
               myForm.TopLevel = false;  
               myForm.Show();  
               myForm.Parent = MainTabControl.SelectedTab;  
           }  
       }  
  
       public bool tabControlCheckHave(System.Windows.Forms.TabControl tab, String tabName)  
       {  
           for (int i = 0; i < tab.TabCount; i++)  
           {  
               if (tab.TabPages[i].Text == tabName)  
               {  
                   tab.SelectedIndex = i;  
                   return true;  
               }  
           }  
           return false;  
       }   
       private void form1ToolStripMenuItem_Click(object sender, EventArgs e)  
       {  
           Form1 f1= new Form1();  
           Add_TabPage("f1中华人民共和国窗体  ", f1);  
       }  
  
       private void form2ToolStripMenuItem_Click(object sender, EventArgs e)  
       {  
           Form2 f2 = new Form2();  
           Add_TabPage("f2朝鲜窗体  ", f2);  
       }  
  
       private void MainTabControl_DrawItem(object sender, DrawItemEventArgs e)  
       {  
           /*如果将 DrawMode 属性设置为 OwnerDrawFixed, 
           则每当 TabControl 需要绘制它的一个选项卡时,它就会引发 DrawItem 事件*/  
           try  
           {  
               this.MainTabControl.TabPages[e.Index].BackColor = Color.LightBlue;  
               Rectangle tabRect = this.MainTabControl.GetTabRect(e.Index);  
               e.Graphics.DrawString(this.MainTabControl.TabPages[e.Index].Text, this.Font, SystemBrushes.ControlText, (float)(tabRect.X + 2), (float)(tabRect.Y + 2));  
               using (Pen pen = new Pen(Color.White))  
               {  
                   tabRect.Offset(tabRect.Width - 15, 2);  
                   tabRect.Width = 15;  
                   tabRect.Height = 15;  
                   e.Graphics.DrawRectangle(pen, tabRect);  
               }  
               Color color = (e.State == DrawItemState.Selected) ? Color.LightBlue : Color.White;  
               using (Brush brush = new SolidBrush(color))  
               {  
                   e.Graphics.FillRectangle(brush, tabRect);  
               }  
               using (Pen pen2 = new Pen(Color.Red))  
               {  
                   Point point = new Point(tabRect.X + 3, tabRect.Y + 3);  
                   Point point2 = new Point((tabRect.X + tabRect.Width) - 3, (tabRect.Y + tabRect.Height) - 3);  
                   e.Graphics.DrawLine(pen2, point, point2);  
                   Point point3 = new Point(tabRect.X + 3, (tabRect.Y + tabRect.Height) - 3);  
                   Point point4 = new Point((tabRect.X + tabRect.Width) - 3, tabRect.Y + 3);  
                   e.Graphics.DrawLine(pen2, point3, point4);  
               }  
               e.Graphics.Dispose();  
           }  
           catch (Exception ex)  
           {  
               MessageBox.Show(ex.Message);  
           }  
       }  
  
       private void MainTabControl_MouseDown(object sender, MouseEventArgs e)  
       {  
           if (e.Button == MouseButtons.Left)  
           {  www.2cto.com
               int x = e.X;  
               int y = e.Y;  
  
               Rectangle tabRect = this.MainTabControl.GetTabRect(this.MainTabControl.SelectedIndex);  
               tabRect.Offset(tabRect.Width - 0x12, 2);  
               tabRect.Width = 15;  
               tabRect.Height = 15;  
               if ((((x > tabRect.X) && (x < tabRect.Right)) && (y > tabRect.Y)) && (y < tabRect.Bottom))  
               {  
                   this.MainTabControl.TabPages.Remove(this.MainTabControl.SelectedTab);  
               }  
           }  
       }  

C#利用tabControl控件实现多窗体嵌入及关闭的更多相关文章

  1. C/S模式开发中如何利用WebBrowser控件制作导航窗体

    原文:C/S模式开发中如何利用WebBrowser控件制作导航窗体 转自: CSDN 相信不少同学们都做过MIS系统的开发,今天这里不讨论B/S模式开发的问题.来谈谈winform开发.用过市面上常见 ...

  2. 在Winform开发框架中,利用DevExpress控件实现数据的快速录入和选择

    在实际的项目开发过程中,有好的控件或者功能模块,我都是想办法尽可能集成到我的WInform开发框架中,这样后面开发项目起来,就可以节省很多研究时间,并能重复使用,非常高效方便.在我很早之前的一篇博客& ...

  3. 利用 SerialPort 控件实现 PC 串口通信

    整理参考自<Visual C#.NET 串口通信及测控应用典型实例>1.3 节 以及 一篇博文:C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子. 硬件部分 如果是两个串 ...

  4. winform利用ImageList控件和ListView控件组合制作图片文件浏览器

    winform利用ImageList控件和ListView控件组合制作图片文件浏览器,见图,比较简单,实现LISTVIEW显示文件夹图片功能. 1.选择文件夹功能代码: folderBrowserDi ...

  5. 隐藏C#的TabControl控件的选项卡TabPage

    在使用TabControl控件时,希望隐藏其中某个选项卡(即TabPage).TabPage类明明提供了一个Hide方法,用在代码中却没有任何效果,甚是奇怪.无奈之余,只好考虑另辟途径.方法一:设置该 ...

  6. TabControl控件的美化

    文件下载:http://files.cnblogs.com/zfanlong1314/TabControlEX.rar 本文转载:http://www.cnblogs.com/lmlblog/arch ...

  7. WPF之TabControl控件用法

    先创建实体基类:NotificationObject(用来被实体类继承) 实现属性更改通知接口: using System; using System.Collections.Generic; usi ...

  8. Visual Studio中的TabControl控件的用法

    今天遇到了一个自己没遇到过的控件TabControl控件,所以找了点关于它的资料 TabControl属性 DisplayRect:只定该控件客户区的一个矩形  HotTrack:设置当鼠标经过页标签 ...

  9. WPF 自定义TabControl控件样式

    一.前言 程序中经常会用到TabControl控件,默认的控件样式很普通.而且样式或功能不一定符合我们的要求.比如:我们需要TabControl的标题能够居中.或平均分布:或者我们希望TabContr ...

随机推荐

  1. csdn 音乐 怎么拦截 提交后的程序 csdn 栏目 音乐 csdn 添加 音乐

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha csdn 栏目 音乐 csdn 添加 音乐 ======= <embed src= ...

  2. UOJ.26.[IOI2014]Game(交互 思路)

    题目链接 \(Description\) 有一张\(n\)个点的图.M每次询问\((u,v)\),你需要回答图中\((u,v)\)间是否有边.如果M可以用\(<n(n-1)/2\)次询问确定图中 ...

  3. ScrollView中嵌套GridView,Listview的办法

    按照android的标准,ScrollView中是不能嵌套具有滑动特性的View的,但是有时如果设计真的有这样做的需要,或者为了更方便简单的实现外观(比如在外在的大布局需要有滑动的特性,并且内部有类似 ...

  4. .net 中的async,await理解

    理解: 1.async修饰的方法可理解为异步方法(必须要配合await,否则和普通方法无异)2.当async方法执行遇到await,则立即将控制权转移到async方法的调用者3.由调用者决定是否需要等 ...

  5. Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem A. A + B

    Problem A. A + B 题目连接: http://opentrains.snarknews.info/~ejudge/team.cgi?SID=c75360ed7f2c7022&al ...

  6. C++ Curiously Recurring Template Prattern(CRTP)例程

    简单介绍和例子请参考:C++ 惯用法 CRTP 简介 下面例子为兼顾CRTP和多态的例子. #include <iostream> #include <vector> usin ...

  7. SourceTree的简单使用

    原文网址:http://blog.csdn.net/u011439289/article/details/42126507 今天开始参与公司项目的代码编写,公司内部采用的是gitlib,所以用到了So ...

  8. 添加Godaddy二级域名子域名方法

    我们在申请注册了Godaddy域名后,如果需要开通二级域名,方法简单只需要在Godaddy添加二级域名(子域名)只要在域名管理后台添加A记录或CNAME别名(Aliases)即可.但我们如果需要添加二 ...

  9. <label>标签引起的Firefox焦点问题

    在使用Dreamweaver做页面form的时候,默认情况下Dreamweaver都会生成一个<label>标签把元素包装一下,但是有事由于包装不好也会出现一些问题,例如我现在遇到的问题: ...

  10. ASP.NET MVC异步验证是如何工作的01,jQuery的验证方式、错误信息提示、validate方法的背后

    ASP.NET MVC借助jQuery的验证机制,提供了一套从客户端到服务端异步验证的解决方案,通常情况下,用起来相当方便.但面对一些相对特殊的情况,可能会遇到验证失效的场景,比如在使用ajax动态异 ...