duilib进阶教程 -- 设置资源路径 (15)
在前面的教程里,虽然图片都放到了skin文件夹里,但是XML却都在外面,当XML比较多时,就不太好看啦,如下图:

所以需要整理一下,将XML也放入skin文件夹,这样exe的目录就简洁多了:

将XML放入skin文件夹后,代码也要跟着变化哦,在duilib的Demo里经常可以看到如下代码:
(其中SetResourcePath是设置资源的路径,包括XML和图片等各种资源;SetResourceZip是指资源都放到ListRes.zip文件里了。)
CPaintManagerUI::SetInstance(hInstance);
CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath() + _T("skin"));
CPaintManagerUI::SetResourceZip(_T("ListRes.zip"));
而Alberl的教程中一直只有一行代码
CPaintManagerUI::SetInstance(hInstance);
这是因为WindowImplBase已经将CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath())封装到内部了,所以无需再调用,不过当我们将资源路径设置到skin文件夹时,却发现SetResourcePath(CPaintManagerUI::GetInstancePath() + _T("skin"));后,程序会崩溃。这是因为需要重载WindowImplBase的GetSkinFolder函数,并且return _T("skin"),不过这就让那几个类都不通用了,显然不是个好方法,因此需要找一个通用的方法,那就是改进WindowImplBase,只需将WindowImplBase::OnCreate函数里的
CDialogBuilder builder;
CDuiString strResourcePath=m_PaintManager.GetInstancePath();
strResourcePath+=GetSkinFolder().GetData();
m_PaintManager.SetResourcePath(strResourcePath.GetData());
改成下面这样即可:
CDialogBuilder builder;
CDuiString strResourcePath=m_PaintManager.GetResourcePath();
if (strResourcePath.IsEmpty())
{
strResourcePath=m_PaintManager.GetInstancePath();
strResourcePath+=GetSkinFolder().GetData();
}
m_PaintManager.SetResourcePath(strResourcePath.GetData());
这样我们就可以像Demo里那样直接调用CPaintManagerUI::SetResourcePath函数啦,不过还需要将XML里面的资源路径改一下,因为XML里面的资源都是以skin\XXX.png 这种形式的,而设置了资源路径到skin文件夹之后,就不需要skin前缀了,因此直接用XXX.png就可以访问到skin路径下的文件。
而SetResourceZip是将资源压缩到zip文件里,有的小伙伴不想让人发现资源,于是想弄个加密压缩包,或者把压缩包分成几部分,这样就不能直接解压了。当然,还有各种各样的方法可以让人看不到资源文件。
但是Alberl早在《仿迅雷播放器教程 -- 提取exe资源(12)》就告诉了大家一种方法,不仅可以直接提取QQ的rdb文件,还可以提取迅雷的加密XAR文件,不管是加密的,还是分成几部分的文件,都是可以快速提取出来的,重要的是,根本不需要一丁点黑客知识,也不需要花时间去研究rdb和XAR的格式,更不需要去破解密码,直接点击下鼠标就OK了。
所以如果还没有去隐藏资源,但是又想这样做的小伙伴们,Alberl的建议就是:如果能快速搞定加密和扰乱文件,那就无所谓了,如果不会这些,就没必要花时间去弄了,因为阿猫阿狗拿了你的资源也干不了啥事,而高手的话,你那点小伎俩根本就难不倒他,小公司模仿你的软件也威胁不了你,大公司也看不上你的软件,所以从商业的角度,只是浪费时间而已。当然,如果你实在不想共享资源,那就去做吧 ~O(∩_∩)O~
duilib进阶教程 -- 设置资源路径 (15)的更多相关文章
- duilib进阶教程 -- 总结 (17)
整个教程的代码下载:http://download.csdn.net/detail/qq316293804/6502207 (由于duilib进阶教程主要介绍界面,所以这个教程只给出界面相关的代码,完 ...
- duilib进阶教程 -- Container控件的bug (14)
在<duilib进阶教程 -- TreeView控件的bug (9)>里,Alberl发现了两个bug,并解决了其中一个,现在教程已经接近尾声啦,所以Alberl就解决了另外一个bug. ...
- duilib进阶教程 -- TreeView控件(6)
代码下载:http://download.csdn.net/detail/qq316293804/6483905 上一个教程中,界面已经和迅雷一模一样啦,大小和位置一个像素都不差哟,亏得Alberl调 ...
- duilib进阶教程 -- 在MFC中使用duilib (1)
由于入门教程的反响还不错,因此Alberl就以直播的形式来写<进阶教程>啦,本教程的前提: 1.请先阅读<仿迅雷播放器教程> 2.要有一定的duilib基础,如果还没,请先阅读 ...
- duilib进阶教程 -- Container控件 (3)
前面两个教程的目的是教大家与MFC结合,那么从这篇起,将不再使用MFC,而使用纯win32项目,本文的所有知识已经在<duilib入门教程>里面讲过了,因此基础知识不再赘述. 代码下载:h ...
- duilib进阶教程 -- 各种控件的响应 (10)
到上一个教程为止,界面显示的代码就都介绍完啦,现在开始介绍控件的响应,其实在<2013 duilib入门简明教程 -- 事件处理和消息响应 (17)>里已经列出了duilib自己定义的所有 ...
- duilib进阶教程 -- 图片和文字的位置调整 (5)
已经有8个晚上没写教程啦,因为之后遇到了一些问题,主要是TreeView控件的问题,这个问题搞了几个晚上,然后还需要调试代码才能知道它的用法,虽然能够调试出来,但毕竟没什么含金量,只是重复劳动而已,相 ...
- duilib进阶教程 -- TreeView控件的不足 (7)
上一个教程中,虽然播放列表的框架和迅雷一样了,但是字体大小.文字居中还没有解决.如果是刚学duilib,搞定这个可不容易,因为在有了入门教程的指导后,很容易就想到去看[属性列表.XML],但是当你试了 ...
- duilib进阶教程 -- Label控件的bug (8)
上个教程说到了TreeView的文字不能垂直居中的问题,而我们用LabelUI其实是可以垂直居中的,为什么不说是TreeView的bug,而说是Label控件的bug呢?因为影响TreeView垂直居 ...
随机推荐
- 第一章 tomcat安装与启动
一.安装 1.下载tomcat安装包 2.解压安装包 3.配置环境变量 打开~/.bash_profile文件,输入一下两句话: export TOMCAT_HOME=/Users/enniu1/De ...
- Vmware /CentOS访问Windows中的文件
1.将该文件设为共享文件夹 2.确定你的windows IP地址,用户名及密码 3.CentOS终端输入以下内容: [root@*** mnt]# mkdir winD [root@*** m ...
- Azure china服务状态报告查看网址
https://www.azure.cn/support/service-dashboard/
- SQL Server 树查询
WITH treeAS(SELECT ParentAssetID, AssetID,1 AS x2level,nodename,CAST(nodename AS NVARCHAR(max)) x2na ...
- iOS IPv6兼容支持和IPv6审核被拒收集整理
最近遇到一个大坑:IPv6审核被拒问题,于是广寻解决方案,先把一些可以用资料文档收集起来备用.也希望同行能用得着. 官方文档说明:Supporting IPv6 DNS64/NAT64 Network ...
- mysql 数据库问题com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
本文转自:http://blog.csdn.net/zmzsoftware/article/details/6835604 MySQL第二天早上第一次连接超时报错,解决方法com.mysql.jdbc ...
- 【状压dp】【bitset】bzoj1688 [Usaco2005 Open]Disease Manangement 疾病管理
vs(i)表示患i这种疾病的牛的集合. f(S)表示S集合的病被多少头牛患了. 枚举不在S中的疾病i,把除了i和S之外的所有病的牛集合记作St. f(S|i)=max{f(S)+((St|vs(i)) ...
- 新浪微博SDK的使用
花了两天时间研究了一下新浪微博SDK,遇到了不少问题,有必要整理一下 1.首先下载下weiboSdk,导入weiboSDKD和weiboSDKDemo两个项目,这时发现导入的weiboSDKDemo项 ...
- Winpcap构建用户级网桥
Winpcap构建网桥 根据winpcap sdk中的user-level-bridge用户级网桥 |机器1 | |机器2 | | ...
- [Leetcode][JAVA] Valid Palindrome
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...