容器为控件提供了环境属性,从而帮助控件在容器上更好地显示自己。例如,环境 BackColor 属性告诉控件该如何设置自己的 BackColor 属性,以便与容器协调。
通过 AmbientProperties 对象,Visual Basic 使 ActiveX 控件能够使用环境属性。UserControl 的环境属性返回对 AmbientProperties 对象的引用。
Visual Basic 提供的 AmbientProperties 对象包含了 ActiveX 控件标准中定义的所有标准环境属性,无论控件所在的容器是否真正提供了该属性。
这意味着可以安全地访问在对象浏览器上可见的 AmbientProperties 对象的所有属性。如果容器没有提供被访问的属性,则该 Ambient 就返回 AmbientProperties 对象属性主题中列出的缺省值。
控件容器可以定义自己的环境属性。这些特定容器的环境属性在对象浏览器中看不到,因为它们不在 Visual Baisc 的类型库中。不过可以通过查看容器的文档得到这些属性的有关信息,然后把它们当作 AmbientProperties 对象的属性来访问。
因为这些属性不在 Visaul Basic 的类型库中,所以 Visual Basic 在编译时不能确认它们是否存在。因此,在使用环境属性的同时需要使用错误处理。
缺少类型库信息的另一个后果是对特定容器的环境属性的引用总是后期约束的。相反地,对标准环境属性的引用是前期约束的。
许多标准环境属性可以被忽略。在 Visual Basic ActiveX 控件中,可以忽略 AmbientProperties 对象的 MessageReflect、ScaleUnits、ShowGrabHandles、ShowHatching、SupportsMnemonics 和 UIDead 属性。
下面列出了需要注意的环境属性。
AmbientProperties 对象最重要的属性是 UserMode,该属性使控件的实例能够判断目前是处于设计时 (UserMode = False) 还是运行时。本章后面的“创建 Design-Time-Only 或 Run-Time-Only 属性”将讨论如何使用该属性。
提示 为了便于记忆 UserMode 的含义,可以联想在设计时使用控件的是开发者,而不是最终用户。因为控件不处于“用户”模式,所以 UserMode = False。
如果开发的控件需要用于国际市场,那么可以使用 LocaleID 环境属性来确定使用的地区。本章后面的“控件的本地化”将讨论该属性的使用。
在设计时,如果控件出现错误,在错误信息中包含控件的 DisplayName 属性值,这样,使用控件的开发者就可以找到发生错误的控件实例。
控件可以使用这些属性使自己的外观与容器相协调。例如,在 InitProperties 事件中,可以把控件的 ForeColor、BackColor、Font、TextAlign 属性值设置成环境属性所提供的值,UserControl 的任何一个实例首次放置到容器上时都会收到它。建议采用这种方法。
控件还可以提供这样的属性,用户可以使用它们使控件实例与容器同步。例如,可以提供 MatchFormBackColor 属性;如果把该属性置为 True,则控件的 BackColor 属性始终与 AmbientProperties 对象的 BackColor 属性保持一致。使用 AmbientChanged 事件即可提供这类功能,下面将对此予以解释。
对于用户绘制控件,该属性说明控件是否是容器的缺省按钮,这样就可为缺省按钮另外加一边框,以便于识别。
如果不将控件设置为缺省按钮,就可以忽略该属性。请参阅本章“把控件设置成缺省或取消按钮”。
详细信息 参阅本章的“用户绘制控件”。另外,《联机手册》的《语言参考》中列出了 AmbientProperties 对象的所有属性。
如果控件的外观或行为受 AmbientProperties 对象的属性变化的影响,应在 UserControl_AmbientChanged 事件过程中增加处理这种变化的代码。
AmbientChanged 事件过程的参数是字符串,它包含发生变化的属性的名称。
重点 如果控件是国际化版本,那么必须处理 LocaleID 属性的 AmbientChanged 事件。请参阅“控件的本地化”。
注意 如果控件的实例被放置在 Visual Basic 窗体上,而窗体的 FontTransparent 属性发生变化,这时不会产生 AmbientChanged 事件。