VC6.0完美界面换肤解决方案

完美界面换肤解决方案

-、简介

VC里边界面换肤是比较头痛的问题,网上有不少介绍,但是大多数仅仅提供Dll或者Lib,有代码的又有很多问题,效果很差。这几日突然想到一个解决方案,有源码,皮肤有一百多个,就是采用Delphi里边成熟的界面组件vclskin,将它做成Dll来用,效果相当不错,赶紧介绍给大家。

二、效果预览

实例中的效果如下图:

 

效果预览

三、Dll制作

首先启动Delphi7,创建一个Dll工程。

选择Dll工程类型

然后点击保存所有按钮,设定工程名称Skin

新建的Dll工程

然后添加VclSkin里边的ImgUtil.pasSkinRead.pasWinConvert.pasWinSkinCollection.pasWinSkinData.pasWinSkinDlg.pasWinSkinForm.pasWinSkinIni.pasWinskinmenu.pasWinSkinStore.pasWinSubClass.pas文件到工程中。

再添加Compilers.incvclskin.res文件到工程目录中。

再添加加载皮肤代码,编辑后的代码如下:

完成的代码

可以看出这个Dll只有一个函数LoadSkin,入口参数为皮肤文件路径名。

 

四、调用方法

创建VC工程SkinTestVC的创建就不具体介绍了,添加代码如下:

在应用程序类里添加加载Dll,卸载Dll的代码:

         m_hModule  = LoadLibrary ( "Skin.dll" );

         FreeLibrary ( m_hModule );

 

在程序的第一个对话框初始化的时候调用LoadSkin函数:

typedef int ( CALLBACK * FUNC ) ( PCHAR );

void CSkinTestDlg::InitSkin ()

{

         CHAR szName [ MAX_PATH ];

         CString strName = GetAppPath () + "skins//LE4-DEFAULT.skn";

         FUNC pFunc = ( FUNC ) GetProcAddress ( theApp.m_hModule, "LoadSkin" );

         strcpy ( szName, strName );

         pFunc ( szName );

}

 

五、注意事项

1、  实例中包含了所有的源代码,可以随便修改它,添加从资源加载皮肤,动态换肤的功能。

2、  实例中的VclSkin4.93代码为其它公司成熟的产品,请下载后在24小时内删除。

3、  皮肤有很多,可以到网络上下载,更有皮肤编辑工具,方便自定义。

源程序和实例下载路径:http://download.csdn.net/source/496381

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值