创建一个主窗体(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. luogu P1502 窗口的星星

    题目链接 P1502 窗口的星星 题解 扫描线+线段树 线段树的每一个节点处理的是左边框放在当前x-1位置时的框内星星的亮度大小 按照x坐标进行离散化,得到离散化后每一个坐标x的可影响的范围 维护扫描 ...

  2. pygame系列_小球完全弹性碰撞游戏_源码下载

    之前做了一个基于python的tkinter的小球完全碰撞游戏: python开发_tkinter_小球完全弹性碰撞游戏_源码下载 今天利用业余时间,写了一个功能要强大一些的小球完全碰撞游戏: 游戏名 ...

  3. JavaScript正则表达式在不同浏览器中可能遇到的问题

    这两天在用正则表达式搞一个稍微有点复杂的东西,但是不同浏览器之间的差异可浪费了我不少的人参. 现在我把正则表达式在五大主流浏览器(IE.firefox.Chrome.Safari.Opera,以当前版 ...

  4. Oracle 取整函数

    ceil(n):ceil英文含义是天花板,天花板在上面,所以意为向上取整,即大于或等于n的整数. floor(n):floor英文含义是地板,地板在下面,所以意为向下取整,即小于或等于n的整数.

  5. Dapper Miser implementation of CMSIS-DAP, MC HCK as SWD Adapter

    Dapper Miser In late 2013, I created a functional implementation of CMSIS-DAP that runs in a low cos ...

  6. embOS实时操作系统 - 任务状态

    A task may be in one of several states at any given time. When a task is created, it is placed into ...

  7. btrace-dtrace-for-java-ish

    http://dtrace.org/blogs/ahl/2012/04/24/btrace-dtrace-for-java-ish/

  8. How AOT compares to a traditional JIT compiler

    Ahead-of-Time (AOT) compilation is in contrast to Just-in-Time compilation (JIT). In a nutshell, .NE ...

  9. 使用Axure RP原型设计实践02,自定义部件以及熟悉与部件相关面板

    本篇体验在Axure中自定义部件,并熟悉Widget Interations and Notes面板,Widget Properties and Style面板,Widget Manager面板. 在 ...

  10. MySQL对数据表进行分组查询

    MySQL对数据表进行分组查询(GROUP BY) GROUP BY关键字可以将查询结果按照某个字段或多个字段进行分组.字段中值相等的为一组.基本的语法格式如下: GROUP BY 属性名 [HAVI ...