原帖地址:http://www.cnblogs.com/yinxufeng/p/5653920.html

Script与Native交互基础

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

  1. class window: public sciter::host<window>
  2. , public sciter::event_handler
  3. {
  4. HWND _hwnd;
  5. static LRESULT CALLBACK wnd_proc(HWND, UINT, WPARAM, LPARAM);
  6. static window* ptr(HWND hwnd);
  7. static bool init_class();
  8. public:
  9. // notification_handler traits:
  10. HWND get_hwnd() const { return _hwnd; }
  11. HINSTANCE get_resource_instance() const{ return ghInstance; }
  12. window();
  13. bool init(); // instance
  14. bool is_valid() const { return _hwnd != 0; }
  15. };

注意

HWND get_hwnd() const { return _hwnd; }

HINSTANCE get_resource_instance() const{ return ghInstance; }

必须要实现,否则host无法获取资源

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

  1. bool window::init()
  2. {
  3. SetWindowLongPtr(_hwnd, GWLP_USERDATA, LONG_PTR(this));
  4. setup_callback();
  5. // // attach event_handler to the window
  6. sciter::attach_dom_event_handler(_hwnd, this);
  7. load_file(L"res:default.htm");
  8. return true;
  9. }

简化方式

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的消息映射方式来绑定事件处理函数

  1. BEGIN_FUNCTION_MAP
  2. FUNCTION_0("helloWorld", helloWorld);
  3. FUNCTION_2("native_sum", native_sum); // 后面的2表示有2个参数
  4. FUNCTION_0("native_api", native_api);
  5. END_FUNCTION_MAP
  6. sciter::string helloWorld() { return L"Hello u-minimal World"; }
  7. int native_sum(sciter::value a, sciter::value b) { return a.d + b.d; }
  8. sciter::value native_api() {
  9. sciter::value api_map;
  10. sciter::value api_math_map;
  11. std::function<int(int,int)> native_sum = [](int a, int b) { return a + b; };
  12. std::function<int(int,int)> native_sub = [](int a, int b) { return a - b; };
  13. api_math_map.set_item(sciter::value("sum"), sciter::vfunc( native_sum ));
  14. api_math_map.set_item(sciter::value("sub"), sciter::vfunc( native_sub ));
  15. api_map.set_item(sciter::value("math"), api_math_map);
  16. return api_map;
  17. }

在tiscript中这么调用

  1. <script type="text/tiscript">
  2. var message = view.helloWorld();
  3. view.native_sum(a, b);
  4. view.nativeApi().math.sub(c, d);
  5. </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中有这么一个方法:

  1. <script type="text/tiscript">
  2. namespace Test {
  3. function add(n1,n2) { return n1+n2; }
  4. }
  5. </script>

在Native中这么调用:

  1. sciter::dom::element root = self->get_root();
  2. sciter::value r;
  3. try {
  4. r = root.call_function("Test.add",sciter::value(2),sciter::value(2));
  5. } catch (sciter::script_error& err) {
  6. std::cerr << err.what() << std::endl;
  7. }
  8. // or sciter::value r = self->call_function("Test.add",sciter::value(2),sciter::value(2));
  9. assert(r.is_int() && r.get(0) == 4);

Test是script中的命名空间

self是当前窗口sciter::host< window >对象实例

