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加载资源相关推荐

  1. Duilib 加载资源文件失败,点击黑屏

    一般是由于删除文件不彻底导致的. 本人电脑由于删除iTv(i搜影垃圾软件)导致的,手动删除后还剩几个文件删不了,开机后提示iTv软件启动失败和加载资源文件失败.可以使用腾讯等的文件粉碎功能把软件文件夹 ...

  2. 在使用Windows 10时,正常开机后Duilib加载资源文件失败

    建议您寻找一台和您相同数位系统的电脑,然后复制一份duilib.dll文件到您的系统中,路径为C:\Windows\system32. 然后在小娜搜索命令提示符,然后鼠标右键一管理员身份打开. 在命令 ...

  3. new File(String Path)加载资源问题

    2017-12-17   15:07:38  [原创-wx] 一.我们在用IO流加载资源的时候,创建文件资源 1 File file = New File("String Path" ...

  4. 关于unity 中使用AssetBundle加载资源,shader偶尔会丢失的问题解决办法

    问题描述: 因为项目中要进行热更新设计,所以用unity官方推荐的打包方式assetbundle进行打包,打包好了以后再电脑上运行正常,但是当发布到android上后发现偶尔场景背景会出现空白,多方查 ...

  5. 无法加载资源,因为“应用程序传输安全性”策略要求使用安全连接

    本文翻译自:The resource could not be loaded because the App Transport Security policy requires the use of ...

  6. 【Android 插件化】Hook 插件化框架 ( 从源码角度分析加载资源流程 | Hook 点选择 | 资源冲突解决方案 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  7. Unity—AssetBundle的打包及四种加载资源方式

    AssetBundle打包:脚本放在Editor文件夹内 具体代码如下: using UnityEditor; using System.IO;public class CreateAssetBund ...

  8. 07_00_加载资源(Webpack Book)

    Loading Assets(加载资源) In this part, you will learn how to load different types of assets using webpac ...

  9. java 根据类名示例化类_如何使用示例从Java中的类路径加载资源

    java 根据类名示例化类 Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容. Java提供了API来将这些资源读取为Input ...

  10. 如何使用示例从Java中的类路径加载资源

    Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容. Java提供了API来将这些资源读取为InputStream或URL. 假设 ...

最新文章

  1. SQl 作业方面(转)
  2. 电子书链接的集合 (不断更新)
  3. linux nginx 清除缓存文件,linux nginx 内置缓存怎么去掉
  4. display属性值
  5. jmeter学习总结
  6. 聊聊rocketmq的FileAppender
  7. RHCE系列之权限管理----ACL(访问控制列表)
  8. 特征提取之文本特征提取
  9. 设计师工作经验_得到我作为设计师的第一份工作
  10. this指向 改变this指向
  11. mysql缓冲和缓存设置
  12. 20162316刘诚昊 课下排序测试
  13. 进程和线程.View椭圆运动
  14. python中用Selenium驱动Edge浏览器的方法
  15. Hybrid——混杂接口
  16. 状态码(Status Codes)
  17. d3.js 旋转图形_北师大版七年级上册数学 ?第一章 ?丰富的图形世界
  18. java spring面试题附pdf答案(最全版本持续更新)
  19. 微信小程序开发笔记 进阶篇②——多个微信小程序一个用户体系,同一个UnionID
  20. Django 搭建博客网站-task00:环境配置

热门文章

  1. 计算机网络性能常见计算公式
  2. volte短信流程-注册
  3. DPCM差分预测编码
  4. 阿里王坚:区块链与数据价值的交换
  5. 计算机播放qq音乐没声音怎么办,Win7电脑中QQ音乐听不了怎么办?
  6. 单片机设计定时器中断服务程序
  7. c语言文学研究助手报告,文学研究助手数据结构报告
  8. 控制工程实践(2)——拉普拉斯变换及传递函数(之拉氏变换)
  9. 地理信息系统概论 黄杏元版 期末复习资料
  10. 行业认证标准:IEC 62304-医疗设备软件安全分类标准