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垂直居 ...
随机推荐
- Oracle 取随机数(转)
1.从表中随机取记录 select * from (select * from staff order by dbms_random.random) where rownum < 4 ...
- AJAX向服务器发送请求
使用 XMLHttpRequest 对象的 open() 和 send() 方法: 方法 描述 open(method,url,async) 规定请求的类型.URL 以及是否异步处理请求. metho ...
- DataGridView的DataGridViewComboBoxColumn列在编辑时自动弹出下拉列表
在DataGridView的CellEnter的事件中添加如下代码即可: if (e.ColumnIndex == dataGridView1.Columns["仓库名"].Ind ...
- UzysAssetsPickerController中文化
self.labelSelectedMedia.text = NSLocalizedStringFromTable(@"Choose a media", @"UzysAs ...
- Pig Latin
function translate(str) { //return str; var list = ['a','e','i','o','u']; if(list.indexOf(str[0]) &g ...
- [转] 在Linux平台使用mhVTL虚拟化磁带库
原文来自:LIUBINGLIN ---- http://blog.itpub.net/23135684/viewspace-1307626/ <在Linux平台安装mhVTL虚拟化磁带库> ...
- Sublime 保存时自动转换tab成空格
笔者最近学习c, c语言的清新代码风格让人眼前一亮,不禁爱上这种写作风格,变量名.等号.常量值之间空格分隔,清爽便于阅读. 于是笔者以此为代码写作规范,查阅自己以前写的java代码,以下用notepa ...
- vs代码段快捷键设置
1 工具->代码段管理器
- ipipe 环境下gpio中断产生死机的信息
------------[ cut here ]------------ WARNING: CPU: 0 PID: ...
- 浏览器对象模型BOM
第二章 浏览器对象模型BOM 1.作用:操作窗口:提供导航对象:提供定位对象:浏览器上方的地址栏:提供跟屏幕相关对象:提供对Cookie的支持 2.根元素:window:代表整个窗口:window,o ...