找回密码
 开放注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

搜索
查看: 1281|回复: 0

如何做vb6.0的自定义控件

[复制链接]

246

主题

98

回帖

675

牛毛

一级牛人

黑客帝国

积分
675
发表于 2009-7-24 20:10:04 | 显示全部楼层 |阅读模式 来自 河北省沧州市
以做一个带背景图片的label框为例  

首先选择添加一个用户控件……这个要怎么添加我就不多说了吧  

然后在用户控件的界面上添加一个label一个image,同时将label1置为顶层(bring to front 反正让label1压着image1就行了)  
然后将label1的backstyle设为透明,usercontrol的backstyle也设为透明,image1的strech属性设置为true,然后随便为image1添加背景图片。  
接着添加如下代码:  
Private Sub UserControl_Resize()  
    With Image1  
        .Left = 0  
        .Top = 0  
        .Height = UserControl.Height  
        .Width = UserControl.Width  
    End With  
    With Label1  
        .Left = 0  
        .Top = 0  
        .Height = UserControl.Height  
        .Width = UserControl.Width  
        .BackStyle = 0  
    End With  
    UserControl.BackStyle = 0  
End Sub  
这些代码的作用是,用户在界面上划usercontrol的时候,label1和image1随着usercontrol的大小变化而变化。 (补充:也就是说,label1和image1的大小充满整个用户控件。- -|||说不清楚,反正,你用到用户控件的时候,都会在屏幕上画一个区域吧?你画的区域有多大,用户控件显示的区域就有多大,用户控件上的label1控件和其他控件就会和用户控件显示的区域一样大,让别人产生用户控件就是一个label的错觉。)
好了,打字先到这里,休息一下,接下来讲如何设定usercontrol的响应事件。

接下来讲解如何设定响应事件。  
请添加以下代码:
Event click() '声明一个事件这个事件就像label1_click事件一样会出现在用户控件的事件代码窗口

Private Sub Label1_Click()  
RaiseEvent click '用户控件上的label1控件被click时,触发用户控件的click事件,因为一开始设定label1和用户控件一样大,所以点击label1的事件就相当于点击用户控件的事件了
End Sub  

好了,用户控件的click事件结束了。就这么简单?对!我一开始也觉得不可思议呢。  
这些代码的作用是,当用户点击usercontrol上面的label框时,触发usercontrol的click事件,也就是说,触发你在private sub usercontrol1_click()这个过程中的代码。  

太棒了!用户控件快设计完了,接下来我们说怎么设定usercontrol的属性。

请加入以下代码  

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)  
m_backstyle = 0  
Set Label1.Font = PropBag.ReadProperty("Font", Ambient.Font)  
Label1.ForeColor = PropBag.ReadProperty("ForeColor", &H800****0008)  
Label1.Caption = PropBag.ReadProperty("Text", "")  
End Sub  

明白了吧?其实设定usercontrol的属性也就是在设定你画在usercontrol上面的控件的属性。  
上面的代码是读取属性用的(其实我做自定义控件是看着别人的原代码学的,并非老师教的,所以有一些具体的也不清楚,只知道要这样用就是了。)  

然后再加上写入属性的代码:  
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)  
Call PropBag.WriteProperty("backstyle", 0, 0)  
Call PropBag.WriteProperty("Font", Label1.Font, Ambient.Font)  
Call PropBag.WriteProperty("ForeColor", Label1.ForeColor, &H800****0008)  
Call PropBag.WriteProperty("Text", Label1.Caption, "CMX")  
End Sub  

好了,这样就为用户控件设定了backstyle,forecolor,font,text四项属性了。  
可是怎样让用户可以修改这些属性呢?请看下回分解。
'我们就以font为例,看看怎么让用户修改用户控件的属性吧
我们现在来讨论一下,怎么让用户修改font属性  
请加入以下代码:  
Public Property Get Font() As Font  
Set Font = Label1.Font'将用户控件的font属性设置为控件上label1控件的font属性  
End Property  
Public Property Set Font(ByVal New_Font As Font)  
Set Label1.Font = New_Font'将用户修改后的font属性赋给label1.font  
PropertyChanged "Font"'修改用户控件的font属性为最新的属性  
End Property  

