控件的激活与禁用

Enabled 属性比较古怪。它是扩展属性,但是扩展对象并没有提供该属性,除非控件有自己的 Enable 属性,并且带有正确过程 ID。如果扩展没有 Enabled 属性,则控件就不会象其它控件那样显示出启用/禁用效果。

如下面的代码所示,控件制作者设计的属性应该委派给 UserControl 对象的 Enabled 属性:

Public Property Get Enabled() As Boolean
   Enabled = UserControl.Enabled
End Property

Public Property Let Enabled(ByVal NewValue As Boolean)
   UserControl.Enabled = NewValue
   PropertyChanged "Enabled"
End Property

把这些代码添加到 ActiveX 控件所对应的 UserControl 的代码窗口中,如本章后面的“在控件中添加属性”中讨论的那样。

注意 使用“ActiveX 控件接口向导”,可以轻易地添加 Enabled 属性,从而为控件创建接口。Enabled 被包含在向导的推荐属性列表中。

注意,UserControl 对象的 Enabled 属性由该对象的类名 (UserControl) 限定。类名可以用来区分 UserControl 对象的属性和方法与 ActiveX 控件的同名成员。

UserControl 对象的 Enabled 属性的作用与窗体的 Enabled 属性非常相似,激活和禁用 UserControl 对它和它所有的子控件都起作用。

注意 本章后面的“在控件中添加属性”讨论了 PropertyChanged 的作用和重要性。

为 Enabled 属性分配过程 ID

为了使 Enabled 属性能够正常工作,需要为它分配 Enabled 过程 ID。过程 ID 在本章后面的“应提供的属性”中讨论。

要为 Enabled 属性分配过程 ID,请按照以下步骤执行:

  1. 在“工具”菜单上,单击“过程属性”,打开“过程属性”对话框。

  2. 在“名称”框中,选择您的“有效”过程。

  3. 单击“高级”,扩展“过程属性”对话框。

  4. 在“过程标识符”框内选择“有效”,为属性提供正确的标识符。

在赋予 Enabled 属性正确的过程 ID 之后,容器的扩展对象用它自己的 Enabled 属性同样保存一份;当用户设置了扩展属性时,容器就要设置您的 Enabled 属性。

这样特殊的安排是为了保证 Windows 行为的一致性。当某个窗体被禁用时,它上面所有的控件也应被禁用,但希望控件仍能继续绘制自己,如同没有被禁用一样。

Visual Basic 窗体通过欺骗它的控件来实现这种行为。它把所有控件的扩展对象的 Enabled 属性置为 False,而不调用控件的 Enabled 属性。控件认为自己仍处于激活状态,并且绘制自己,但从代码上看他们是被禁用了。

如果您的控件的 Enabled 属性没有 Enabled 过程 ID,当它周围的控件都被禁用时,它在代码上仍能保持激活状态。在窗体上放置一个命令按钮和您自己的控件,并添加如下代码,即可说明这一点:

Private Sub Command1_Click()
   Form1.Enabled = False
   Debug.Print Command1.Enabled
   Debug.Print MyControl1.Enabled
End Sub

在分配 Enabled 过程 ID 给控件的 Enabled 属性的前后分别运行该程序。对前者,命令按钮的 Enabled 属性为 False,而您的控件的 Enabled 属性为 True。当分配了过程 ID 之后,两个控件的属性都变为 False。

Enabled 属性的正确行为

除了在控件的 Enabled 属性中,尽量避免设置 UserControl 的 Enabled 属性。其原因在于应该由容器负责激活和禁用它所包含的控件。控件篡改属性是极不礼貌的,这个属性理应由用户控制。

绘制禁用状态的用户绘制控件

在制作用户绘制控件时,应提供自己的控件禁用状态的表示方法。如果您按照上面说的那样实现了 Enabled 属性,就可以通过在 UserControl_Paint 事件过程中测试 UserControl.Enabled 的值来决定何时进行绘制。

详细信息 请参阅本章后面的“用户绘制控件”。