程序窗体换肤设计

程序窗体换肤设计

最早看到窗体炫酷皮肤的软件是千千静听,感到很惊艳。老想自己做一个。一番绞脑之后明白了。其实换肤也很简单,设置2到3个pad功能分区底板,以便于功能块的关闭和打开。另设置12个预设定皮肤源图p1(0-11)图片组,皮肤图片可用32*32icon图标图片或其他尺寸bmp图片,预先载入图片组控件。用VB的BitBlt…SRCCOPY贴图方法铺满窗体的功能块区域即可。图片组方法可以做成皮肤选项卡,换肤时跳出选项卡选图换肤。也可不用图片组方法,直接将12个小图片用画板软件拼接成图片条,同样用SRCCOPY方法铺满窗体的功能块区域。此方法要另外做皮肤选项卡。

pad1,pad2是picturebox 做画布绘制皮肤,上面添加
VB.DriveListBox Drive1
VB.ComboBox Combo1
VB.DirListBox Dir1
VB.FileListBox File1
VB.TextBox Text1
就成了打开文件窗口。
pad2可作为播放停止按钮控制板。

至于皮肤图片么,什么风格就你自己设计了。炫酷的,古典的,文雅的,淡色深色的,自己喜欢就好。但有一点要注意,选的小图片块连行连排贴起来要不露贴图痕迹为佳,这就要求你有艺术功底了。
本示例是用VB6 写的,可用VC 或其他语言改写。

附上范例:
主程序窗体Mplayer6 (多媒体播放器)
引用窗体 cdplay61 (CD播放器)
窗体源码详见我上传的资源文件:程序窗体界面换肤的实现(VB6源码)

以下是操作示例:
pad1,pad2是picturebox,是功能块底板, 做画布绘制皮肤
facenum 皮肤底图编码

Private Sub draw_form()
'**** 皮肤贴图和换肤操作
dW = picHBar.Width
For n = 0 To 232 '**** 绘制渐变色窗体上部标题条
picHBar.Line (0, n)-(dW, n), RGB(232 - n, 232 - n, 255 - n / 2)
Next
picHBar.Line (0, 0)-(1, 225), QBColor(15), B

facenum = labFnum.Caption
If labFnum.Caption = “” Then ’ **** 初始为空,则预设定为 2
facenum = 2
End If
If facenum = 4 Or facenum = 5 Or facenum = 9 Then
labFilename.ForeColor = QBColor(9) '**** 文字颜色与皮肤色协调
Else
labFilename.ForeColor = QBColor(14)
End If
'****** pad1 , pad2 为功能分区
dW = pad1.Width / 15
dH = pad1.Height / 15
dw1 = p1(facenum).Width / 15
dh1 = p1(facenum).Height / 15
pad1.DrawWidth = 1
For sh = 0 To dH Step dh1
For sw = 0 To dW Step dw1
BitBlt pad1.hdc, sw, sh, dw1, dh1, p1(facenum).hdc, 0, 0, SRCCOPY
Next
Next
pad1.DrawWidth = 3 '**** 绘制功能区域分仓框线
pad1.Line (-15, -15)-(dW * 15 + 15, dH * 15 + 15), QBColor(15), B
pad1.Line (-30, -30)-(dW * 15 - 15, dH * 15 - 15), QBColor(8), B

dW = pad2.Width / 15
dH = pad2.Height / 15
pad2.DrawWidth = 1
For sh = 0 To dH Step dh1
For sw = 0 To dW Step dw1
BitBlt pad2.hdc, sw, sh, dw1, dh1, p1(facenum).hdc, 0, 0, SRCCOPY
Next
Next
pad2.DrawWidth = 3 '**** 绘制功能区域分仓框线
pad2.Line (-15, -15)-(dW * 15 + 15, dH * 15 + 15), QBColor(15), B
pad2.Line (-30, -30)-(dW * 15 - 15, dH * 15 - 15), QBColor(8), B
'*****************************
pad1.Refresh
pad2.Refresh

'*********** 同时绘制其他部分皮肤 **********
BitBlt picNd.hdc, 0, 0, dw1, dh1, p1(facenum).hdc, 0, 0, SRCCOPY
picNd.Line (0, 45)-(840, 60), QBColor(9), BF
BitBlt ps1.hdc, 0, 0, dw1, dh1, p1(facenum).hdc, 0, 0, SRCCOPY
ps1.Line (0, 0)-(955, 150), QBColor(2), B

