认识soui4js(第5篇):使用扩展控件
无论内置控件多么丰富,也不可能满足用户所有需求。总有时候用户需要自己扩展控件。
soui4js推荐使用C++来扩展控件,然后通过实现一个js模块来提供js使用。
扩展控件通常涉及到图形上下文的频繁交互,如果使用js来实现,效率上会大打折扣。使用C++,没了C++和js的相互调用。使用起来就和C++版本没有区别了。
相对于浏览器中全部使用js来操作cavas, soui4js提供的这种方案即有C++的高效又有js的灵活。
如果用户了解soui中如何扩展控件,就会知道使用C++实现好一个控件后,需要将这个新控件注册到soui系统中。
如何开发js扩展模块参见:认识soui4js(第3篇):使用C/C++开发扩展模块
同样的,由于js的扩展模块的init,uninit方法获取不到soui4的IApplication对象,我们需要给这个扩展模块导出两个方法到js,示例代码如下:
using namespace SOUI;
void RegisterCtrls(IApplication* pApp) {
pApp->RegisterObjFactory(&TplSObjectFactory<SProgressRing>());
pApp->RegisterObjFactory(&TplSObjectFactory<SRatingBar>());
pApp->RegisterObjFactory(&TplSObjectFactory<SAniWindow>());
pApp->RegisterObjFactory(&TplSObjectFactory<SChatEdit>());
pApp->RegisterObjFactory(&TplSObjectFactory<SCheckBox2>());
pApp->RegisterObjFactory(&TplSObjectFactory<SGroupList>());
pApp->RegisterObjFactory(&TplSObjectFactory<SHexEdit>());
pApp->RegisterObjFactory(&TplSObjectFactory<SRoundWnd>());
pApp->RegisterObjFactory(&TplSObjectFactory<SScrollText>());
pApp->RegisterObjFactory(&TplSObjectFactory<SPropertyGrid>());
pApp->RegisterObjFactory(&TplSObjectFactory<SScrollSubtitles>());
pApp->RegisterObjFactory(&TplSObjectFactory<SVText>());
pApp->RegisterObjFactory(&TplSObjectFactory<SIECtrl>());
} void UnregisterCtrls(IApplication* pApp) {
pApp->UnregisterObjFactory(&TplSObjectFactory<SProgressRing>());
pApp->UnregisterObjFactory(&TplSObjectFactory<SRatingBar>());
pApp->UnregisterObjFactory(&TplSObjectFactory<SAniWindow>());
pApp->UnregisterObjFactory(&TplSObjectFactory<SChatEdit>());
pApp->UnregisterObjFactory(&TplSObjectFactory<SCheckBox2>());
pApp->UnregisterObjFactory(&TplSObjectFactory<SGroupList>());
pApp->UnregisterObjFactory(&TplSObjectFactory<SHexEdit>());
pApp->UnregisterObjFactory(&TplSObjectFactory<SRoundWnd>());
pApp->UnregisterObjFactory(&TplSObjectFactory<SScrollText>());
pApp->UnregisterObjFactory(&TplSObjectFactory<SPropertyGrid>());
pApp->UnregisterObjFactory(&TplSObjectFactory<SScrollSubtitles>());
pApp->UnregisterObjFactory(&TplSObjectFactory<SVText>());
pApp->UnregisterObjFactory(&TplSObjectFactory<SIECtrl>());
} extern "C"
__declspec(dllexport) JSModuleDef* js_init_module(JSContext* ctx, const char* module_name)
{
qjsbind::Context* context = qjsbind::Context::get(ctx);
qjsbind::Module *module = context->NewModule(module_name);
module->ExportFunc("RegisterCtrls", RegisterCtrls);
module->ExportFunc("UnregisterCtrls", UnregisterCtrls);
Exp_Ctrls(module);
return module->module();
}
上述代码来自xliveplayer的扩展控件模块。
该模块导出了两个方法:
RegisterCtrls,UnregisterCtrls
这样,在导入该模块后,在main函数中调用这两个方法。就可以在xml中使用这些扩展控件了。
import * as extctrl from "extctrl.dll"; //... var g_WordDir;
function main(inst,workDir,args)
{
soui4.log(workDir);
g_WordDir = workDir;
let theApp = soui4.GetApp();
let souiFac = soui4.CreateSouiFactory();
let trMgr = soui4.CreateTranslatorMgr();
if(trMgr!=0){
theApp.SetTranslator(trMgr);
trMgr.Release();
}
let logMgr = soui4.CreateLogMgr();
if(logMgr != 0){
theApp.SetLogManager(logMgr);
logMgr.setLoggerName("xliveplayer");
logMgr.start();
}
let resProvider = souiFac.CreateResProvider(1);
soui4.InitFileResProvider(resProvider,workDir + "\\uires");
extctrl.RegisterCtrls(theApp);
let resMgr = theApp.GetResProviderMgr();
resMgr.AddResProvider(resProvider,"uidef:xml_init");
resProvider.Release();
let hwnd = soui4.GetActiveWindow();
let hostWnd = new CMainDlg("xml\\dlg_main.xml");
hostWnd.Create(hwnd,0,0,0,0);
hostWnd.SendMessage(0x110,0,0);//send init dialog message.
hostWnd.ShowWindow(1); //1==SW_SHOWNORMAL
souiFac.Release();
let ret= theApp.Run(hostWnd.GetHwnd());
extctrl.UnregisterCtrls(theApp);
soui4.log("js quit");
if(logMgr!=0){
logMgr.stop();
logMgr.Release();
}
return ret;
}
完整代码参见 soui4js-app/xliveplayer: 基于soui4js实现的在线直播视频播放器 (github.com)。
认识soui4js(第5篇):使用扩展控件的更多相关文章
- 多年前写的文本框扩展控件(有ValueChanging事件等),已放github
本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 阅读目录 介绍 起因 代码 使用 GitHub ...
- JavaFX的扩展控件库ControlsFX介绍
声明: 本博客文章原创类别的均为个人原创,版权所有.转载请注明出处: http://blog.csdn.net/ml3947,另外本人的个人博客:http://www.wjfxgame.com. ...
- WPF自定义控件(三)の扩展控件
扩展控件,顾名思义就是对已有的控件进行扩展,一般继承于已有的原生控件,不排除继承于自定义的控件,不过这样做意义不大,因为既然都自定义了,为什么不一步到位呢,有些不同的需求也可以通过此来完成,不过类似于 ...
- 2.C#Panel扩展控件
1.解决方案下添加新建项目新建类库 2. 在项目下添加新建项选择新建组件类 3.先引用,然后导入两个命名空间 4.因为是扩展控件,把继承自Component改成继承自Panel using Syste ...
- Cesium应用篇:3控件(4)Geocoder
Geocoder是一个非常简单的控件,但也是非常常用且实用的控件,顾名思义,Geocoder就是地理编码的意思,而平常我们经常会查询一些地物,也就是常用的POI搜索,就是Geocoder的功劳. 首先 ...
- Cesium应用篇:3控件(2)BaseLayerPicker
所有范例均在github中搜索:ExamplesforCesium BaseLayerPicker控件非常简单,似乎没什么可说的,确实非常的简单,但作为一个底图选择控件,可以说是最基本的一个控件. C ...
- Cesium应用篇:3控件(3)SelectionIndicator& InfoBox
假设这样一个场景,用户在Cesium球上加载了一个GeoJson文件(DataSource),里面是全美国所有州的Geometry信息(Entity),叠加到球面后,你自然会有一种冲动,点击某一个州, ...
- Cesium应用篇:3控件(5)CesiumInspector
CesiumInspector控件并不是带来太多功能上的,但对开发人员来说,对于了解Cesium的渲染效果以及性能调优,还是一个很有价值的控件,特别是一些渲染状态下的问题,采用该控件,应该还是会有很多 ...
- iOS开发UI篇—手写控件,frame,center和bounds属性
iOS开发UI基础—手写控件,frame,center和bounds属性 一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4 ...
- 验证控件插图扩展控件ValidatorCalloutExtender(用于扩展验证控件)和TextBoxWatermarkExtender
<asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptMan ...
随机推荐
- 【一步步开发AI运动小程序】六、人体骨骼图绘制
随着人工智能技术的不断发展,阿里体育等IT大厂,推出的"乐动力"."天天跳绳"AI运动APP,让云上运动会.线上运动会.健身打卡.AI体育指导等概念空前火热.那 ...
- 国产数据库oceanBbase,达梦,金仓与mysql数据库的性能对比 四、python读mysql写入达梦数据库
一.说明 安装达梦的驱动 pip install dmPython==2.5.5 参数接收那里,其他数据库都是用%,达梦要用? 二.源码 #coding=utf-8 import pymysql im ...
- php使用汉字作为进制转换
突然想到英文字符26个,大小写共52个,数字10个,加起来也不过62,再算上特殊字符,也就90个,可以看这篇文章 那可不可以扩大这个进制呢?我想到了汉字. 中文汉字,博大精深,我们就用常用汉字2500 ...
- bootstrap模态框modal和select2合用时input无法获取焦点
场景:bootstrap模态框modal和select2合用时input无法获取焦点,导致输入法一直闪动,不能输入中文 解决办法: 1.把页面中的 tabindex="-1" 删掉 ...
- ZAFU五月多校合训
B. 进制 jbgg 今天在幼儿园学了进制转换,现在 jbgg 有一个十进制正整数 \(x\),jbgg 好奇是否存在这样一个进制 \(p\),使得 \(x\) 在 \(p\) 进制表示下的各个位上的 ...
- 1分钟学会如何提升PCIe通信速率,基于RK3568J + FPGA国产平台!
测试数据汇总 表 1 PCIe总线介绍 PCIe,即PCI-Express(peripheral component interconnect express)是一种高速串行计算机扩展总线标准.主要用 ...
- Mac m1 安装 Homebrew
Homebrew 是 Mac 的包管理器,类似于 Linux 中的 apt,Windows 中的 choco. 自从 M1 芯片发布,Homebrew 正在积极适配新架构,如今已经有了原生支持 ARM ...
- 基于ESP32的桌面小屏幕实战[4]:硬件设计之PCB Layout
1. PCB Layout 步骤 生成PCB 确定PCB layout规范 绘制板框尺寸 布局 布局规范: 按电气性能合理分区,一般分为:数字电路区(即怕干扰.又产生干扰).模拟电路区(怕干扰).功率 ...
- 为什么推荐在 .NET 中使用 YAML 配置文件
在现代应用开发中,配置管理是一个非常重要的部分.随着微服务.容器化和云原生架构的流行,使用简单.易读的配置格式变得尤为重要.在 .NET 开发中,虽然 JSON 是默认的配置文件格式,但 YAML(& ...
- 【Mybatis】学习笔记02:实现简单的查
Mybatis02:简单的查 如果你没先去学 增删改 ,然后直接看这篇记录,我想会有些困难.因为该文写的很粗劣,只是简单的截图.所以没基础的建议先去看 [Mybatis]学习笔记01:连接数据库,实现 ...