已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1.定义控件的属性、事件和方法,其中属性是最常使用的。2.保存和读取中间用户设置的属性值。3.为达到你的预定目的而调用的各种技术手段。在用户控件中定义的属性、事件、方法,其性质都必须是公用的,也就是说,只有用 Public 来定义,这样你才能在主程序代码中使用这些事件和方法,以及设置或获取这些属性值,也只有公用的属性才会在窗体页面相关控件的属性窗口显示出来。一、属性属性是用户控件最基本的东东,用户控件可以没有事件,可以没有方法,但不能没有属性(当然,技术上来说是可以没有属性的,但这样的控件使中间用户无法进行任何设置,是没有什么意义的)。那么,如何定义用户控件的属性呢?为用户控件添加属性有两种办法:1.公用变量法:public 变量名称 as 类型 这里的变量名称就是属性名称。这样定义的属性一般不会保存属性值,所以常常用作只读属性,在笔者的用户控件中,用于对主程序返回一个必要的值。例如“四则运算”控件中的“ComputeAnswer”属性:Public ComputeAnswer As String它返回的是计算结果,而计算结果是不需要保存在控件中的,所以把它用公用变量法定义。再例如消息框控件中的 FeedValue 属性:Public FeedValue As Integer 返回值它返回最终用户选中的消息框按纽的编号,这个编号也只需要在主程序中处理,而无需保存在控件中,所以也用公用变量法定义成只读属性。2.property 过程法:public property Get 过程名称() as 类型end property public property Let 过程名称(new值 as 类型) end property 这里的过程名称就是属性名称。而 property 过程法又有两种:一种是如上所述的标准过程法,另一种就是枚举法。标准过程法这是用得最多的一种属性定义方法。在用户控件的代码页面选中“工具添加过程”,会跳出一个对话框,然后在单选按纽中选择“属性”,再在“名称”栏中输入属性名,点击确定,VB 就会自动生成上述的几行代码,你将“类型”改为你所需要的,再输入相关代码即可。标准过程法中,Get 过程和 Let 过程一般是成对出现的。例如“闪烁标签”控件中定义闪烁时的前景颜色 FlickerForeColor 属性的代码:Public Property Get FlickerForeColor() As OLE_COLOR 闪烁时的文字色FlickerForeColor = mGlintForeColorEnd PropertyPublic Property Let FlickerForeColor(ByVal newColor As OLE_COLOR)mGlintForeColor = newColorPropertyChanged FlickerForeColorEnd Property这两段代码中的“OLE_COLOR”是颜色数据类型,实质上也是长整形的数据类型,但它会自动调出颜色对话框。“FlickerForeColor”是属性名称,在窗体界面相关控件的属性窗口中显示的就这个属性名称。而“mGlintForeColor”是中间变量,中间变量是私用的,用 Dim 定义即可。在用过程法定义属性时通常都需要中间变量。中间变量的身份是“代表”(代表属性名),作用有两个,一是上传下达,在 Get/Let 过程与 ReadProperties/WriteProperties 过程中充当“邮递员”;二是参与,在许多别的过程中都要与中间变量打交道。Get 过程的作用是获取相关的属性值,并将属性名称和属性值显示在属性窗口(如果你去掉这个过程,在属性窗口就不会出现相关的属性名称和属性值了)。它在三种情况下被激活:中间用户在窗体页面刚刚把焦点移到窗体上的控件时(例如点击该控件),在属性窗口显示出原先设置的属性值;中间用户在属性窗口修改了属性值,在属性窗口显示出修改后的属性值;程序运行中用代码获取属性值时,假设窗体代码有这么一句:RGB = Cipher.BackColor,那么也会激活该过程。Let 过程的作用是设置相关的属性值,它在两种情况下被激活:中间用户在属性窗口修改了控件的属性值(执行顺序是:Get 过程Let 过程Get 过程);程序运行中用代码设置新的属性值时,例如:Cipher.BackColor = RGB。变量 NewValue 是被赋的新值(这个变量名是可以改变的),你可以把得到的 NewValue 的值按自己的需求作任何用途。要注意的是,如果这个属性是一个对象,那么就不能用 Let 过程而必须用 Set 过程了,这是因为保存在控件内部的对象变量,保存的并不是对象的拷贝,而只是对象的引用(也就是一个内存地址)。所以在它的 Get 和 Set 两个属性过程中,均须在等式的前面加上“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 过程。然而,它这个对象却有一点特殊之处:如果你想在程序运行当中使用 LoadPicture 语句动态加载图片的话,你就必须给它增加一个 Let 过程,否则,你将只能在设计模式时在属性窗口加入图片。而新增的 Let 过程中不需要任何代码,只要一个注释符就行了。以“酷时钟”控件中的 Picture 属性为例:Public Property Get Picture() As PictureSet Picture = UserControl.PictureEnd PropertyPublic Property Set Picture(ByVal NewPic As Picture)Set UserControl.Picture = NewPicPropertyChanged PictureEnd PropertyPublic Property Let Picture(ByVal NewPicture As Picture)End Property 枚举法枚举是一种很常见的的方式,它提供了一个下拉列表和若干选项让用户选择。这样既方便了用户的操作,又不用考虑过多的兼容性和错误处理问题,简化了属性设置,而且更加安全。要实现枚举法,首先必须建立一个枚举结构,放在声明部分,然后在结构中给出一系列的常量和对应的字符串。后面的常量值必须是比前面常量值大的整数。如果没有给出常量,那么 VB 会自动为其赋值,第一个字符串赋值为零,其它的值则为前面一个数加一。例如在“特效标签”控件中,字体打印特技的枚举结构声明:Public Enum cTxtEffect雕刻 自动赋值0立体 自动赋值1浮雕 自动赋值2End Enum如果你要为项目赋值为从 1 开始,也是可以的(当然有关代码要改一下):Public Enum cTxtEffect雕刻 = 1立体 = 2浮雕 = 3End Enum要实现枚举属性,还必须创建一个带有 Let 和 Get 属性过程的标准属性,但必须将属性的类型声明为枚举类型。仍以“特效标签”控件为例,你还必须有这样两个过程:Public Property Get TxtEffect() As cTxtEffectTxtEffect = mTxtEffectEnd PropertyPublic Property Let TxtEffect(ByVal NewValue As cTxtEffect)mTxtEffect = NewValuePropertyChanged TxtEffectEnd Property注意这两个过程中的数据类型都改为了 cTxtEffect。枚举属性的读、写、保存和检索,都和标准属性是一样的。3.保存或读取属性值上述的 Let 过程中的 PropertyChanged 方法是用户控件特有的方法,其作用是,通知系统某个属性发生了改变,系统根据具体情况决定是否将改变后的属性值保存到属性包(或 .frm 文件)中。所谓具体情况是指:在设计模式(正在被中间用户使用)就保存,在运行模式(正在被最终用户使用)就不保存。比如你的程序代码中有这么一句:Cipher.BackColor = RGB,那么运行该程序到这一句时,就会将 Cipher 控件的背景色改变为 RGB 所代表的颜色,但不会将这个 RGB 值 保存到属性包中,所以,下次你运行程序时,只要没有运行到这一句,Cipher 控件的背景色依然是你设计时的颜色。保存属性值是由 WriteProperties 事件过程执行的,在销毁创建的控件之前,该事件会根据 PropertyChanged 方法的提示,以及当时的运行模式,来决定是否通知 PropertyBag 对象把数据写入属性包(或 .frm 文件)中。保存时,所有在该事件过程中的属性值都会同时保存,而不仅仅是保存某一个提示改变的属性值。读取属性值是由 ReadProperties 事件过程执行的,在创建控件之前,该事件会通知 PropertyBag对象从属性包(或 .frm 文件)中把保存的所有属性值都同时读取出来,读出的数据由 Get 过程使用。 PropertyBag 对象是具体实施保存或读取功能的,它有两个方法:WriteProperty 方法用来写属性值,ReadProperty 方法用来读属性值。特别提醒:对于新手来说,一定要搞清楚 cTxtEffect、mTxtEffect、TxtEffect 和“TxtEffect”这四个东东的意义:cTxtEffect:是结构名。mTxtEffect:是代表 cTxtEffect 结构中某个项目值的中间变量,如果没有枚举结构,则是代表属性值的中间变量,它是模块级的变量。TxtEffect:是属性名,它会出现在窗体页面的属性窗口中。“TxtEffect”:是保存到属性包时所用的名称,笔者为了方便,把它与属性 TxtEffect 取了同一个名称,但并不是同一个概念,它只出现以下在三个方法中:PropertyChanged 方法、ReadProperty方法以及 WriteProperty 方法中,你完全可以另外取个名,但在这三个方法中必须是完全同名的。你可以这样理解:“TxtEffect”是一个文件名,而 mTxtEffect 则是一个变量,你要从“TxtEffect”中读出文件内容并赋值给 mcTxtEffect,或者你要将赋了值的 mcTxtEffect 保存到“TxtEffect”去。还有一个需要注意的地方: 使用 ReadProperty/WriteProperty 方法读写数据时,被读写的变量不能是数组。例如,在 MyMenu 菜单控件中,mCaption 是一维数组,但sCaption不可能是数组,所以你不能这样编写代码:For i = 1 To mItemSum: .WriteProperty 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 是二维数组,所以只能这样编写: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), .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.只读属性前面已经说到,用公用变量法定义的属性一般是只读的,而且一般不论在设计模式还是运行模式都是只读的。用标准过程法定义的属性也可以定义为在运行时只读的属性(当然也可以定义为在设计时只读或者在设计和运行时都只读,不过那有什么意义呢?故我们不加讨论)。最简单的方法,就是不在 Let 或 Set 属性过程中加入任何代码,但通常这会带来诸多不便之处,一般不宜采用。比较适宜的办法就是使用 AmbientProperties 对象。这个对象共有16个属性,都是用户控件的环境信息。比如该对象的 DisplayName 属性就是取得控件的默认名称,中间用户将用户控件画到窗体上时,系统就会自动为控件的 Caption 属性赋值这个默认名称。我们要实现运行时只读属性,要用到的是该对象的 UserMode 属性。当控件处于运行模式时,UserModeTrue,当控件处于设计模式时,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 propCaption(1 To propTabCount) PropertyChanged TabsDrawTabsEnd IfEnd PropertyTabs 属性表示的是选项卡的按纽数目,按纽数目只允许在设计模式时修改,在运行模式时不允许修改。从代码中可以看出,如果运行时企图修改 Tabs 属性是不可能的,换言之,该属性在运行时只读。5.属性说明中间用户把用户控件画到窗体后,想在属性窗口查看它的属性说明,却发现只有简单的“Tabs”之类的几个英文字符,就会弄得头大了。所以,我们有必要对属性加以描述。在用户控件页面,点击“工具过程属性”菜单项,这时会跳出一个对话框,我们在“名称”下拉框中选中需要说明的属性,在下面的“描述”框中就可以输入对这个属性的说明文字了。你可以仿照微软控件的“返回/设置”之类的说明词加以描述,然后点“确定”就行了。再到窗体页面的属性窗口看看,呵呵,正是我们刚才输入的那几个字!后面我还会讲到控件的事件和方法,对于它们的描述也照此办理,不过事件和方法的描述要在“对象浏览器”中才看得到。如果没有描述,“对象浏览器”中有关项目就只有“*工程的成员”的简单说明,为了使中间用户明白你定义的属性、事件和方法的意义,我建议用汉字将所有的属性、事件和方法都进行描述,免去中间用户翻译、猜测、反复试验的麻烦。二、事件就象定义属性一样,我们首先要在用户控件页面代码窗口的 Option Explicit 节中声明要产生的事件(注意声明事件也必须是公用的)。单击“工具添加过程”,在弹出的对话框名称栏中输入事件名称(例如“Click”),在“类型”单选按纽中选择“事件”,点击“确定”,于是声明节中就多了这么一行:Public Event Click()然后再输入对此事件的处理过程代码(以后你为控件添加的任何事件都必须有类似的代码):Private Sub UserControl_Click()RaiseEvent Click 触发Click事件End SubRaiseEvent的功能是把用户控件或其上的子控件的事件进行转发。上面的代码的意思是:当你单击窗体上的用户控件时,VB 就转发出一个单击事件,这个事件发给谁呢?呵呵,当然是发给窗体代码页中相关控件的 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菜单项的文本是显示在标签上的,而标签是一个控件数组,mLabel_Click 过程代码中的 Index 是选中的控件数组的编号,也就是菜单项的编号,这个号码必须返回给主程序中的相应变量,以便作进一步的处理,所以这个编号作为 Click 的参数就被传送出去了。现在,我们在窗体的代码窗口上面的下拉框中找到该菜单控件的单击事件,点击一下,窗口中出现了以下过程代码:Private Sub MyMenu1_Click(SelectedItem As Integer)End Sub看看,返回参数的变量名与在控件代码页声明节中定义的单击事件中的变量名完全一样。在这个过程中,再输入对返回参数的处理代码,你可以用 X=SelectedItem 的句式获取其值,但最好采用下面这样的代码:Private Sub MyMenu1_Click(SelectedItem As Integer)MyMenu1.Visible = False 使菜单控件不可见,这是必须的Select Case SelectedItemCase 1: 去打开文件模块Case 2: 去保存文件模块.End SelectEnd Sub 三、方法找遍网上,所有的资料都只有如何定义用户控件的属性和事件,却没有说明如何定义用户控件的方法。在用户控件页面点击“工具添加过程”,在弹出的对话框中,“类型”单选按纽竟然也没有“方法”!没有办法啊,笔者长叹一声,只好在一片茫然中做试验。经过多次屡败屡试不折不挠的试验,终于获得了成功!其实非常简单:只要在控件代码中增加一个独立的 Sub 公用过程,就定义了用户控件的方法,过程名也就是方法名。方法既可以带输入参数也可以不带,这个参数是传送到控件内部来的(事件的参数是传送到控件外部去的)。例如,在“四则运算”控件中,Start 方法是这样定义的:Public Sub Start()End Sub这是不带输入参数的方法。在窗体中的调用代码是:Cipher.Start再如“图片特技”控件定义的带输入参数的方法:Public Sub Start(Optional ByVal StuntModus As Integer = -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 mCaption As String = 马路消息)End Sub一共带了三个参数,其中第一个参数是必需的(消息内容),第二个参数(组合值)和第三个参数(消息标题)是可选的,基本上与系统的消息框调用方式是一致的。四、属性页很多控件在其属性窗口上方第二个属性之处有“自定义”的属性,点击右边的“”按纽,就打开了属性页。如果某个属性有若干个不能确定数量的子项目,通常就需要使用属性页了。例如系统自带的“工具栏”控件,其中的按纽个数及其标题文本都是不能确定的,这时就要让中间用户根据自己的具体情况,通过属性页来设置了。笔者发布的控件实例中,有三个控件需要使用属性页,这三个控件是:选项卡控件、MyMenu 菜单控件、muchMenu 菜单控件。就拿菜单控件来说,如果你设计的菜单控件仅仅只是为了给自己使用,菜单项数目是固定的,那当然可以多弄几个 Caption 属性来设置菜单文本,比如说你可以定义 Caption1、Caption2、Caption3等等,但这显示不是一个好办法;而如果你设计的菜单控件是打算编译成 OCX 文件发布,那这样就更不行了,固定了菜单项的数目不能满足中间用户的需求。这时,你唯一的办法就是利用属性页了。用户控件的属性页是要我们自己来制作的,制作步骤如下(以 MyMenu 菜单控件为例):1.右键点击“工程资源管理器添加添加属性页VB 属性页向导打开”,弹出“属性向导页介绍”,点击“下一步”,在列表框中选中“工程1:MyMenu”“下一步”“添加(A)”弹出“属性页名称”对话框,修改名称为“myMenuPage”(也可默认),点“确定”后会自动选中 myMenuPage,再点击“下一步”,页面变成“添加属性”,将左边“可用属性”下的“Caption”选入右边的列表框“下一步”“完成”“确定”。现在,你打开窗体代码页面的 MyMenu1 控件的属性窗口,就可以看到一个名称为“(自定义)”的新属性项目了。但是这样的属性页是不能使用的,页面上空空荡荡,就象一个没有添加任何控件的窗体界面,所以我们必须为它添加若干用得着的控件,并编写相应的代码。2.在工程资源管理器中选中 myMenuPage,再点击“工程对象窗口”菜单项,打开属性页的窗口,要添加的控件及其属性设置如下:-控件名Caption Index-Label1 菜单项名称Text1ListBox1Command 添加 0Command 删除 1Command 上移 2Command 下移 3-说明:如果你从来没有接触过属性页的制作,你可以把它当作一个窗体,你的工作就是要编写实现某个功能的小程序(对于菜单控件来说,这个功能就是可以随意增删菜单项),而这个小程序在运行时,窗体上是需要一些控件的,因此,要根据你的需要来决定添加哪些控件。在上表中,Label1 的作用是显示提示信息,是可选的,下面六个控件就是必需的了:文本框用来输入菜单的文本,列表框用来显示你已经输入的所有文本条目,四个按纽用来增加、删除或调整文本条目的上下位置。现在的属性页上面只有我们添加的这几个控件,而没有我们所熟知的【确定】、【取消】以及【应用】按钮,这是怎么回事呢?原来,在设计器中,PropertyPage 对象不会显示这三个按纽,这些都是由属性页对话框自动提供的,当你从属性窗口进入属性页之后,就会看到这三个按纽了。3.添加了控件后,你就要为这个小程序编写代码了。点击“工程代码窗口”调出属性页的代码页添加代码。代码中有两个关键的事件过程是每个属性页都必需的:SelectionChanged 事件当我们点击控件的属性窗口中的“自定义”按纽时,就打开了属性页,这时,PropertyPage 对象所产生的第一个事件是 Initialize 事件,这跟窗体的情况是一样的。但是,与窗体不同的是,PropertyPage 对象并不获得 Load 事件。PropertyPage 对象的关键事件是 SelectionChanged 事件。对我们这个菜单控件而言,执行流程是这样的:(用户控件页的)UserControl_ReadProperties 过程Property Get ItemS 过程(属性页的)PropertyPage_SelectionChanged 过程在 SelectionChanged 事件中,获得要编辑的属性值,也就是说,这个事件携带了从用户控件页对应项目的 Property Get 过程中获得的属性值数据,你可以编写代码将这些数据显示出来。ApplyChanges 事件PropertyPage 对象中的第二重要的事件是 ApplyChanges 事件。在这个事件中,可将已编辑过的属性值返回到当前选定的控件中。当按下属性页上的“确定”或“应用”按钮时,或者由于选择选项卡切换了属性页时,才可能产生ApplyChanges 事件,为什么说“才可能”呢?因为你还要通知系统,某个项目发生了改变,系统才会激活这个事件(这就象用户控件页中,你改变了某个属性的值以后,必须要使用 PropertyChanged 方法通知系统,系统才会保存这个被改变了的属性值一样),所以修改了某个项目的值以后,要将 Changed 属性设置为 True,这就达到了通知系统的目的。并且,如果你不使 ChangedTrue 的话,属性页下方的“确定”、“应用”两个按钮是灰色不可用的。从属性页返回的数据,是由对应的 Property Let 过程来接收的, Property Let 过程接收了数据后,发出 PropertyChanged 通知,系统就保存了你在属性页中修改过的项目值。对我们这个菜单控件而言,执行流程是这样的:(属性页的)PropertyPage_ApplyChanges 过程(用户控件页的) Property Let ItemS 过程(以及 Property Let Caption 过程)UserControl_WriteProperties 过程SelectedControls 集合在 ApplyChanges 事件和 SelectionChanged 事件中,我们都看到了 SelectedControls 集合的身影,它允许对对象中当前选定的所有控件进行访问。它有两个属性:Item 和 Count,前者是我们在创建属性页时与之关联的项目(在我们这个菜单控件中是 Caption),后者是该项目的总数。但在属性页代码中,这两个属性的名称并不是 Item 和 Count,而是与用户控件相关联的属性的名称,例如,与MyMenu1 控件关联的属性页,这两个属性名称就是 Caption 和 ItemS,切记切记!这里还有一个问题,经过笔者的试验,Item 属性似乎只能是一维数组,如果与该属性相关的是一个二维数组或多维数组,那么你就要在用户控件页面的有关代码中加以转换处理,请参看 muchMenu 控件的有关代码。五、用户控件重要过程执行顺序UserControl_Initialize:执行顺序1UserControl_InitProperties:执行顺序2,该过程仅在将控件刚画到窗体上时执行一次。UserControl_Resize:执行顺序3UserControl_Show:执行顺序4六、用户控件的其它重要属性1.AutoRedraw 属性与窗体、图片框的同名属性作用相同。如果要在控件体上直接绘图或打印,一般要设置它为真。2.Alignable 属性当该属性被设置为真时,VB 将自动为控件添加一个新的属性:Align,这样就能够像放置工具条那样安排控件在容器中的位置,而且这还意味着你的控件能够被放置在 MDI 程序中。3.CanGetFocus 属性决定用户控件是否能够在运行时获得焦点。当要创建一个图形控件,或者像计时器控件那样在运行是不可见的控件时,就要设置这个值为 False。要注意的是:只要控件至少包含一个设置为能够接收焦点的子控件,CanGetFocus 属性就不能设置为False,如果 CanGetFocus 设置为 False,则其所有的子控件都不能设置为接收焦点。4.ControlContainer 属性运行时只读。它决定用户控件是否能够像窗体或者 PictureBox 控件那样作为控件容器包含其它的控件。5.DefaultCancel 属性运行时不可用。它决定用户控件是否可以充当标准的命令按钮。笔者的按纽控件中,就设置了这个属性为真。还可以通过检查 AmbientProperties 对象的 DisplayAsDefault 属性来知道控件是不是缺省控件。6.InvisibleAtRuntime 属性运行时不可用。它能够让你创建像计时器那样在运行时不可见的控件。7.ToolboxBitmap 属性:运行时不可用。用来指定放在VB工具箱上的图标。微软建议的大小是1615像素16色,如果你不指定图标,那么所有的用户控件在工具箱中的图标都是千篇一律的,所以最好弄一个有个性的图标。七、过程属性对话框中的功能项目在用户控件页面菜单栏点击工具过程属性,出现过程属性对话框,再点击【高级】按纽展开。先在“名称”下拉框选定一个属性,接下来,你就可以:1.在“描叙”框内输入对本属性的说明。2.在“帮助上下文标识符”框内输入一个帮助的关联 ID 号,将控件与一个帮助文件关联起来,这样当点了属性后再按【F1】键就可以给出这个属性的帮助内容。3.在“在属性浏览器中使用本页”下拉框中给控件的定制属性页分配选定的号码,这样当用户从VB的属性浏览器中选择该成员时,VB将直接显示属性页。4.在“属性分类”下拉框中给本属性选择一个类别,以后VB的属性浏览器的“按分类序”模式中,本属性就会归类于指定的类别下。这些类别包括外观,字体,位置,杂项等等,你还可以创建一个新类别,这只要输入一个新类名就行了。5.勾选“隐藏该成员”可以让属性不在属性浏览器中显示出来,这对于一些不想让用户看到的公有成员有用,但是要记住,它只是隐藏而不是不许被使用。而勾选“在属性浏览器中不显示”可以在控件的设计时(而不是在运行时)把属性从属性浏览器中去掉。作为一般的原则,任何用 ReadProperties 和WriteProperties 实现的永久的属性,都应当被属性浏览器显示出来,反之,任何非永久性的属性就不必被显示出来。6.“缺省用户界面”复选框用来设置控件的缺省属性和方法。例如,设置 Caption 属性为 Lable 控件的缺省属性,那么在窗体代码中就可以将 Label1.Caption = Hello 简写为 Label1 = Hello。八、关于本次发布的用户控件实例的说明1.时钟控件:其中酷时钟程序不是我的原创,它本是一个窗体程序,还使用了一个类。笔者在保持它的基本功能和外观的前提下,将它作了大幅的压缩和删减(精减了一半以上的代码,删除了与钟无直接关系的所有控件),翻译或添加注释,去掉了那个类(将其核心代码移植到用户控件代码中),改造成用户控件,又添加了报时功能,足足费了笔者三整天的时间!从制作用户控件的角度来看,其中有关用户控件的代码很简单。2.混合四则运算控件:在输入计算式时,二进制数据以字母“B”打头,八进制数据以字母“O”打头,16进制数据以字母“H”打头,大小写字母均可。3.选项卡控件:定义按纽数目时,最少为2个按纽,最多为8个按纽,且数目须为偶数4.消息框控件:这东东是很伤脑筋的玩艺,碰到了一个难以解决的问题:如何得到返回值?系统的消息框属于模式窗体,用户没有按下消息框上的按纽以前,程序就挂在那儿,直到按下某个按纽才会继续住下执行。可是用户控件不行,用户控件好象是异步执行方式,还没等用户按键,程序已经执行到调用用户控件的代码后面去了,这种情况下没法取到返回值。无奈之下,想到一个不是办法的办法:在窗体中增加一个计时器,调用用户控件消息框以后,开启计时器,利用计时器的自动执行功能来取得返回值。窗体代码示例如下:Private Sub Cmd1_Click()MegBox1.Visible = TrueMegBox1.Msg 内容已经改变,要保存吗?, 51, 提醒Timer1.Enabled = TrueEnd SubPrivate Sub Timer1_T
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 石油化工行业的供应链风险评估与应对措施
- 新型材料在宠物医疗器械中的创新应用
- 2025年农民工讨薪突发事件应急预案
- 技术型岗位技能提升培训计划
- 从业资格证的实操考试及答案解析
- 高考传统文化话题:24节气-小雪 英语文化素养知识积累
- 建筑施工安全管理标准指南
- 传感器应用及检测技术课程设计书
- 护理胃肠外科题库及答案解析
- 入职体检报告范本及体检流程详解
- 徐州市2024-2025学年六年级上学期11月期中调研数学试卷一(有答案)
- 2024届清华大学强基计划数学学科笔试试题(附答案)
- 健康食品生产质量管理体系文件
- 性与生殖健康讲堂智慧树知到答案2024年湖南中医药大学
- 精神科护相关法律法规
- DL∕T 516-2017 电力调度自动化运行管理规程
- 2024艺术品买卖合同
- 艾滋病抗病毒治疗定点门诊工作制度
- HPV感染与HPV疫苗知识学习培训课件
- 浙江省宁波市镇海中学2024年高二上期末考试英语试卷含解析
- 鸭健康状况生物指标分析
评论
0/150
提交评论