• [Sciter] 资源引用


    http://www.cnblogs.com/yinxufeng/p/fb343eecda564aa63bce0bdf15709ddf.html

    方式一. 加载外部文件

    SciterLoadFile (HWINDOW hWndSciter, LPCWSTR filename)有两个参数:

    1. hWndSciter:Sciter程序窗口句柄
    2. filename:文件路径/资源路径
    1. ::SciterLoadFile(wnd, L"default.htm");

    这里的default.htm就是一个外部文件,程序运行的时候会在当前路径下寻找并加载该文件

    方式二. 加载内存

    SciterLoadHtml (HWINDOW hWndSciter, LPCBYTE html, UINT htmlSize, LPCWSTR baseUrl)

    方式三. 加载程序内置资源

    还是通过SciterLoadFile来加载,但是需要借助辅助函数。

    1. 在加载资源之前先调用

    1. ::SciterSetCallback(wnd, &SciterCallback, NULL);

    SciterCallback是一个回调函数,接收Sciter所有通知。

    1. UINT SC_CALLBACK SciterCallback(LPSCITER_CALLBACK_NOTIFICATION pns, LPVOID callbackParam)
    2. {
    3. // here are all notifiactions
    4. switch (pns->code)
    5. {
    6. case SC_LOAD_DATA: return DoLoadData((LPSCN_LOAD_DATA)pns);
    7. }
    8. return 0;
    9. }

    SC_LOAD_DATA:就是资源请求通知,处理该通知来获取资源数据

    1. UINT DoLoadData(LPSCN_LOAD_DATA pnmld)
    2. {
    3. LPCBYTE pb = 0; UINT cb = 0;
    4. aux::wchars wu = aux::chars_of(pnmld->uri);
    5. if (wu.like(WSTR("res:*")))
    6. {
    7. // then by calling possibly overloaded load_resource_data method
    8. if (sciter::load_resource_data(ghInstance, wu.start + 4, pb, cb))
    9. ::SciterDataReady(pnmld->hwnd, pnmld->uri, pb, cb);
    10. }
    11. else if (wu.like(WSTR("this://app/*"))) {
    12. // try to get them from archive (if any, you need to call sciter::archive::open() first)
    13. aux::bytes adata = sciter::archive::instance().get(wu.start + 11);
    14. if (adata.length)
    15. ::SciterDataReady(pnmld->hwnd, pnmld->uri, adata.start, adata.length);
    16. }
    17. return LOAD_OK;
    18. }

    DoLoadData:是SDK里面封装好的函数,可以加载两种类型资源:

    1. 以“res:”开头,此类资源就是针对的程序内置资源
    2. 以“this://app/”开头,此类资源是下面要介绍的另外一种SDK自带的blob资源类型

    2 导入资源文件


    注意:资源ID要用字符串

    3 使用资源

    1. // CPP
    2. ::SciterLoadFile(wnd, L"res:default.htm");
    3. // html
    4. <img src="res:go.png">

    注意:res后面的文件名一定要跟ID(字符串DEFAULT)值一样,而不是要跟实际的文件名default2.html一样

    方式3:加载BLOB资源

    前提跟上面一样,要处理SC_LOAD_DATA资源请求通知,并且也已经在DoLoadData函数中实现。
    那么,接下来要做的怎么生成BLOB资源

    1. 将所有资源统一放在项目的res文件夹下

    2. 调用sciter-sdk/bin/packfolder.exe将/res/文件夹下面的内容压缩到resources.cpp

    3. resources.cpp就包含了来自/res/文件夹中的所有资源,并且被压缩成了无符号的字符型 resources[] = { …}; 对应为BOLB类型的资源

    4. 包含resources.cpp

    1. #include "resources.cpp"

    5.在引用资源之前调用sciter:archive实体绑定已经打包好了的资源BLOB对象. 当通过SC_LOAD_DATA标识请求这些资源时,sciter::archive实体就会提供

    1. // bind resources[] (defined in "resources.cpp") with the archive
    2. sciter::archive::instance().open(aux::elements_of(resources));

    6.使用资源

    1. //cpp: 通过"this://app/"方式加载
    2. ::SciterLoadFile(wnd, L"this://app/default.htm");
    3. //html: html自己的引用方式
    4. <img src="go.png">
  • 相关阅读:
    C#-Linq-SelectMany
    C#-Linq-SelectMany
    DI是实现面向切面和面向抽象的前提
    java流程控制之Scanner(2)
    java流程控制之Scanner(1)
    java运算符之三目运算符
    java运算符之位运算
    java运算符之与或非
    java运算符之加减乘除
    java基础语法
  • 原文地址:https://www.cnblogs.com/yinxufeng/p/fb343eecda564aa63bce0bdf15709ddf.html
Copyright © 2020-2023  润新知