ok了!用户可以在属性窗口和代码修改font了!~再添加进修改forecolor,text的属性代码,就可以完成这个用户控件了!

现在我把所有原代码都贴进来,这是一个有图片背景,支持更改text的label~  
当然之前请做好控件的属性设定:  
在用户控件的界面上添加一个label一个image,同时将label1置为顶层(bring to front 反正让label1压着image1就行了)  
然后将label1的backstyle设为透明,usercontrol的backstyle也设为透明,image1的strech属性设置为true,然后随便为image1添加背景图片。  
接着添加如下代码:  
Private m_backstyle As Integer  
Event click()  

Private Sub Label1_Click()  
RaiseEvent click  
End Sub  

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)  
m_backstyle = 0  
Set Label1.Font = PropBag.ReadProperty("Font", Ambient.Font)  
Label1.ForeColor = PropBag.ReadProperty("ForeColor", &H800****0008)  
Label1.Caption = PropBag.ReadProperty("Text", "")  
End Sub  

Private Sub UserControl_Resize()  
With Image1  
.Left = 0  
.Top = 0  
.Height = UserControl.Height  
.Width = UserControl.Width  
End With  
With Label1  
.Left = 0  
.Top = 0  
.Height = UserControl.Height  
.Width = UserControl.Width  
.BackStyle = 0  
End With  
UserControl.BackStyle = 0  
End Sub  

Private Sub UserControl_WriteProperties(PropBag As PropertyBag)  
Call PropBag.WriteProperty("backstyle", 0, 0)  
Call PropBag.WriteProperty("Font", Label1.Font, Ambient.Font)  
Call PropBag.WriteProperty("ForeColor", Label1.ForeColor, &H800****0008)  
Call PropBag.WriteProperty("Text", Label1.Caption, "CMX")  
End Sub  
Public Property Get BackStyle() As Integer  
BackStyle = Label1.BackStyle  
End Property  

Public Property Get Font() As Font  
Set Font = Label1.Font  
End Property  
Public Property Set Font(ByVal New_Font As Font)  
Set Label1.Font = New_Font  
PropertyChanged "Font"  
End Property  
'WARNING! DO NOT REMOVE OR MODIFY THE FOLLOWING COMMENTED LINES!  
'MappingInfo=TextBoxEx,TextBoxEx,-1,Text  
Public Property Get Text() As String  
Text = Label1.Caption  
End Property  

Public Property Let Text(ByVal New_Text As String)  
Label1.Caption() = New_Text  
PropertyChanged "Text"  

End Property  
Public Property Get ForeColor() As OLE_COLOR  
ForeColor = Label1.ForeColor  
End Property  

Public Property Let ForeColor(ByVal New_ForeColor As OLE_COLOR)  
Label1.ForeColor() = New_ForeColor  
PropertyChanged "ForeColor"  
End Property

这样就完全结束了

之后你只要多看别人的原代码应该就可以了

这些也只是我看了vbangle的一个文本框原代码,领悟出来的。

如果看不懂 没有办法

Private Sub Command1_Click()
if usercontrol11.visible=true then
UserControl11.Visible = False
else
usercontrol11.visible=true
end if
End Sub

Private Sub Command2_Click()
UserControl11.Text = "sffffffffffffffffff"
End Sub

Private Sub UserControl11_click()
UserControl11.Text = UserControl11.Text & "hxhack"
End Sub

usercontrol11就是你把用户控件弄到窗口上之后,设置的他的name(这个好像其实不用我说吧……)
您需要登录后才可以回帖 登录 | 开放注册

本版积分规则

帮助|Archiver|小黑屋|通信管理局专项备案号:[2008]238号|NB5社区 ( 皖ICP备08004151号;皖公网安备34010402700514号 )

GMT+8, 2025-4-28 01:30 , Processed in 0.329183 second(s), 30 queries .

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表