[Sciter] Script与Native交互的更多相关文章

  1. js与native交互

    js与native交互 UIWebView Native调用JS,使用stringByEvaluatingJavaScriptFromString来解释执行js脚本. //script即为要执行的js ...

  2. [Sciter系列] MFC下的Sciter–3.Sciter脚本与底层交互

    [Sciter系列] MFC下的Sciter–3.Sciter脚本与底层交互,脚本调用底层自定义的方法函数. 本系列文章的目的就是一步步构建出一个功能可用,接口基本完善的基于MFC框架的SciterF ...

  3. Hybrid App: 对比UIWebView和WebKit实现JavaScript与Native交互

    一.简介 在前面一篇文章中讲到过实现JavaScript与Native交互的方式有一种就是使用原生内嵌webView.在iOS8之前,开发者只能使用苹果提供的UIWebView类来加载URL或者HTM ...

  4. React Native交互组件之Touchable

    React Native交互组件之Touchable:只要在组件外面包一个Touchable组件就可以实现点击交互. TouchableHighlight:高亮触摸 当点击时,组件的透明度会改变,可以 ...

  5. 【quickhybrid】H5和Native交互原理

    前言 Hybrid架构的核心就是JSBridge交互,而实现这个交互的前提是弄清楚H5和Native端的交互 本文主要介绍Native端(Android/iOS)和H5端(泛指前端)的交互原理 (之前 ...

  6. 与native交互时会出现的问题

    1.jsbridge:  可以用jsbridge与native交互,这属于第三方库,前端后端都需要加jsbridge 2.可以直接调用原生的方法,ios:  window.webkit.message ...

  7. 《React-Native系列》RN与native交互与数据传递

    RN怎么与native交互的呢? 下面我们通过一个简单的Demo来实现:RN页面调起Native页面,Native页面选择电话本数据,将数据回传给RN展示. 首先是 Native侧 1.MainAct ...

  8. 《React-Native系列》3、RN与native交互之Callback、Promise

    接着上一篇<React-Native系列>RN与native交互与数据传递,我们接下来研究另外的两种RN与Native交互的机制 一.Callback机制 首先Calllback是异步的, ...

  9. Android中H5和Native交互的两种方式

    Android中H5和Native交互的两种方式:http://www.jianshu.com/p/bcb5d8582d92 注意事项: 1.android给h5页面注入一个对象(WZApp),这个对 ...

随机推荐

  1. luogu P1455 搭配购买

    题目描述 明天就是母亲节了,电脑组的小朋友们在忙碌的课业之余挖空心思想着该送什么礼物来表达自己的心意呢?听说在某个网站上有卖云朵的,小朋友们决定一同前往去看看这种神奇的商品,这个店里有n朵云,云朵已经 ...

  2. Memcached的安装和应用

    Memcached的安装 1.安装libeventlibevent是一个事件触发的网络库,适用于windows.linux.bsd等多种平台,内部使用 select.epoll.kqueue等系统调用 ...

  3. PXE自动化安装系统

    准备(以centos7为例) ①关闭防火墙 ②关闭selinux ③dhcp服务设置为静态IP ④安装软件包 http:充当yum源安装包仓库 tftp-server :在它的工作目录存在引导主机的工 ...

  4. 《算法导论》— Chapter 15 动态规划

    序 算法导论一书的第四部分-高级设计和分析技术从本章开始讨论,主要分析高效算法的三种重要技术:动态规划.贪心算法以及平摊分析三种. 首先,本章讨论动态规划,它是通过组合子问题的解而解决整个问题的,通常 ...

  5. JSP菜鸟之困

    我一直想把java一套系统学好... 之前寒假学了android......feel good 大四又把jsp补习了一边.....85 但是苦于没有做过实例..... 暑假学PS之间想恶补一下jsp. ...

  6. linux中的vi命令

    linux的重要的几个命令如下: ①,光标的操作 1,gg,G,nG,:n gg移到文档的开头一行,G移动到最后一行,nG移动到第n行,到指定的行. 2,H,M,L 光标分别移动到这个界面的最上边,中 ...

  7. lr函数之lr_eval_string()函数的使用学习

    lr_eval_string() 函数的主要作用:返回脚本中的一个参数当前的值(从参数中取得对应的值,并且转换为一个字符串). 格式:lr_eval_string("{参数名}") ...

  8. bzoj 3207 花神的嘲讽计划Ⅰ 主席树+hash

    花神的嘲讽计划Ⅰ Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3112  Solved: 1086[Submit][Status][Discuss] ...

  9. BZOJ1739: [Usaco2005 mar]Space Elevator 太空电梯

    n<=400个东西,每个东西有高度<=100,这种东西在堆放过程中不得超过的最大高度<=40000,以及每个东西的个数<=10,求最高能堆多高. 算了下背包复杂度不太对然后开了 ...

  10. 怎么删除"自豪地采用WordPress"

    wordpress刚刚安装完毕,打开默认的主页,会发现底部有这样的一行文字:“自豪地采用WordPress”.当然了,我们做一个网站,不一定需要这些文字,我们可以删除或者修改这些文字.今天,小编就来教 ...