'** draw CD Player cover 同时绘制其他窗体皮肤
dW = cdplay61.pad1.Width / 15
dH = cdplay61.pad1.Height / 15
cdplay61.pad1.DrawWidth = 1
For sh = 0 To dH Step dh1
For sw = 0 To dW Step dw1
BitBlt cdplay61.pad1.hdc, sw, sh, dw1, dh1, p1(facenum).hdc, 0, 0, SRCCOPY
BitBlt cdplay61.pad2.hdc, sw, sh, dw1, dh1, p1(facenum).hdc, 0, 0, SRCCOPY
Next
Next
cdplay61.pad1.Line (-15, -15)-(dW * 15 + 15, dH * 15 + 15), QBColor(15), B
cdplay61.pad1.Line (-30, -30)-(dW * 15 - 15, dH * 15 - 15), QBColor(8), B
cdplay61.pad1.Refresh
cdplay61.pad2.Refresh
End Sub

Private Sub cmdFace_Click()
'**** 换肤按钮
'**** 此设置是连续循环换肤,满意即可。用户操作简单便捷
'**** 也可改为选项卡选择皮肤图片,用户操作太费时
facenum = facenum + 1
If facenum > 11 Then facenum = 0
labFnum.Caption = facenum
draw_form '**** 绘出皮肤

Select Case facenum '**** 显示皮肤名称
Case 0
labStatus.Caption = “经典风格”
Case 1
labStatus.Caption = “水到渠成”
Case 2
labStatus.Caption = “蓝天之梦”
Case 3
labStatus.Caption = “兰色妖姬”
Case 4
labStatus.Caption = “木已成舟”
Case 5
labStatus.Caption = “平原秋色”
Case 6
labStatus.Caption = “花样年华”
Case 7
labStatus.Caption = “金色年代”
Case 8
labStatus.Caption = “燃情岁月”
Case 9
labStatus.Caption = “金碧辉煌”
Case 10
labStatus.Caption = “古风典雅”
Case 11
labStatus.Caption = “摩登时代”
End Select

End Sub

Private Sub cmdFace_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
labStatus.Caption = “换肤”

facenum = labFnum.Caption
Select Case facenum
Case 0
labStatus.Caption = “经典风格”
Case 1
labStatus.Caption = “水到渠成”
Case 2
labStatus.Caption = “蓝天之梦”
Case 3
labStatus.Caption = “兰色妖姬”
Case 4
labStatus.Caption = “木已成舟”
Case 5
labStatus.Caption = “平原秋色”
Case 6
labStatus.Caption = “花样年华”
Case 7
labStatus.Caption = “金色年代”
Case 8
labStatus.Caption = “燃情岁月”
Case 9
labStatus.Caption = “金碧辉煌”
Case 10
labStatus.Caption = “古风典雅”
Case 11
labStatus.Caption = “摩登时代”
End Select

End Sub

‘**** End ****

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目前这方面的软件很多,但大部分都是收费的,不收费大部分又换的不全,对于一个学生来说花钱买是有些奢侈了,所以我一直就想做一个换肤软件提供给学生,让他们做课程设计或毕业设计时能轻易给自己软件美化界面。 但是一直苦于时间有限。工作太忙有时只能在周末或晚上写上两行代码。现在终于成形了本打算开源,但是有些地方还不完善(现只支持VC MFC, Windows Type: Dialog, SDI),所以现在只讲下原理,提供部分源码供感兴趣的人研究。现在发出来与大家共享。 现在商业的换肤软件大部分都是采用的Hook技术(呵呵,猜的,也许采用的更高深的技术)。Hook窗体消息,对窗体消息进行截获最终换成自已的处理方式。所以本人写的SkinMaster也是采用了同样的技术原理。说很简单但做起来有些困难。下面是我做Skin时遇到的问题及处理方式。 1.对于Windows基本控件进行Hook则可完成绘制。 2.对于菜单会制则有些麻烦,程序运行时窗体菜单WM_MEASUREITEM只运行一次,所以会出现在动态换另一套皮肤时菜单项大小不会跟据皮肤改变,解决方法是所有菜单你要动态生成。 3.主窗体的绘制,没啥太深技术就是要处理大量的消息。 4.滚动条的绘制,滚动条全靠Hook消息就没办法完成了,这个东西微软做的不像基本控件那样工作,还要对滚动条的API进行Hook。 先写这些,有时间我会把更详细的方法给大家写出来。下面程序中TestSkin程序提供源码,并完成了按钮等控件的换肤

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值