Tabstrip 应用实例:创建选项卡式对话框
TabStrip 控件用来创建包含多个选项卡的对话框。选项卡之间通常具有一定关系,属于某一大类,因此需要将它与其它选项卡放在同一对话框中。在该应用实例中,创建了用来设置 RichTextBox 的字体和缩进的选项卡式对话框。下面的代码中使用了如下对象: 名为“frmRTF”的 Form 对象
名为“rtfData”的 RichTextBox 控件
名为“tabRTF”的 TabStrip 控件
名为“frmTab”的 Form 对象
名为“fraTab”的 Frame 控件
名为“cmbFonts”的 ComboBox 控件
名为“optNormal”的 OptionButton 控件
名为“optBullet”的 OptionButton 控件 
创建选项卡式对话框 创建两个窗体,名为“frmRTF”的包含 RichTextbox,名为“frmTab”的包含 TabStrip 控件。
在设计时,在 TabStrip 控件中创建两个 Tab 对象。
在“frmTab”中创建名为“fraTab”的 Frame 控件数组。
在 fraTab (0) 中绘制 ComboBox,在 fraTab (1) 中绘制两个 OptionButton 控件。
在Load 事件中用 Move 方法放置 Frame 控件。
在 TabStrip 控件的 Click 事件中,用 SelectedItem 属性确定被单击的 Tab 的索引。
在 ZOrder 方法中,用该索引可将合适的 Frame 显示在最前面。 
创建两个窗体,名为“frmRTF”的包含 RichTextbox,名为“frmTab”的包含 TabStrip 控件
本应用实例需要两个窗体:名为“frmRTF”的包含 RichTextBox 控件,另一个名为“frmTab”的包含 TabStrip 控件。创建两个 Form 对象 在“文件”菜单中单击“新建工程”,以显示“新建工程”对话框。
双击“标准EXE Project”图标,创建名为“Form1”的新窗体。
如果没有显示“属性”窗口,按下 F4 键即可显示出来。
单击“名称”框,并键入“frmRTF”。
在窗体中绘制 RichTextBox 控件。 
注意 必须先将 RichTextBox (RichTx32.ocx) 装入工具栏。详细信息请参阅“加载 ActiveX 控件”。在“属性”页窗口中,单击“名称”框,并键入“rtfData”。
在“工程资源管理器”窗口中单击“添加窗体”以显示“添加窗体”对话框。
双击“添加窗体”图标,在工程中加入另一窗体。
在“属性”窗口中,单击“名称”框并键入“frmTab”。
在 frmTab 中绘制 TabStrip 控件,并命名为“tabRTF”。 
还必须编写显示第二个窗体的代码。一个简单的办法是在第一个 Form 对象 (frmRTF) 的 DblClick 事件中使用 Show 方法,如下所示:Private Sub Form_DblClick()
   frmTab.Show
End Sub设计时在 TabStrip 控件中创建两个 Tab 对象
在设计时和运行时均可创建 Tab 对象。在本应用实例中,要在设计时创建两个选项卡。用鼠标右键单击 TabStrip 控件,并单击“属性”以显示“属性页”对话框。然后单击“选项卡”选项卡,并单击“插入选项卡”两次。请注意为它们赋予合适的标题:“字体”和“缩进”。在 frmTab 中创建名为“fraTab”的控件数组
TabStrip 控件通过管理 Tab 对象实现其功能。每个 Tab 对象与出现在该选项卡的客户区中的容器控件相关联。用控件数组创建这些容器控件最为方便。本应用实例中,在 TabStrip 控件所在的窗体中绘制 Frame 控件,并命名为“fraTab”。创建控件数组 在 frmTab 中创建 Frame 控件。
单击“属性”窗口中的“名称”框,并键入“fraTab”。
单击 Frame 控件,并按 CTRL+C 键或单击“编辑”菜单中的“复制”将其复制到剪贴板中。
按 CTRL+V 键将同一控件粘贴回该窗体。这时将弹出对话框询问是否需要创建控件数组,请单击“是”。 
在 fraTab(0) 中绘制 ComboBox 控件,在 fraTab(1) 中绘制两个 OptionButton 控件
在名为“fraTab(0)”的控件中绘制 ComboBox 控件,并将其命名为“cmbFonts”。用下面的代码可以将系统中可以使用的所有字体列入该 ComboBox:Private Sub Form_Load()
   Dim i   '声明变量。
   '确定字体的数目。
   For i = 0 To Printer.FontCount - 1  
      '将每种字体加入列表框中。
      cmbFonts.AddItem Printer.Fonts(I) 
   Next i
   cmbFonts.ListIndex = 0
