为 ShapeLabel 控件添加一个属性页

使用属性过程所创建的一些简单属性将自动显示在 Visual Basic 的属性窗口中。 也可以使控件和属性页相连接,属性页以另一种格式显示控件的各种属性。

与控件连接的每一个属性页都成为选项卡化的“属性”对话框上的一个选项卡。 Visual Basic 处理选项卡化对话框所说明的页面的所有细节,并管理“确定”、“取消”和“应用”等按钮。 用户必须做的全部事情就是设计将用于设置属性值的控件。

当一组属性以复杂的方式相互作用时,正如 Visual Basic 包含的 Toolbar 控件的情况,属性页就十分有用。 对于将在各国发布的控件来说属性页也很有用,因为针对不同语言可将标题本地化。 属性页也使控件能够和没有 Properties 窗口的开发工具一起使用。

注意   本主题是演示创建示例性 ActiveX 控件一系列步骤中的一部分。 它从创建 ActiveX 控件的主题开始。

要向工程添加属性页,请按照以下步骤执行:

  1. 在“工程资源管理器”窗口单击 ControlDemo 以打开控件工程。在“工程”菜单上单击“添加属性页”以打开“添加属性页”对话框。双击“属性页”图标,以向工程添加属性页。

  2. 在“属性”窗口双击 Name 属性,并把属性页的名称变成 SLGeneral。双击 Caption 属性并把标题变成“通用”

    在使用标题时,这个标题就是出现在属性页选项卡上的标题。

    为什么要命名页 SLGeneral 而不是通用?在一个工程中可以有几个控件,而每一个控件可以有一个通用页。这就是 ShapeLabel 控件的通用页。

  3. 在“文件”菜单上单击“保存工程组”来保存工程组。象下表那样命名属性页。Visual Basic 将自动提供相应的扩展名。
    文件 文件名 扩展
    属性页 ControlDemo_SLGeneral .pag

    属性页中象位图之类的二进制信息都被保存在名称相同的二进制文件中,该文件的扩展名为 .pgx。

除了设计器的标题栏显示的是属性页的“标题”属性而不是以“名称”属性,属性页设计器看上去很像控件设计器。

