您的位置:首页 > 其它

[Sciter] Script与Native交互

2016-07-08 16:46 465 查看


Script与Native交互基础
简化方式
Script调用Native
Native调用Script

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; }

};

[/code]


注意

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;

}

[/code]

简化方式

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;

}

[/code]

在tiscript中这么调用

<script type="text/tiscript">

var message = view.helloWorld();

view.native_sum(a, b);

view.nativeApi().math.sub(c, d);

</script>

[/code]

这里的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>

[/code]

在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);

[/code]


Test是script中的命名空间

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: