duilib加载资源
duilib给我提供了4中加载资源的方式:
1、直接读xml文件
2、读zip资源压缩包
3、读rc资源
4、读dll中的rc资源
前三种方法比较简单,稍微复杂点的方法3,在demo里面都有。
方法4,其实和方法3差不多,在铅笔君和黎明的马蹄声帮助下,大致搞明白是怎么回事了。
现在就把这个技巧写下来把:
1、制作dll资源包
把资源打包成zip,然后添加资源,资源名为ZIPRES,然后编译成动态库
2、duilib调用dll资源
WindowImplBase已经实现了接口,那我们的窗口就继承WindowImplBase吧。
实现GetResourceID
1
2
3
4
|
LPCTSTR CMyDialog::GetResourceID() const
{
return MAKEINTRESOURCE(104);
}
|
104对应的是dll里面,zip资源的ID
实现GetResourceType
1 UILIB_RESOURCETYPE CMyDialog::GetResourceType() const 2 { 3 return UILIB_ZIPRESOURCE; 4 }
然后再main里面添加
HINSTANCE hDll = ::LoadLibrary(_T("DllResource.dll"));
if (hDll)
{
CPaintManagerUI::SetResourceDll(hDll);
}
好了,我们的窗口就可以调用dll里面的资源了。
这几个方法都在WindowImplBase::OnCreate(...)里面
1 LRESULT WindowImplBase::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 2 { 3 LONG styleValue = ::GetWindowLong(*this, GWL_STYLE); 4 styleValue &= ~WS_CAPTION; 5 ::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN); 6 7 RECT rcClient; 8 ::GetClientRect(*this, &rcClient); 9 ::SetWindowPos(*this, NULL, rcClient.left, rcClient.top, rcClient.right - rcClient.left, \ 10 rcClient.bottom - rcClient.top, SWP_FRAMECHANGED); 11 12 m_PaintManager.Init(m_hWnd); 13 m_PaintManager.AddPreMessageFilter(this); 14 15 CDialogBuilder builder; 16 if (m_PaintManager.GetResourcePath().IsEmpty()) 17 { // 允许更灵活的资源路径定义 18 CDuiString strResourcePath=m_PaintManager.GetInstancePath(); 19 strResourcePath+=GetSkinFolder().GetData(); 20 m_PaintManager.SetResourcePath(strResourcePath.GetData()); 21 } 22 23 switch(GetResourceType()) 24 { 25 case UILIB_ZIP: 26 m_PaintManager.SetResourceZip(GetZIPFileName().GetData(), true); 27 break; 28 case UILIB_ZIPRESOURCE: 29 { 30 HRSRC hResource = ::FindResource(m_PaintManager.GetResourceDll(), GetResourceID(), _T("ZIPRES")); 31 if( hResource == NULL ) 32 return 0L; 33 DWORD dwSize = 0; 34 HGLOBAL hGlobal = ::LoadResource(m_PaintManager.GetResourceDll(), hResource); 35 if( hGlobal == NULL ) 36 { 37 #if defined(WIN32) && !defined(UNDER_CE) 38 ::FreeResource(hResource); 39 #endif 40 return 0L; 41 } 42 dwSize = ::SizeofResource(m_PaintManager.GetResourceDll(), hResource); 43 if( dwSize == 0 ) 44 return 0L; 45 m_lpResourceZIPBuffer = new BYTE[ dwSize ]; 46 if (m_lpResourceZIPBuffer != NULL) 47 { 48 ::CopyMemory(m_lpResourceZIPBuffer, (LPBYTE)::LockResource(hGlobal), dwSize); 49 } 50 #if defined(WIN32) && !defined(UNDER_CE) 51 ::FreeResource(hResource); 52 #endif 53 m_PaintManager.SetResourceZip(m_lpResourceZIPBuffer, dwSize); 54 } 55 break; 56 } 57 58 CControlUI* pRoot=NULL; 59 if (GetResourceType()==UILIB_RESOURCE) 60 { 61 STRINGorID xml(_ttoi(GetSkinFile().GetData())); 62 pRoot = builder.Create(xml, _T("xml"), this, &m_PaintManager); 63 } 64 else 65 pRoot = builder.Create(GetSkinFile().GetData(), (UINT)0, this, &m_PaintManager); 66 ASSERT(pRoot); 67 if (pRoot==NULL) 68 { 69 MessageBox(NULL,_T("加载资源文件失败"),_T("Duilib"),MB_OK|MB_ICONERROR); 70 ExitProcess(1); 71 return 0; 72 } 73 m_PaintManager.AttachDialog(pRoot); 74 m_PaintManager.AddNotifier(this); 75 76 InitWindow(); 77 return 0; 78 }
好了,就这样了
duilib加载资源相关推荐
- Duilib 加载资源文件失败,点击黑屏
一般是由于删除文件不彻底导致的. 本人电脑由于删除iTv(i搜影垃圾软件)导致的,手动删除后还剩几个文件删不了,开机后提示iTv软件启动失败和加载资源文件失败.可以使用腾讯等的文件粉碎功能把软件文件夹 ...
- 在使用Windows 10时,正常开机后Duilib加载资源文件失败
建议您寻找一台和您相同数位系统的电脑,然后复制一份duilib.dll文件到您的系统中,路径为C:\Windows\system32. 然后在小娜搜索命令提示符,然后鼠标右键一管理员身份打开. 在命令 ...
- new File(String Path)加载资源问题
2017-12-17 15:07:38 [原创-wx] 一.我们在用IO流加载资源的时候,创建文件资源 1 File file = New File("String Path" ...
- 关于unity 中使用AssetBundle加载资源,shader偶尔会丢失的问题解决办法
问题描述: 因为项目中要进行热更新设计,所以用unity官方推荐的打包方式assetbundle进行打包,打包好了以后再电脑上运行正常,但是当发布到android上后发现偶尔场景背景会出现空白,多方查 ...
- 无法加载资源,因为“应用程序传输安全性”策略要求使用安全连接
本文翻译自:The resource could not be loaded because the App Transport Security policy requires the use of ...
- 【Android 插件化】Hook 插件化框架 ( 从源码角度分析加载资源流程 | Hook 点选择 | 资源冲突解决方案 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- Unity—AssetBundle的打包及四种加载资源方式
AssetBundle打包:脚本放在Editor文件夹内 具体代码如下: using UnityEditor; using System.IO;public class CreateAssetBund ...
- 07_00_加载资源(Webpack Book)
Loading Assets(加载资源) In this part, you will learn how to load different types of assets using webpac ...
- java 根据类名示例化类_如何使用示例从Java中的类路径加载资源
java 根据类名示例化类 Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容. Java提供了API来将这些资源读取为Input ...
- 如何使用示例从Java中的类路径加载资源
Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容. Java提供了API来将这些资源读取为InputStream或URL. 假设 ...
最新文章
- SQl 作业方面(转)
- 电子书链接的集合 (不断更新)
- linux nginx 清除缓存文件,linux nginx 内置缓存怎么去掉
- display属性值
- jmeter学习总结
- 聊聊rocketmq的FileAppender
- RHCE系列之权限管理----ACL(访问控制列表)
- 特征提取之文本特征提取
- 设计师工作经验_得到我作为设计师的第一份工作
- this指向 改变this指向
- mysql缓冲和缓存设置
- 20162316刘诚昊 课下排序测试
- 进程和线程.View椭圆运动
- python中用Selenium驱动Edge浏览器的方法
- Hybrid——混杂接口
- 状态码(Status Codes)
- d3.js 旋转图形_北师大版七年级上册数学 ?第一章 ?丰富的图形世界
- java spring面试题附pdf答案(最全版本持续更新)
- 微信小程序开发笔记 进阶篇②——多个微信小程序一个用户体系,同一个UnionID
- Django 搭建博客网站-task00:环境配置