ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:30KB ,
资源ID:7953838      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7953838.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(VB用户控件制作讲解与实例.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

VB用户控件制作讲解与实例.docx

1、VB用户控件制作讲解与实例VB用户控件制作讲解与实例发表:uu_ovo 阅读: 905次关键字:不详 字体:大 中 小 制作用户控件,主要就是进行以下三项代码编写工作:1.定义控件的属性、事件和方法,其中属性是最常使用的。2.保存和读取中间用户设置的属性值。3.为达到你的预定目的而调用的各种技术手段。在用户控件中定义的属性、事件、方法,其性质都必须是公用的,也就是说,只有用 Public 来定义,这样你才能在主程序代码中使用这些事件和方法,以及设置或获取这些属性值,也只有公用的属性才会在窗体页面相关控件的属性窗口显示出来。一、属性属性是用户控件最基本的东东,用户控件可以没有事件,可以没有方法,

2、但不能没有属性(当然,技术上来说是可以没有属性的,但这样的控件使中间用户无法进行任何设置,是没有什么意义的)。那么,如何定义用户控件的属性呢?为用户控件添加属性有两种办法:1.公用变量法:public 变量名称 as 类型 这里的变量名称就是属性名称。这样定义的属性一般不会保存属性值,所以常常用作只读属性,在笔者的用户控件中,用于对主程序返回一个必要的值。例如“四则运算”控件中的“ComputeAnswer”属性:Public ComputeAnswer As String它返回的是计算结果,而计算结果是不需要保存在控件中的,所以把它用公用变量法定义。再例如消息框控件中的 FeedValue

3、属性:Public FeedValue As Integer 返回值它返回最终用户选中的消息框按纽的编号,这个编号也只需要在主程序中处理,而无需保存在控件中,所以也用公用变量法定义成只读属性。2.property 过程法:public property Get 过程名称() as 类型end property public property Let 过程名称(new值 as 类型) end property 这里的过程名称就是属性名称。而 property 过程法又有两种:一种是如上所述的标准过程法,另一种就是枚举法。标准过程法这是用得最多的一种属性定义方法。在用户控件的代码页面选中“工具添加

4、过程”,会跳出一个对话框,然后在单选按纽中选择“属性”,再在“名称”栏中输入属性名,点击确定,VB 就会自动生成上述的几行代码,你将“类型”改为你所需要的,再输入相关代码即可。标准过程法中,Get 过程和 Let 过程一般是成对出现的。例如“闪烁标签”控件中定义闪烁时的前景颜色 FlickerForeColor 属性的代码:Public Property Get FlickerForeColor() As OLE_COLOR 闪烁时的文字色FlickerForeColor = mGlintForeColorEnd PropertyPublic Property Let FlickerForeC

5、olor(ByVal newColor As OLE_COLOR)mGlintForeColor = newColorPropertyChanged FlickerForeColorEnd Property这两段代码中的“OLE_COLOR”是颜色数据类型,实质上也是长整形的数据类型,但它会自动调出颜色对话框。“FlickerForeColor”是属性名称,在窗体界面相关控件的属性窗口中显示的就这个属性名称。而“mGlintForeColor”是中间变量,中间变量是私用的,用 Dim 定义即可。在用过程法定义属性时通常都需要中间变量。中间变量的身份是“代表”(代表属性名),作用有两个,一是上传

6、下达,在 Get/Let 过程与 ReadProperties/WriteProperties 过程中充当“邮递员”;二是参与,在许多别的过程中都要与中间变量打交道。Get 过程的作用是获取相关的属性值,并将属性名称和属性值显示在属性窗口(如果你去掉这个过程,在属性窗口就不会出现相关的属性名称和属性值了)。它在三种情况下被激活:中间用户在窗体页面刚刚把焦点移到窗体上的控件时(例如点击该控件),在属性窗口显示出原先设置的属性值;中间用户在属性窗口修改了属性值,在属性窗口显示出修改后的属性值;程序运行中用代码获取属性值时,假设窗体代码有这么一句:RGB = Cipher.BackColor,那么也

7、会激活该过程。Let 过程的作用是设置相关的属性值,它在两种情况下被激活:中间用户在属性窗口修改了控件的属性值(执行顺序是:Get 过程Let 过程Get 过程);程序运行中用代码设置新的属性值时,例如:Cipher.BackColor = RGB。变量 NewValue 是被赋的新值(这个变量名是可以改变的),你可以把得到的 NewValue 的值按自己的需求作任何用途。要注意的是,如果这个属性是一个对象,那么就不能用 Let 过程而必须用 Set 过程了,这是因为保存在控件内部的对象变量,保存的并不是对象的拷贝,而只是对象的引用(也就是一个内存地址)。所以在它的 Get 和 Set 两个属

8、性过程中,均须在等式的前面加上“Set”关键字。来看看“四则运算”控件中的有关代码:Public Property Get Font() As FontSet Font = Text1.FontEnd PropertyPublic Property Set Font(ByVal newFont As Font)Set Text1.Font = newFontPropertyChanged FontEnd Property这是设置文本框的 Font 属性的,而 Font 本身也是一个对象,所以必须使用 Set 了。还有 Picture 属性也是如此,它也必须使用 Set 过程。然而,它这个对象却

9、有一点特殊之处:如果你想在程序运行当中使用 LoadPicture 语句动态加载图片的话,你就必须给它增加一个 Let 过程,否则,你将只能在设计模式时在属性窗口加入图片。而新增的 Let 过程中不需要任何代码,只要一个注释符就行了。以“酷时钟”控件中的 Picture 属性为例:Public Property Get Picture() As PictureSet Picture = UserControl.PictureEnd PropertyPublic Property Set Picture(ByVal NewPic As Picture)Set UserControl.Pictur

10、e = NewPicPropertyChanged PictureEnd PropertyPublic Property Let Picture(ByVal NewPicture As Picture)End Property枚举法枚举是一种很常见的的方式,它提供了一个下拉列表和若干选项让用户选择。这样既方便了用户的操作,又不用考虑过多的兼容性和错误处理问题,简化了属性设置,而且更加安全。要实现枚举法,首先必须建立一个枚举结构,放在声明部分,然后在结构中给出一系列的常量和对应的字符串。后面的常量值必须是比前面常量值大的整数。如果没有给出常量,那么 VB 会自动为其赋值,第一个字符串赋值为零,其

11、它的值则为前面一个数加一。例如在“特效标签”控件中,字体打印特技的枚举结构声明:Public Enum cTxtEffect雕刻 自动赋值0立体 自动赋值1浮雕 自动赋值2End Enum如果你要为项目赋值为从 1 开始,也是可以的(当然有关代码要改一下):Public Enum cTxtEffect雕刻 = 1立体 = 2浮雕 = 3End Enum要实现枚举属性,还必须创建一个带有 Let 和 Get 属性过程的标准属性,但必须将属性的类型声明为枚举类型。仍以“特效标签”控件为例,你还必须有这样两个过程:Public Property Get TxtEffect() As cTxtEffe

12、ctTxtEffect = mTxtEffectEnd PropertyPublic Property Let TxtEffect(ByVal NewValue As cTxtEffect)mTxtEffect = NewValuePropertyChanged TxtEffectEnd Property注意这两个过程中的数据类型都改为了 cTxtEffect。枚举属性的读、写、保存和检索,都和标准属性是一样的。3.保存或读取属性值上述的 Let 过程中的 PropertyChanged 方法是用户控件特有的方法,其作用是,通知系统某个属性发生了改变,系统根据具体情况决定是否将改变后的属性值保

13、存到属性包(或 .frm 文件)中。所谓具体情况是指:在设计模式(正在被中间用户使用)就保存,在运行模式(正在被最终用户使用)就不保存。比如你的程序代码中有这么一句:Cipher.BackColor = RGB,那么运行该程序到这一句时,就会将 Cipher 控件的背景色改变为 RGB 所代表的颜色,但不会将这个 RGB 值 保存到属性包中,所以,下次你运行程序时,只要没有运行到这一句,Cipher 控件的背景色依然是你设计时的颜色。保存属性值是由 WriteProperties 事件过程执行的,在销毁创建的控件之前,该事件会根据 PropertyChanged 方法的提示,以及当时的运行模式

14、,来决定是否通知 PropertyBag 对象把数据写入属性包(或 .frm 文件)中。保存时,所有在该事件过程中的属性值都会同时保存,而不仅仅是保存某一个提示改变的属性值。读取属性值是由 ReadProperties 事件过程执行的,在创建控件之前,该事件会通知 PropertyBag对象从属性包(或 .frm 文件)中把保存的所有属性值都同时读取出来,读出的数据由 Get 过程使用。 PropertyBag 对象是具体实施保存或读取功能的,它有两个方法:WriteProperty 方法用来写属性值,ReadProperty 方法用来读属性值。特别提醒:对于新手来说,一定要搞清楚 cTxtE

15、ffect、mTxtEffect、TxtEffect 和“TxtEffect”这四个东东的意义:cTxtEffect:是结构名。mTxtEffect:是代表 cTxtEffect 结构中某个项目值的中间变量,如果没有枚举结构,则是代表属性值的中间变量,它是模块级的变量。TxtEffect:是属性名,它会出现在窗体页面的属性窗口中。“TxtEffect”:是保存到属性包时所用的名称,笔者为了方便,把它与属性 TxtEffect 取了同一个名称,但并不是同一个概念,它只出现以下在三个方法中:PropertyChanged 方法、ReadProperty方法以及 WriteProperty 方法中,

16、你完全可以另外取个名,但在这三个方法中必须是完全同名的。你可以这样理解:“TxtEffect”是一个文件名,而 mTxtEffect 则是一个变量,你要从“TxtEffect”中读出文件内容并赋值给 mcTxtEffect,或者你要将赋了值的 mcTxtEffect 保存到“TxtEffect”去。还有一个需要注意的地方: 使用 ReadProperty/WriteProperty 方法读写数据时,被读写的变量不能是数组。例如,在 MyMenu 菜单控件中,mCaption 是一维数组,但sCaption不可能是数组,所以你不能这样编写代码:For i = 1 To mItemSum: .Wr

17、iteProperty sCaption(i), mCaption(i), : Next而只能这样:For i = 1 To mItemSum: .WriteProperty sCaption & i, mCaption(i), : Next实际上就是:.WriteProperty sCaption1, mCaption(1), .WriteProperty sCaption2, mCaption(2), .WriteProperty sCaptionN, mCaption(N), N mItemSum对于另一个菜单控件 muchMenu 控件来说,mCaption 是二维数组,所以只能这样编

18、写:For j = 1 To sRepFor i = 1 To mItemSum(j).WriteProperty sCaption & j * 10 & i, mCaption(j, i), NextNext实际上就是:.WriteProperty sCaption101, mCaption(1, 1), .WriteProperty sCaption102, mCaption(1, 2), .WriteProperty sCaption10N, mCaption(1, N), NmItemSum(j).WriteProperty sCaption201, mCaption(2, 1), .

19、WriteProperty sCaption202, mCaption(2, 2), .WriteProperty sCaption20N, mCaption(2, N), .WriteProperty sCaptionM01, mCaption(M, 1), MsRep.WriteProperty sCaptionM02, mCaption(M, 2), .WriteProperty sCaptionM0N, mCaption(M, N), 4.只读属性前面已经说到,用公用变量法定义的属性一般是只读的,而且一般不论在设计模式还是运行模式都是只读的。用标准过程法定义的属性也可以定义为在运行时只

20、读的属性(当然也可以定义为在设计时只读或者在设计和运行时都只读,不过那有什么意义呢?故我们不加讨论)。最简单的方法,就是不在 Let 或 Set 属性过程中加入任何代码,但通常这会带来诸多不便之处,一般不宜采用。比较适宜的办法就是使用 AmbientProperties 对象。这个对象共有16个属性,都是用户控件的环境信息。比如该对象的 DisplayName 属性就是取得控件的默认名称,中间用户将用户控件画到窗体上时,系统就会自动为控件的 Caption 属性赋值这个默认名称。我们要实现运行时只读属性,要用到的是该对象的 UserMode 属性。当控件处于运行模式时,UserModeTrue

21、,当控件处于设计模式时,UserModeFalse。我们在 Let 过程中对 UserMode 属性加以检测,就可以很容易地实现运行时的只读属性了。选项卡控件中有一段代码:Public Property Let Tabs(ByVal newVal As Integer)If newVal 2 And newVal 9 And Ambient.UserMode = False Then 如果是设计模式If newVal = 5 Then newVal = 6If newVal = 7 Then newVal = 8propTabCount = newValReDim Preserve propC

22、aption(1 To propTabCount) PropertyChanged TabsDrawTabsEnd IfEnd PropertyTabs 属性表示的是选项卡的按纽数目,按纽数目只允许在设计模式时修改,在运行模式时不允许修改。从代码中可以看出,如果运行时企图修改 Tabs 属性是不可能的,换言之,该属性在运行时只读。5.属性说明中间用户把用户控件画到窗体后,想在属性窗口查看它的属性说明,却发现只有简单的“Tabs”之类的几个英文字符,就会弄得头大了。所以,我们有必要对属性加以描述。在用户控件页面,点击“工具过程属性”菜单项,这时会跳出一个对话框,我们在“名称”下拉框中选中需要说明

23、的属性,在下面的“描述”框中就可以输入对这个属性的说明文字了。你可以仿照微软控件的“返回/设置”之类的说明词加以描述,然后点“确定”就行了。再到窗体页面的属性窗口看看,呵呵,正是我们刚才输入的那几个字!后面我还会讲到控件的事件和方法,对于它们的描述也照此办理,不过事件和方法的描述要在“对象浏览器”中才看得到。如果没有描述,“对象浏览器”中有关项目就只有“*工程的成员”的简单说明,为了使中间用户明白你定义的属性、事件和方法的意义,我建议用汉字将所有的属性、事件和方法都进行描述,免去中间用户翻译、猜测、反复试验的麻烦。二、事件就象定义属性一样,我们首先要在用户控件页面代码窗口的 Option Ex

24、plicit 节中声明要产生的事件(注意声明事件也必须是公用的)。单击“工具添加过程”,在弹出的对话框名称栏中输入事件名称(例如“Click”),在“类型”单选按纽中选择“事件”,点击“确定”,于是声明节中就多了这么一行:Public Event Click()然后再输入对此事件的处理过程代码(以后你为控件添加的任何事件都必须有类似的代码):Private Sub UserControl_Click()RaiseEvent Click 触发Click事件End SubRaiseEvent的功能是把用户控件或其上的子控件的事件进行转发。上面的代码的意思是:当你单击窗体上的用户控件时,VB 就转发

25、出一个单击事件,这个事件发给谁呢?呵呵,当然是发给窗体代码页中相关控件的 Click 事件啦,你再在这个 Click 事件过程中编写代码就行了。是不是很简单?要是你还想让这个事件携带参数,那也很容易实现,以 MyMenu 菜单控件为例:Public Event Click(SelectedItem As Integer) 在声明节定义菜单项单击事件Private Sub mLabel_Click(Index As Integer)If left(mLabel(Index).Caption, 1) - Then RaiseEvent Click(Index) 转发单击事件End Sub菜单项的文

26、本是显示在标签上的,而标签是一个控件数组,mLabel_Click 过程代码中的 Index 是选中的控件数组的编号,也就是菜单项的编号,这个号码必须返回给主程序中的相应变量,以便作进一步的处理,所以这个编号作为 Click 的参数就被传送出去了。现在,我们在窗体的代码窗口上面的下拉框中找到该菜单控件的单击事件,点击一下,窗口中出现了以下过程代码:Private Sub MyMenu1_Click(SelectedItem As Integer)End Sub看看,返回参数的变量名与在控件代码页声明节中定义的单击事件中的变量名完全一样。在这个过程中,再输入对返回参数的处理代码,你可以用 X=S

27、electedItem 的句式获取其值,但最好采用下面这样的代码:Private Sub MyMenu1_Click(SelectedItem As Integer)MyMenu1.Visible = False 使菜单控件不可见,这是必须的Select Case SelectedItemCase 1: 去打开文件模块Case 2: 去保存文件模块.End SelectEnd Sub三、方法找遍网上,所有的资料都只有如何定义用户控件的属性和事件,却没有说明如何定义用户控件的方法。在用户控件页面点击“工具添加过程”,在弹出的对话框中,“类型”单选按纽竟然也没有“方法”!没有办法啊,笔者长叹一声,

28、只好在一片茫然中做试验。经过多次屡败屡试不折不挠的试验,终于获得了成功!其实非常简单:只要在控件代码中增加一个独立的 Sub 公用过程,就定义了用户控件的方法,过程名也就是方法名。方法既可以带输入参数也可以不带,这个参数是传送到控件内部来的(事件的参数是传送到控件外部去的)。例如,在“四则运算”控件中,Start 方法是这样定义的:Public Sub Start()End Sub这是不带输入参数的方法。在窗体中的调用代码是:Cipher.Start再如“图片特技”控件定义的带输入参数的方法:Public Sub Start(Optional ByVal StuntModus As Integ

29、er = -1) End Sub不但带了参数,而且还是可选参数,这样可以大大方便用户,用户在使用 Start 方法时,就可根据具体情况来决定是否输入参数了,调用语句示例如下:PicStunt1.Start i 输入参数为变量 i PicStunt1.Start 无输入参数,则控件内部使用缺省参数 -1上面说的是带一个输入参数,其实只要你需要,可以带多个参数,例如“消息框”控件的 Msg 方法:Public Sub Msg(ByVal mInfoStr As String, Optional ByVal mCompages As Integer = 0, _Optional ByVal mCap

30、tion As String = 马路消息)End Sub一共带了三个参数,其中第一个参数是必需的(消息内容),第二个参数(组合值)和第三个参数(消息标题)是可选的,基本上与系统的消息框调用方式是一致的。四、属性页很多控件在其属性窗口上方第二个属性之处有“自定义”的属性,点击右边的“”按纽,就打开了属性页。如果某个属性有若干个不能确定数量的子项目,通常就需要使用属性页了。例如系统自带的“工具栏”控件,其中的按纽个数及其标题文本都是不能确定的,这时就要让中间用户根据自己的具体情况,通过属性页来设置了。笔者发布的控件实例中,有三个控件需要使用属性页,这三个控件是:选项卡控件、MyMenu 菜单控件、muchMenu 菜单控件。就拿菜单控件来说,如果你设计的菜单控件仅仅只是为了给自己使用,菜单项数目是固定的,那当然可以多弄几个 Caption 属性来设置菜单文本,比如说你可以定义 Caption1、Caption2、Caption3等等,但这显示不是一个好

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1