要设计 ShapeLabel 控件的通用属性页

  1. 把 Label 控件放入该属性页,并把该 label 的 Caption 属性设置为 Caption 这个字。

  2. 在该 label 下面放一个 TextBox 控件,并赋予它以下属性值:
    属性
    名字 txtCaption
    文本 <空>

    此属性页应有如下所示的外观:

    按照这种方式把属性描述选项卡放在文本框之上,使其它语言访问控件部件更加容易,“标题”这个字所在之处可能更长或更短。 “建立 ActiveX 控件”将讨论如何确定控件位置的细节。

  3. 双击“属性页”以打开代码窗口。 在 Events 的下拉表中选择 SelectionChanged 事件并且添加下列代码:
    Private Sub PropertyPage_SelectionChanged()
    '在当前选择的控件列表中
    '显示第一个控件的标题。
    txtCaption.Text = SelectedControls(0).Caption
    End Sub
    

    本事件的目的是从 ShapeLabel 控件或当前所选择的某个或某些控件中取得已存在的属性值。这样做是正确的,可能有多个 ShapeLabel 控件被选。多个选择对控件用户来说是重要的事情,但这意味着要多做一些工作。

    无论何时打开属性页均接收一个 SelectionChanged 事件。 选择控件列表改变时也接收这个事件。 这是必须的,因为“属性页”对话框为非模式对话框,当对话框打开时用户可能选择其他的一些控件。

    必须在按属性逐个进行的基础上决定如何处理多重选择。 例如,如果属性页显示的是 SelectedControls 集合中第一个控件的 Width 属性,即 SelectedControls(0),如以上代码所示,它就能很容易的把所有选择控件的宽度改变为那个值。

    从另一方面而言,把窗体中所有 ShapeLabel 控件的标题设置成相同值的操作并没有太大的用处,那样的话如果 SelectedControls 集合的 Count 属性大于一时则与 Caption 属性有关的逻辑处理将会使 txtCaption 无效。

    然而这个过程不作逻辑处理。为了说明起见,将允许属性页设置多重标题。 以后若想让上面描述的行为生效,可把下列代码行添加到 PropertyPage_SelectionChanged 事件过程中:

    '请不要这样做!
    If SelectedControls.Count > 1 Then
    txtCaption.Enabled = False
    Else
    txtCaption.Enabled = True
    End If
    
  4. 为了对当前选择的所有控件设置属性值,把下列代码添加到 ApplyChanges 事件中:
    Private Sub PropertyPage_ApplyChanges()
    '在选择一个以上控件类的情况下,
    '使用一般性对象变量。
    Dim objControl As Variant
    For Each objControl In SelectedControls
    objControl.Caption = txtCaption.Text
    Next
    End Sub
    

    单击“属性页”对话框的“应用”或“确定”按钮,或者切换到其它选项卡时,属性页将接收 ApplyChanges 事件。

    怎样得知 SelectedControls 中的各个控件是否具有 Caption 属性呢?作为控件部件的设计器来说,要确定哪些属性页与某一给定的控件相连接。 如果所有当前选择的控件的 Property Pages 清单中都具有某一页,则该属性页出现。 最容易做的事就是确保分配给每个控件的那些页不显示该控件所不具有的属性。

    倘若希望一些控件使用一个通用属性页,其中一些控件又不具有该页出现的所有属性时,可以给 ApplyChanges 事件添加代码,以进行控件类型的检测并提供适当的属性值。 作为一种替代,也可使用 On Error 语句捕获和忽略来自不具有该属性控件的一些错误。

    仅需要考虑自己部件中的那些控件,因为不在自己部件中的那些控件决不会使用本部件的属性页。

    “创建 ActiveX 控件的属性页”将会很详细地讨论属性页的布局和赋值。

  5. 为了在 Caption 属性改变时使“属性页”对话框的“应用”按钮有效,把下列代码添加到 txtCaption 文本框的 Change 事件中:
    Private Sub txtCaption_Change()
    ' 属性页中被改变的
    ' 属性控制 Property Pages
    ' 对话框的“应用”按钮。
    Changed = True
    End Sub
    
  6. 在“工程”窗口中双击 SLGeneral ,使属性页设计器在前面。单击设计器的关闭按钮或按下 CTRL+F4 以关闭设计器并使该页进入运行模式。 像 UserControl 对象一样,PropertyPage 对象仅当工程组的其余部分处于设计模式时才能运行。

要将属性页和ShapeLabel控件相连接,请按照以下步骤执行:

  1. 在“工程资源管理器”窗口双击“ShapeLabel”以打开设计器。

  2. 在“属性”窗口双击 PropertyPages 属性以显示“连接属性页”对话框。

Connect Property Pages 对话框可用于将多个属性页与一个控件相连接、并可为控件安排“连接属性页”对话框中各选项卡的显示顺序。

运行时也能连接属性页。 这将在“创建 ActiveX 控件的属性页”中讨论。

  1. 复选“SLGeneral”后单击“确定”。

  2. 使 ShapeLabel 设计器前置,然后单击其“关闭”按钮或按下 CTRL+F4 以使 ShapeLabel 控件进入运行模式。

  3. 在“工程资源管理器”窗口双击“Form1”以打开其设计器。

  4. 在 Form1 上任一个 ShapeLabel 的控件上单击右键以显示上下文菜单,并单击“属性”以显示“属性页”对话框。

  5. 在“通用”选项卡上的“标题”框中用一个新值代替当前标题。 进行这项工作后,“应用”按钮处于有效状态。 单击“应用”按钮以改变该控件的标题。

    注意   按下“确定”键也可改变该标题,但那样会关闭“属性页”对话框。对话框应保持打开状态以便进行下一步。

  6. 保持按下 CTRL 键的同时单击 Form1 上的第二个 ShapeLabel 控件,从而选择两个 ShapeLabels。 改变标题并单击“应用”按钮使两个标题设置成相同的值。

    可能希望试一试把诸如命令按钮之类的其它控件添加到 Form1 中,并且观察在“属性页”对话框上作不同复选的效果。

  7. 当试验完成之后单击“确定”以关闭“属性页”对话框。

详细信息 “创建 ActiveX 控件的属性页”将详细讨论属性页。

步骤

本主题是演示创建示例性 ActiveX 控件一系列步骤中的一部分。

请参阅
转到下一步 为 ShapeLabel 控件添加事件
从头开始 创建 ActiveX 控件