[Sciter] Script与Native交互
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(); // instancebool 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 windowsciter::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_MAPFUNCTION_0("helloWorld", helloWorld);FUNCTION_2("native_sum", native_sum); // 后面的2表示有2个参数FUNCTION_0("native_api", native_api);END_FUNCTION_MAPsciter::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] Script与Native交互的更多相关文章
- js与native交互
js与native交互 UIWebView Native调用JS,使用stringByEvaluatingJavaScriptFromString来解释执行js脚本. //script即为要执行的js ...
- [Sciter系列] MFC下的Sciter–3.Sciter脚本与底层交互
[Sciter系列] MFC下的Sciter–3.Sciter脚本与底层交互,脚本调用底层自定义的方法函数. 本系列文章的目的就是一步步构建出一个功能可用,接口基本完善的基于MFC框架的SciterF ...
- Hybrid App: 对比UIWebView和WebKit实现JavaScript与Native交互
一.简介 在前面一篇文章中讲到过实现JavaScript与Native交互的方式有一种就是使用原生内嵌webView.在iOS8之前,开发者只能使用苹果提供的UIWebView类来加载URL或者HTM ...
- React Native交互组件之Touchable
React Native交互组件之Touchable:只要在组件外面包一个Touchable组件就可以实现点击交互. TouchableHighlight:高亮触摸 当点击时,组件的透明度会改变,可以 ...
- 【quickhybrid】H5和Native交互原理
前言 Hybrid架构的核心就是JSBridge交互,而实现这个交互的前提是弄清楚H5和Native端的交互 本文主要介绍Native端(Android/iOS)和H5端(泛指前端)的交互原理 (之前 ...
- 与native交互时会出现的问题
1.jsbridge: 可以用jsbridge与native交互,这属于第三方库,前端后端都需要加jsbridge 2.可以直接调用原生的方法,ios: window.webkit.message ...
- 《React-Native系列》RN与native交互与数据传递
RN怎么与native交互的呢? 下面我们通过一个简单的Demo来实现:RN页面调起Native页面,Native页面选择电话本数据,将数据回传给RN展示. 首先是 Native侧 1.MainAct ...
- 《React-Native系列》3、RN与native交互之Callback、Promise
接着上一篇<React-Native系列>RN与native交互与数据传递,我们接下来研究另外的两种RN与Native交互的机制 一.Callback机制 首先Calllback是异步的, ...
- Android中H5和Native交互的两种方式
Android中H5和Native交互的两种方式:http://www.jianshu.com/p/bcb5d8582d92 注意事项: 1.android给h5页面注入一个对象(WZApp),这个对 ...
随机推荐
- Django考试系统(1)
好久没更过博客了,菜是原罪.毕业设计快做完了,第一次独立做的项目(考试系统),自己摸索着做的,以前学习的好多东西都用上了,但是也都忘了,完成设计的途中又一步步的捡起来了(不知道现在还记没记得).最近着 ...
- MySQL redo log 与 binlog 的区别
MySQL redo log 与 binlog 的区别 什么是redo log 什么是binlog redo log与binlog的区别 1. 什么是redo log? redo log又称重做日志文 ...
- python str.format 中文对齐的细节问题
写了一个练手的爬虫...在输出的时候出现了让人很不愉♂悦的问题 像这样: 令人十分难受啊! #----------------------------------------------------- ...
- 剑指Offer(书):打印从1到最大的n位数
题目:输入数字N,按顺序打印出从1到最大的N位十进制数,比如输入3,则打印出1.2.3一直到999 分析:N的范围不定.所以有可能超出范围,因此用数组存放以及输出.说实话,对复杂递归还是一头雾水 pu ...
- POJ 1611 The Suspects (并查集求数量)
Description Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, wa ...
- 『NYIST』第八届河南省ACM竞赛训练赛[正式赛一]-CodeForces 237C,素数打表,二分查找
C. Primes on Interval time limit per test 1 second memory limit per test 256 megabytes input standar ...
- POJ 2777 Count Color【线段树】
题目大意:要求完成以下两个操作:1.将一个区间刷上一种颜色2.询问一段区间上有多少种颜色 思路:这两个操作线段树都可以很迅速的完成,具体做法是:线段树上每个节点存这个线段上的颜色数量,由于颜色数很少, ...
- 【贪心+二分】codeforces C. Sagheer and Nubian Market
http://codeforces.com/contest/812/problem/C [题意] 如何花最少的钱买最多的纪念品?首要满足纪念品尽可能多,纪念品数量一样花钱要最少,输出纪念品数量以及最少 ...
- oc温习二:基本运算及基本运算符
C语言一共有34种运算符,如下: 运算符分类: 1.按照功能划分: (1)算术运算符 + 加法运算符 - 减法运算符 或者负值运算符 * 乘法运算符 / 除法运算符 % 模运算符,或者取余运算符,要求 ...
- Django学习之 - 基础模板语言
模板语言if/else/endif {% if today_is_weekend %} <p>Welcome to the weekend!</p> {% else %} &l ...