End Sub用下面的代码为 RichTextbox 控件设置 SelFontName 属性:Private Sub cmbFonts_Click()
   frmRtf.rtfData.SelFontName = cmbFonts.Text
End Sub在名为“fraTab(0)”的 Frame 控件中绘制两个 OptionButton 控件。将第一个 OptionButton 控件命名为“optNormal”,并将其 Caption 属性设置为“Normal”。将第二个控件命名为“optBullet”,并将其 Caption 属性设置为“Bullet”。这些控件的代码分别将 SelBullet 属性设置为 True 或 False。代码分别如下:Private Sub optBullet_Click()
   'Form 对象的 ScaleMode 被设置为“缇”。
   frmRTF.rtfData.BulletIndent = 500
   frmRTF.rtfData.SelBullet = True
End SubPrivate Sub optNormal_Click()
   frmRTF.rtfData.SelBullet = False 
End Sub在 Load 事件中使用 Move 方法放置 Frame 控件
为了在客户区上放置 Frame 控件,可以在 Form 对象的 Load 事件中使用 Move 方法,如下所示:Private Sub Form_Load()
   'TabStrip 名为“tabRTF”。
   'Frame 控件名为“fraTab”。
   For i = 0 To    fraTab.Count - 1
   With fraTab(i)
      .Move tabRTF.ClientLeft, _
      tabRTF.ClientTop, _
      tabRTF.ClientWidth, _
      tabRTF.ClientHeight
   End With
   Next I
   
   '将第一个 fraTab 控件显示在最前面。
   fraTab(0).ZOrder 0
End Sub在 TabStrip 控件的 Click 事件中,用 SelectedItem 属性确定发生单击的 Tab 的索引
可以用 SelectedItem 属性确定被单击的 Tab 对象。该属性返回被单击的选项卡的引用。然而,Tabs 集合是基于 1 的集合(集合下标以 1 开始),而 fraTab 数组是基于 0 的集合。要使它们同步,需要将 Index 减 1,如下所示:   Private Sub tabRTF_Click()
      fraTab(tabRTF.SelectedItem.Index - 1).ZOrder 0
   End Sub
提示 在设计时,通过设置 Frame 控件数组的 Index 属性,可以将其变为基于 1 的数组。这样上述代码就变为:fraTab(tabRTF.SelectedItem.Index).ZOrder 0全部代码
全部代码显示如下:Private Sub Form_Load()
   Dim i As Integer'声明变量。
   '确定字体的总数。
   For i = 0 To Printer.FontCount - 1  
      '将每个字体加入列表框。
      cmbFonts.AddItem Printer.Fonts(i) 
   Next i   cmbFonts.ListIndex = 0
   
   'TabStrip 名为“tabRTF”。
   'Frame control 名为“fraTab”。
   For i = 0 To fraTab.Count - 1
   With fraTab(i)
      .Move tabRTF.ClientLeft, _
      tabRTF.ClientTop, _
      tabRTF.ClientWidth, _
      tabRTF.ClientHeight
   End With
   Next i   '将第一个 fraTab 控件显示在最前面。
   fraTab(0).ZOrder 0
End SubPrivate Sub cmbFonts_Click()
   frmRTF.rtfData.SelFontName = cmbFonts.Text
End SubPrivate Sub optBullet_Click()
   frmRTF.rtfData.BulletIndent = 500
   frmRTF.rtfData.SelBullet = True
