Duilib打包皮肤文件到程序中,实现从资源中加载皮肤
本方法只适合github duilib官方的库,其它第三方的库有自己的实现,源代码修改太多,故可能不能使用
下面是我自己从官方弄过来使用的库
https://github.com/zhaokeli/DuiLib_ANK
使用duilib写程序的时候如果皮肤文件直接放目录下可能就会被别人拿来乱修改,这可不是我们想要的,于是打包皮肤文件进程序这个需求就产生啦,虽然防止不了破解的大神但是一般的小白还是能防的,并且还方便啦一些喜欢绿绿色单一文件的朋友,我就是喜欢一个文件随身带!
实现方法
把你的皮肤目录打包,注意是从皮肤根目录打包成zip文件,然后打开项目添加->资源->导入 选择你的皮肤zip压缩包
然后在弹出的窗口中输入类型 ZIPRES 因为一般情况导入的资源很多我们要给它定义一个类型,并且这个类型名字是固定的,因为duilib里就是用这个类型来加载资源的,不能用其它类型,除非你改动duilib源码,不过也没有这个必要啦,一般情况下对话框中下面是没有 "ZIPRES" 这个提示的,下图中的有个提示是因为我之前已经添加过啦,又添加啦一次方便截图记录
添加完成后注意资源里会有一个 ZIPRES类型 id 为 IDR_ZIPRES1的资源id(名字可能会不一样,找到就可以),这个就是我们后面要用到的皮肤资源id
首先保存你的窗口类继承 WindowImplBase 类并且要实现下面几个方法来实现从zip资源中加载皮肤文件,下面是方法的声明
virtual CDuiString GetSkinFolder() override; virtual CDuiString GetSkinFile() override; //返回加载皮肤的方法是zip压缩包还是文件夹还是zip资源 UILIB_RESOURCETYPE GetResourceType() const; //如果是皮肤是zip资源就返回资源id LPCTSTR GetResourceID() const;
方法说明
很明显上面的四个方法是定义当前窗口类的皮肤是怎么加载的
GetSkinFolder是设置加载当前窗口皮肤文件的根目录,
GetSkinFile是设置当前窗口的Xml文件,路径是上面设置的目录位置,
GetResourceType是设置皮肤资源的类型
duilib中定义的类型为
enum UILIB_RESOURCETYPE
{
UILIB_FILE=1, // 来自磁盘文件
UILIB_ZIP, // 来自磁盘zip压缩包
UILIB_RESOURCE, // 来自资源
UILIB_ZIPRESOURCE, // 来自资源的zip压缩包
};
GetResourceId是设置从哪个资源中加载皮肤,只有当GetResourceType返回值是 UILIB_ZIPRESOURCE时这个值才有效
方法的实现
CDuiString MainWnd::GetSkinFolder() { return "skin/sendhttprequest"; } CDuiString MainWnd::GetSkinFile() { return _T("main.xml"); } UILIB_RESOURCETYPE MainWnd::GetResourceType() const { #ifdef _DEBUG return UILIB_FILE; #else //下面是资源zip文件,调试期间用上面那个就可以 return UILIB_ZIPRESOURCE; #endif } LPCTSTR MainWnd::GetResourceID() const { //当上面类型的从资源加载时才有效 return MAKEINTRESOURCE(IDR_ZIPRES1); }