ActiveX深入浅出(二)
清醒时做事,糊涂时读书,大怒时睡觉,无聊时关注图老师为大家准备的精彩内容。下面为大家推荐ActiveX深入浅出(二),无聊中的都看过来。
PublicEventBlink()
在括号中,你可以放置任何你想要传递给事件的参数。对于一个Click事件,这个参数可能鼠标点击时x和y坐标。而这在理,应为只是眨眼,就用不到额外的参数了。
触发事件,得使用RaiseEvent方法。对于我们的眨眼事件,我们把它和一个计时器联系起来,这样它就能够时不时的眨眼了:
PrivateSubBlinker_Timer()
RaiseEventBlink
EndSub
就这样,一个事件就完成了,没有任何技巧或者秘密可言。现在留给程序原作的,只要编写相应的事件处理过程就行了,就像下面这样:
PrivateSubBodyControl1_Blink()
Debug.Print"嘻嘻,我又眨眼了!"
EndSub
到这儿,大部分关于ActiveX控件的基本问题都讲了。后面的将是一些更高级的内容,包括图片和字体属性,“关于”对话框,运行时之读属性等等。在继续之前,再看看前面的内容,好好的在理解一下。好了吗?OK,现在开始更为激动的历程。
首先,我们先来看看对于属性,还有什么可以挖掘的东西,比如颜色或者图片之类的东西。
高级属性设计
色彩值被存贮在长整形变量中,但是如果你只是定义一个长整形变量,显然是不能够得到像vb中所提供的那个颜色选单:
这看起来很复杂,实际上做起来却一点也不难:所有你要做的只是把属性声明为OLE_COLOR类型,就像下面这段代码所作的那样:
PublicPropertyGetBackColor()AsOLE_COLOR
BackColor=UserControl.BackColor
EndProperty
PublicPropertyLetBackColor(ByValNew_BackColorAsOLE_COLOR)
UserControl.BackColor=New_BackColor
PropertyChanged"BackColor"
EndProperty
记得前面曾经提过除了Let,Get,还有第三种属性过程吗?现在揭开迷底:它就是Set属性过程,当要给对象变量赋值的时候,是不能用Let,而必须用Set来代替。这是因为保存在控件内部的对象变量,保存的并不是对象的拷贝,而只是对象的引用,也就是一个内存地址了。为了同一般变量的复制保存区别开来,VB引入了Set属性过程。
或许你可能知道:字体和图片就是保存在对象中的,而且,它们都拥有各自的的对话框来设置相关属性。要用到这些对话框,所有我们要作的就是把图片或者字体申声明为Picture或者Font对象类型,并且为其设置Set属性过程。
PublicPropertyGetFont()AsFont
SetFont=lblText.Font
EndProperty
PublicPropertySetFont(ByValNew_FontAsFont)
SetlblText.Font=New_Font
PropertyChanged"Font"
EndProperty
看看上面的代码,你是不是在想:也没有什么很难的啊。确实,就是这样简单啊。下面,我们来看看如何为控键建立只读属性。这也是在控件的设计中用的比较多的一个内容。
只读属性
最简单的方法,就是不要在Let/Set属性过程中加入任何东西。但通常,这并不能满足要求,有时,你可能需要一个运行时只读的属性。所谓运行时——和设计时相对应,是指控件最终在一个开发完成的程序中运行,而设计时指的是控件被使用在开发程序的过程中。
要实现运行时只读,要用到Usercontrol的AmbientProperties对象。它提供了很多关于控件容器的属性。中有一个UserMode属性,当控件处在运行时状态时,UserMode值为真。通过在Let/Get过程中提供对UserMode的检测,就可以很容易的实现运行是只读属性了:
PublicPropertyGetMultiLine()AsBoolean
MultiLine=m_MultiLine
EndProperty
PublicPropertyLetMultiLine(ByValNew_MultiLineAsBoolean)
IfAmbient.UserModeThen
Err.Raise382
ExitSub
EndIf
m_MultiLine=New_MultiLine
PropertyChanged"MultiLine"
EndProperty
这段代码保护属性只能够在设计时被修改,如果在运行时试图改变它,就会产生“Propertyisread-onlyatrun-time”错误。
和AmbientProperties对象相近的还有Extender对象。对于Extender对象,在开始编写控件前有必要好好的了解。Extender对象是一个晚期绑定的借口,开发员可以通过它访问由控件容器(而不是控件本身)维护和控制的控件属性。它提供了一些属性,像Name,Enable,Left,Top,Height,Width等等,这些大多出现在一般的控件中,在编写控件属性前,应该看看是否已经存在在Extender对象中,一方面可以避免重复工作,另一方面也更有效率。
但是使用Extender对象还存在一些问题:并不是所有的容器都支持访问相同的Extender属性。所以选用Extender对象是必须十分小心,否这做出的控件只能为特定的容器所使用。但如果你只是为VB开发控件,那就不用有这些顾虑了,尽量的用吧。
还有一点要注意的是,Extender对象不能在usercontrol的initialize事件中访问它,但是可以在initProperties和ReadProperties事件中使用。
枚举
在控件中设置属性时,使用枚举是一种很常见的的方式。它提供了一个下拉列表和若干选项让你选择。这样方便了用户的操作,又不用考虑过多的兼容性和错误处理问题,简化了属性设置,而且更加安全。
首先,必须建立一个枚举结构,放在声明部分。然后给出一系列的常量和对应的字符串。常量值可以零,或者是任何比它前面一个常量值大的整数。如果没有给出常量,那么VB自动为其赋值,第一个未指定的赋值为零,其它的值为前面一个数加一:
PublicEnumeDirection
Left
Right=1
Up
Down
EndEnum
要实现枚举属性,必须创建一个带有Let和Get属性过程的标准属性。这里的技巧是将属性的类型声明为给出的枚举类型:
PublicPropertyGetDirection()AseDirection
Direction=m_Direction
EndProperty
PublicPropertyLetDirection(ByValNew_DirectionAseDirection)
m_Direction=New_Direction
PropertyChanged"Direction"
EndProperty
唯一要注意的是,只能够在设计时修改属性列表,而不允许在运行时这么做。其它的,像读,写,保存和检索,都和使用标准属性是一样的。
这就是所有的技巧了。难以置信的简单,是吗?你的控件是不是看起来更为专业了呢?
Usercontrol对象
用VisualBasic所创建的ActiveX控件总是由UserControl对象加上选中放到UserControl上的任何控件(称为子控件或则组成控件)所组成。就象VisualBasic窗体一样,UserControl对象具有代码模块以及可视化的设计器。将组成控件放到UserControl对象的设计器上,就象把控件放到窗体上一