End SubPrivate Sub optNormal_Click()
   frmRTF.rtfData.SelBullet = False
   
End SubPrivate Sub tabRTF_Click()
   fraTab(tabRTF.SelectedItem.Index - 1).ZOrder 0
End Sub下面的代码放入名为“frmRTF”的窗体中。Private Sub Form_DblClick()
   frmTab.Show
End Sub

解决方案 »

  1.   


    TabStrip 控件
                TabStrip 控件就象笔记本的书签或者一组文件夹的标签一样。通过使用 TabStrip 控件,可以在应用程序中为某个窗口或者对话框的相同区域定义多个页面。语法TabStrip说明该控件由 Tabs 集合中的一个或者更多个 Tab 对象组成。在设计时和运行时,都可以通过设置该控件的属性影响 Tab 对象外观。也可以在设计时用 TabStrip 控件的属性页来添加或删除选项卡,要是在运行时用方法来添加或删除 Tab 对象。Style 属性决定了 TabStrip 控件看起来是象下压按钮还是象笔记本标签 。在设计时将一个 TabStrip 控件放在某个窗体上时,它就有了一个笔记本标签。如果 Style 属性被设置为 tabTabs,那么 TabStrip 控件的内部区域周围将有一个边框。当 Style 属性被设置为 tabButtons 时,控件的内部区域周围不显示边框,不过,那个区域仍然存在。要设置 TabStrip 控件的整体大小,用其拖动句柄或者设置其 Top、Left、Height 和 Width 属性。运行时根据该控件的整体大小,Visual Basic 自动决定内部区域的大小和位置并返回 Client-coordinate 属性— ClientLeft、ClientTop、ClientHeight 和 ClientWidth。MultiRow 属性决定了该控件能否具有多于一行的选项卡,TabWidthStyle 属性决定了每一行的外观,还有,如果 TabWidthStyle 属性被设置为 tabFixed,则可以用 TabFixedHeight 和 TabFixedWidth 属性来给 TabStrip 控件中的所有选项卡设置相同的高度和宽度。TabStrip 控件不是容器。要想包含实际页面和它们的对象,必须用 Frame 控件或者其它容器,它们的大小必须与控件中所有 Tab 对象共享的内部区域匹配。如果针对该容器使用了一个控件数组,则可以使特定的 Tab 对象与数组中的每一项相关联,请看下例:Option Explicit
    Private mintCurFrame As Integer' Current Frame visiblePrivate Sub Tabstrip1_Click()
       If Tabstrip1.SelectedItem.Index = mintCurFrame _
          Then Exit Sub ' No need to change frame.
       ' Otherwise, hide old frame, show new.
       Frame1(Tabstrip1.SelectedItem.Index).Visible = True
       Frame1(mintCurFrame).Visible = False
       ' Set mintCurFrame to new value.
       mintCurFrame = Tabstrip1.SelectedItem.Index
    End Sub注意 在容器上将控件分组时,必须使用上述显示/隐藏策略,而不使用 Zorder Method 将框架带到全面来。否则,实现访问键(ALT + 访问键)的控件将一直响应键盘命令,甚至当容器不是最顶端的控件时也如此。还要注意,必须将每个组放在它自己的容器中,以此将 OptionButton 控件的组分离开,否则,窗体上的所有 OptionButtons 将象一大组 OptionButtons。提示 使用 BorderStyle 属性为 None 的 Frame 控件作为容器来取代 PictureBox 控件。Frame 控件比起 PictureBox 控件来说所花费的开销少。TabStrip 控件的 Tabs 属性是所有 Tab 对象的集合。每个 Tab 对象都具有与其当前状态和外观相关联的属性。例如,可以使 ImageList 控件与 TabStrip 控件相关联,然后就可以在单个选项卡上使用图象了。也可以使工具提示与每个 Tab 对象相关联。发行注意   TabStrip 控件是一组自定义控件的一部分,这组自定义控件可以在文件 MSCOMCTL.OCX 中找到。为了在应用程序中使用 TabStrip 控件,必须将文件 MSCOMCTL.OCX 添加到工程中去。当发布应用程序时,要把文件 MSCOMCTL.OCX 安装到用户的 Microsoft Windows SYSTEM 目录下。关于如何在工程中添加自定义控件的详细信息,请参阅《程序员指南》。
      

  2.   

    使用 TabStrip 控件
    TabStrip 控件的功能与笔记本的分页签或文件夹上的标签差不多。使用 TabStrip 控件,就能够将应用程序中的窗口或对话框的同一区域定义为多页。可能的用途
    创建选项卡式对话框,用来为 RichTextBox 控件设置各种文本属性。
    创建选项卡式对话框,用来设置应用程序的首选项。 
    Tabs 集合
    控件由 Tabs 集合中的一个或多个 Tab 对象构成。无论在设计时还是运行时,都能够通过设置属性来影响 Tab 对象的外观;在运行时,还能够通过调用一些方法来添加和删除 Tab 对象。将 ImageList 控件与 TabStrip 控件相关联
    为标识选项卡的功能,可以将 ImageList 控件中的图象与 Tab 对象联系起来。首先,必须将 ImageList 控件与 TabStrip 控件相关联,这既可以在设计时完成,也可以在运行时完成。在设计时将 ImageList 控件与 TabStrip 控件相关联: 在 ImageList 控件中包含所需的图象。
    用鼠标右键单击 TabStrip 控件,并单击“属性”,打开“TabStrip 属性页”对话框。
    在“通用”选项卡上,单击“图象列表”框,并选中所需的 ImageList 控件。
    要在运行时将 ImageList 控件与 TabStrip 控件相关联,只需将 ImageList 属性设置为 ImageList 控件的名称即可,如下所示: 
    Private Sub Form_Load()
       'TabStrip 控件名为“tabRTF”,
       'ImageList 控件名为“imlRTF”。
       tabRTF.ImageList = imlRTF
    End Sub在设计时或运行时创建 Tab
    在设计时和运行时均可创建 Tab 对象。在设计时创建 Tab 对象,需要使用“属性页”对话框。在设计时创建 Tab 对象 用鼠标右键单击 TabStrip 控件,并单击“属性”以显示“属性页”对话框。
    单击“选项卡”以显示“选项卡”页,如下图 2.36 所示: 
    图 2.36 “TabStrip 属性页”在运行时用 Add 方法创建 Tab 对象
    要在运行时创建 Tab 对象,需要对 Tab 对象使用 Add 方法。注意 在缺省情况下,预先已经创建了一个 Tab 对象。在运行时创建 Tab 对象的集合 声明一个 Tab 类型的变量,在添加每个 Tab 对象之后,该变量能够包含对新创建对象的引用。可以使用该引用为新创建的 Tab 对象设置各种属性。
    使用带 Add 方法的 Set 语句,将对象变量设置为新的 Tab 对象。
    使用对象变量,设置新的 Tab 对象的属性。 
    下面的代码用 Form 对象的 Load 事件创建了两个 Tab 对象,然后设置了新 Tab 对象的 Caption、Image 和 Key 属性。Private Sub Form_Load()
       'TabStrip 控件被命名为“tabData”。
       '声明变量,然后用带 Add 方法的 Set
       '语句创建新的 Tab 对象,
       '然后将对象变量设置为新的 Tab。
       '并用它设置属性。
       Dim tabX As Tab
       'Tab 1: Find 文本。
       Set tabX = tabData.Tabs.Add()
       tabX.Key = "find"
       tabX.Caption = "Find"
       tabX.Image = "Find" '假定存在该图象。   'Tab 2: 绘画对象。
       Set tabX= tabData.Panels.Add()
       tabX.Key = "draw"
       tabX.Caption = "Draw"
       tabX.Image = "draw" '假定存在该图象
    End Sub提示 如果直接用 Add 方法,而不用对象变量来设置属性,效率会更高。在这种情况下,上述代码可以改写为:tabData.Tabs.Add , "find", "Find", "find"
    tabData.Tabs.Add , "draw", "Draw", "draw"在客户区中放置容器控件
    TabStrip 控件通常用来创建选项卡式对话框。该对话框每页由选项卡和客户区构成,如下图所示:在运行时,如果用户单击选项卡,则必须对客户区进行编程,用一组不同的容器控件重新配置客户区(在下面的“管理 Tabs 和容器控件”中讨论)。在设计时,可以在窗体中绘制容器控件,例如 PictureBox 或 Frame 控件。如果使用 Frame 控件,则可以在运行时将其 BorderStyle 属性设为不可见的。通过复制并粘贴同一个控件,来创建一组控件;需要为每个 Tab 对象创建一个控件。在每个容器控件上,绘制应出现在选项卡中的控件。窗体看起来可能类似于下面的图 2.37:图 2.37 在设计时具有两个 PictureBox 控件的 TabStrip在创建了容器控件之后,需要用另外一种技术将它们放置在 TabStrip 控件的客户区:使用 Move 方法,并带上 Tabstrip 的 ClientLeft、ClientTop、ClientWidth 和 ClientHeight 属性,如下所示:Private Sub Form_Load()
       'TabStrip 控件名为“tabRTF”。
       'Frame 控件名为“fraTab”。
       For i = 0 To fraTab.Count - 1
       With fraTab(i)
          .Move tabRTF.ClientLeft, _
          tabRTF.ClientTop, _
          tabRTF.ClientWidth, _
          tabRTF.ClientHeight
       End With
       Next i
    End Sub管理 Tabs 和 容器控件
    选项卡式对话框中可以包含多个 Tab 对象。正如上面看到的,Frame 控件(或其它容器控件)应与每个 Tab 对象相关联。为了高效地管理众多的 Tab 对象和容器控件,可使用如下策略: 在设计时,创建所需要的全部 Tab 对象。
    创建容器控件的控件数组,一个数组成员对应于一个 Tab 对象。
    在每个容器控件中,绘制在选项卡页上的控件。
    在运行时,使用控件的 SelectedItem 属性确定被单击的 Tab 对象的索引。
    用 ZOrder 方法将适当的容器控件显示在最前面。 
    用来将合适的容器显示在最前面的代码可能类似于下面的代码:Private Sub tabRTF_Click()
       picRTF(tabRTF.SelectedItem.Index - 1).ZOrder 0
    End Sub提示 在设计时,可将控件数组的 Index 属性设置为基于 1 的数组。因为 Tabs 集合也是基于 1 的集合,所以上述代码可以改写如下:picRTF(TabRTF.SelectedItem.Index).ZOrder 0
    详细信息 上述策略的示例代码,请参阅“TabStrip 应用实例:创建选项卡式对话框”。选项卡的 Style 属性:Buttons 或 Tabs
    Style 属性决定 TabStrip 控件的外观象笔记本的标签,还是下压式按钮。下表列出了它们各自的优点:样式 用途 
    Tabs 用 Tabs 样式可以创建选项卡式对话框。如果使用该样式,将绘制出整个的选项卡式对话框,包括客户区。必须用代码确定在客户区中显示什么 
    Buttons 用 Buttons 样式可以创建工具栏或任务条,也就是说,不需要客户区,希望将按钮作为界面元素。或者,有时候不需要事先绘制的客户区,则可设置为 Buttons 样式。 
    多行选项卡
    TabStrip 控件的另一特性是 MultiRow 属性。如果将该属性设置为 True,那么大量的 Tab 对象就能够分多行显示,如下所示:如果 MultiRow 属性被设置为 False,一组选项卡只能出现在同一行中,这时在最右端会出现一对滚动按钮:TabWidthStyle 属性决定每行的外观。并且,如果 TabWidthStyle 设置为 Fixed,则还可以用 TabFixedHeight 和 TabFixedWidth 属性为 TabStrip 控件中的所有选项卡设置相同的高度和宽度。
      

  3.   

    我还可以再问问吗?我做的时候,怎么样让每页显示不同的内容?我用frame的时候,可以每页放一个,可是别的控件放一个就每页都有了,怎么办?