文档章节

[Sciter] Script与Native交互

Felix_Yin
 Felix_Yin
发布于 2016/07/08 17:49
字数 624
阅读 143
收藏 0

Script与Native交互基础

1 参照SDK中“plain-win”的例子,自定义一个窗口类,继承自sciter::host< window >sciter::event_handler

class window: public sciter::host<window>
            , public sciter::event_handler
{
  HWND _hwnd;

  static LRESULT CALLBACK    wnd_proc(HWND, UINT, WPARAM, LPARAM);
  static window* ptr(HWND hwnd);
  static bool init_class();
public:

  // notification_handler traits:
  HWND      get_hwnd() const { return _hwnd; }
  HINSTANCE get_resource_instance() const{ return ghInstance; }

  window();
  bool init(); // instance
  bool is_valid() const { return _hwnd != 0; }
};

注意: HWND get_hwnd() const { return _hwnd; } HINSTANCE get_resource_instance() const{ return ghInstance; } 必须要实现,否则host无法获取资源

2 在窗口初始化的时候,通过sciter::attach_dom_event_handler绑定Sciter DOM事件到该窗口上

bool window::init()
{
   SetWindowLongPtr(_hwnd, GWLP_USERDATA, LONG_PTR(this));
   setup_callback();
   // // attach event_handler to the window
   sciter::attach_dom_event_handler(_hwnd, this); 
   load_file(L"res:default.htm");
   return true;
}

简化方式

SDK中已经为每个操作系统平台定义了各自的“主”函数

  • sciter-sdk/include/sciter-win-main.cpp - on Windows
  • sciter-sdk/include/sciter-osx-main.mm - on OS X
  • sciter-sdk/include/sciter-gtk-main.cpp - on Linux

这里我们将sciter-win-main.cpp包含到我们项目中,自定义个窗口类,继承自sciter::window

Script调用Native

在自定义窗口类中,通过类似MFC的消息映射方式来绑定事件处理函数

  BEGIN_FUNCTION_MAP
      FUNCTION_0("helloWorld", helloWorld);
      FUNCTION_2("native_sum", native_sum);       // 后面的2表示有2个参数
      FUNCTION_0("native_api", native_api);
  END_FUNCTION_MAP

  sciter::string  helloWorld() { return L"Hello u-minimal World"; }

  int native_sum(sciter::value a, sciter::value b) { return a.d + b.d; }

  sciter::value native_api() {
    sciter::value api_map;
    sciter::value api_math_map;

    std::function<int(int,int)> native_sum = [](int a, int b) { return a + b; };
    std::function<int(int,int)> native_sub = [](int a, int b) { return a - b; };

    api_math_map.set_item(sciter::value("sum"), sciter::vfunc( native_sum ));
    api_math_map.set_item(sciter::value("sub"), sciter::vfunc( native_sub ));

    api_map.set_item(sciter::value("math"), api_math_map);

    return api_map;
  }

在tiscript中这么调用

<script type="text/tiscript">
    var message = view.helloWorld();
    view.native_sum(a, b);
    view.nativeApi().math.sub(c, d);
</script>

这里的view是全局对象,代表当前运行Sciter的窗口, 他有很多自带的函数,如close(关闭), msgbox(消息框),selectFile(文件选择框),Update等。

FUNCTION_MAP中定义的函数映射,可以通过view来直接调用:view.native_sum(a, b)。

另外有一种方法可以将Native写的函数包装在一起,比如native_api,view在调用的时候,直接使用view.native_api().math.xxx

sciter::value native_api()函数,返回值是一个Map类型,转换成sciter::value,结构类似下面:

return {
  math: {
    sum: {native_sum},
    sub: {native_sub},
  }
}

Native调用Script

比如在script中有这么一个方法:

<script type="text/tiscript">
    namespace Test {
        function add(n1,n2) { return n1+n2; }
    }
</script>

在Native中这么调用:

sciter::dom::element root = self->get_root();
sciter::value r;
try {
    r = root.call_function("Test.add",sciter::value(2),sciter::value(2));
} catch (sciter::script_error& err) {
    std::cerr << err.what() << std::endl;
}

// or sciter::value r = self->call_function("Test.add",sciter::value(2),sciter::value(2));

assert(r.is_int() && r.get(0) == 4);

Test是script中的命名空间 self是当前窗口sciter::host< window >对象实例

© 著作权归作者所有

上一篇: [Sciter] 资源引用
下一篇: [Sciter] 资源引用
Felix_Yin
粉丝 0
博文 2
码字总数 1272
作品 0
扬州
项目经理
私信 提问
加载中

评论(1)

S
Summer0826
这个命名空间是怎么暴露给后台的
Sciter - 多平台嵌入式 HTML/CSS/脚本 UI 引擎

下载 ulayered.zip - 27.9 KB 简介 Sciter 是一个用 HTML/CSS 来渲染现代应用程序 UI 的脚本引擎。 它非常紧凑,简单(只有一个 4~8M 的动态链接库文件 dll/dylib/so),没有其他依赖。它可以...

oschina
2015/01/07
10.9K
13
GoLang sciter 打包html资源

下载安装 go-sciter 包 修改 sciter-x-api.c ,添加如下代码: 修改 sciter.go,添加如下代码: 用sciter自带工具打包 资源: 拷贝cpp内容存为res.go: 编写main.go...

echojson
04/18
0
0
js与native交互

js与native交互 UIWebView Native调用JS,使用来解释执行js脚本。 PS:苹果推荐iOS8之后的app使用来代替 UIWebView,同时也使用方法来替代 stringByEvaluatingJavaScriptFromString,因为会一...

coolwxb
2016/12/02
32
0
请问VC++ 怎样处理DPI才能使界面不发虚?

VisualStudio 2015 界面引擎 Sciter 生成的程序界面发虚,怎样处理?

ZeronoFreya
2016/05/22
392
0
很好用,推荐!

很好用,与 C/C++ Native Code 中的变量、函数、类和模板的绑定非常容易。灵活度也很高(连脚本内建字符串类型和数组、字典等基本容器都可以自定义,当然也可以使用官方默认定义)。 静态类型...

BaiYang
2014/01/10
546
0

没有更多内容

加载失败,请刷新页面

加载更多

利用mybatis generator生成实体类、Mapper接口以及对应的XML文件

项目中通常会遇到数据的持久化,如果是采用mybatis的orm,就会涉及到生成xml的问题,刚好mybatis官网提供了这么个插件MyBatis Generator,效果简直是棒呆。 1. 首先需要在build.gradle文件中...

啊哈关关
今天
2
0
SpringSocial相关的知识点

使用SprigSocial开发第三方登录 核心类 ServiceProvider(AbstractOauth2ServiceProvider):主要负责实现server提供商(例如QQ,微信等共有的东西),默认实现类是AbstractOauth2ServiceProvider...

chendom
今天
1
0
Java并发之AQS详解

一、概述   谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!   类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源...

群星纪元
昨天
2
0
Fabric-sdk-java最新教程

Fabric Java SDK是Fabric区块链官方提供的用于Java应用开发的SDK,全称为Fabric-sdk-java,网上可用资料不多,本文列出了精心整理的针对Fabric Java SDK的最新精选教程。 如果希望快速掌握F...

汇智网教程
昨天
2
0
react 子组件监听props 变化

componentWillReceiveProps //已经被废弃 getDerivedStateFromProps// 推荐使用//如果条件不存在必须要返回null static getDerivedStateFromProps(props, current_stat...

一箭落旄头
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部