谈谈您的看法
大家都知道大名鼎鼎的WINAMP播放器是支持“换肤”的,也就是说,我们可以动态的改变窗体和控件的背景图案,使窗体看起来十分漂亮,而且能够不断更换新的面孔。那我们能让自己的程序也实现这样的效果吗?答案是肯定的,下面我们就一起来看看用VB6做出的可以换肤的窗体。
程序包含一个主窗体和一个模块,为了使窗体上的控件也能以我们选择的图案作为背景,我们使用了Microsoft Forms2.0 Object Library的控件组,在默认状态下它不在控件面板中,我们可以在控件面板上点鼠标右键“添加”,在“添加选择对话框”中找到这个控件并选中添加进来。这时会多出几个控件,如下图所示红线圈住的部分:
这个程序中我们使用了其中的三个控件,乍一看它们和默认的标签、文本框、按钮没有什么区别,但它们的属性中多出了BackStyle属性,我们正是利用了这个属性,将控件设为背景透明0-fmBackStyleTransparent,这样控件的背景就能和窗体的背景保持一致了。
为了学习方便,提供的源码已经作了详细的中文注释,看看源码框中的代码:
'------------------------------------------- ' 一个可换肤的窗体的例子 '------------------------------------------- ' 洪恩在线 求知无限 '------------------------------------------- '程序说明: '这个例子中,我们可以为应用程序的窗体设置背景图 '片,这是通过在窗体上平铺图片实现的,而你会发现 '窗体上的其他控件也变为透明,这是应用了控件集合 'Microsoft Forms2.0 Object Library得以实现的 '你必须在组件面板中添加此项,然后把要使用的控件 '的BackStyle属性设为0-fmBackStyleTransparent '即可。 '------------------------------------------ Private Sub CmdExit_Click() End End Sub '也可点击“选择背景图片”按钮,在程序运行过程中更换背景图片 Private Sub CmdSel_Click() '打开选择文件对话框 Cdl1.ShowOpen '选中的图片文件的路径赋值给BackPicture变量(全局变量,在模块中定义) BackPicture = Cdl1.FileName '换肤 ShowBackGround Frmmain End Sub '窗体加载时自动从应用程序所在的目录下寻找default.bmp文件,并把它设置为窗体背景 '我们可以用其它图片替换此文件以为应用程序换上不同的皮肤 Private Sub Form_Load() '取得背景图片的完整路径 BackPicture = App.Path + "\default.JPG" 'ShowBackGround子过程(在模块中定义),为窗体设置背景 ShowBackGround Frmmain End Sub ------------------------- '------------------------------------------------------ '以下是模块中的源码: '------------------------------------------------------ '存储背景图片的变量 Global BackPicture As String '设置背景图片的子过程 Sub ShowBackGround(Frm As Form) '将Pic定义为StdPicture对象(StdPicture对象是包含各种图元的对象) Dim Pic As StdPicture '如果选择图片时,按下“取消”按钮(也就是没有选中文件) If BackPicture = "" Then Exit Sub '先清空窗体上原有图片背景 Frm.Cls '如果出现异常错误,转向错误处理语句 On Error GoTo ErrorPic '将选中的图片文件加载到Pic中 Set Pic = LoadPicture(BackPicture) '下面将图片排满整个窗体 W = 0 H1 = Pic.Height / 27 W1 = Pic.Width / 27 While W < Frm.ScaleWidth H = 0 While H < Frm.ScaleHeight Frm.PaintPicture Pic, W, H H = H + H1 Wend W = W + W1 Wend 'ShowBorder Frm Exit Sub '如果出现异常错误,则恢复默认的背景图片 ErrorPic: If Err.Number = 481 Then MsgBox " Picture File Error!" End If If BackPicture <> App.Path + "\default.JPG" Then BackPicture = App.Path + "\default.JPG" Set Pic = LoadPicture(BackPicture) Resume Next Else 'ShowBorder Frm End If End Sub '--------------------------------------------- '如果我们不想使用默认的标题栏和边框,而自己制作更漂 '亮的标题栏,可把窗体Frmmain的Border属性设为0-None '利用下面的ShowBorder来重新画出窗体的Border,别忘 '了把上面中的ShowBackGround子过程的ShowBorder Frm '写上。 '--------------------------------------------- 'Sub ShowBorder(Frm As Form) ' Frm.DrawWidth = 1 ' Frm.Line (Frm.ScaleWidth - 1, 1)-(Frm.ScaleWidth - 1, Frm.ScaleHeight - 1), QBColor(1) ' Frm.Line (Frm.ScaleWidth - 2, 2)-(Frm.ScaleWidth - 2, Frm.ScaleHeight - 2), QBColor(8) ' Frm.Line (Frm.ScaleWidth - 3, 3)-(Frm.ScaleWidth - 3, Frm.ScaleHeight - 3), QBColor(7) ' Frm.Line (1, Frm.ScaleHeight - 1)-(Frm.ScaleWidth - 1, Frm.ScaleHeight - 1), QBColor(1) ' Frm.Line (2, Frm.ScaleHeight - 2)-(Frm.ScaleWidth - 2, Frm.ScaleHeight - 2), QBColor(8) ' Frm.Line (3, Frm.ScaleHeight - 3)-(Frm.ScaleWidth - 3, Frm.ScaleHeight - 3), QBColor(7) ' Frm.Line (0, 0)-(Frm.ScaleWidth, 0), QBColor(7) ' Frm.Line (1, 1)-(Frm.ScaleWidth - 1, 1), QBColor(15) ' Frm.Line (2, 2)-(Frm.ScaleWidth - 2, 2), QBColor(7) ' Frm.Line (0, 0)-(0, Frm.ScaleHeight), QBColor(7) ' Frm.Line (1, 1)-(1, Frm.ScaleHeight - 1), QBColor(15) ' Frm.Line (2, 2)-(2, Frm.ScaleHeight - 2), QBColor(7) 'End Sub '---------------------------------------------- '怎么拖动不带标题栏的窗体呢?你可参考源码讲解的例子 '---------------------------------------------- (源程序下载)
程序每次运行时都会到程序所在的目录下找default.bmp文件,如果找到这个文件,它就会把这张图片作为窗体的背景,这样我们可以用自己喜欢的图片替换这张图,也就是为程序“换肤”,另外程序运行过程中也可动态的改变窗体的背景图片。
另外如果你想把窗体的标题和边框去掉,制作完全自己风格的窗体,程序中一段用引号框起的代码会对你有用,但是怎么拖动无边框的窗体呢?你可以参照相关源码讲解的内容。