首页 > 其他分享 >认识soui4js(第5篇):使用扩展控件

认识soui4js(第5篇):使用扩展控件

时间:2023-07-06 15:02:57浏览次数:53  
标签:控件 TplSObjectFactory 扩展 js UnregisterObjFactory RegisterObjFactory soui4js pApp

无论内置控件多么丰富,也不可能满足用户所有需求。总有时候用户需要自己扩展控件。

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)

 

标签:控件,TplSObjectFactory,扩展,js,UnregisterObjFactory,RegisterObjFactory,soui4js,pApp
From: https://www.cnblogs.com/setoutsoft/p/17532145.html

相关文章

  • dumpbin工具使用-由zlib编译前缀少加预处理器命令引起的异常-扩展
    对zlib使用vs2019编译,没有在预处理器中加前缀命令,导致编译出来的zlib.dll与项目之前使用的函数名不一致,运行报错。报错信息:无法在DLL“libz64”中找到名为“Z_inflateEnd”的入口点。 在z.conf中有以下注释:/**Ifyou*really*needauniqueprefixforalltypesandl......
  • wpf基本布局控件 -- 01
    <Windowx:Class="WpfApp1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.c......
  • Oracle数据库扩展表空间
    --step1查询当前表空间的使用率selecta.BYTES/a.MAXBYTES*100,a.*fromdba_data_filesawherea.TABLESPACE_NAME='yourtabespacename';--step2扩展表空间并设置自增altertablespace{yourtabespacename} adddatafile'D:\APP\ADMINISTRATOR\ORADATA\AXXXL\......
  • Wpf Grid 控件常用属性
    Grid的网格布局控件,使用网格布局时候需要先确定行数列数。Grid.RowDefinitions设置行<Grid><Grid.RowDefinitions><RowDefinitionHeight="45"/><RowDefinition/><RowDefinitionHeight="20"/>......
  • 雷电4扩展坞HDMI显示器无法睡眠问题
    背景:最近使用Dell的雷电4扩展坞WD22TB4,感觉很爽,取电脑时,不用再拔显示器、鼠标、键盘,直接把雷电4接口拔出即可。后来通过windowsupdate升级了intel显卡驱动后,发现电脑无法睡眠了,一睡眠就死机,只能长按电源键强行关闭电脑。一开始以为是win11问题,升级了一下系统发现也不行。再排......
  • SpringBoot源码初学者(一):SpringBoot功能扩展接口的使用与源码分析
     在长期的源码学习中,我一直没有找到一个讲解SpringBoot源码的文章,适合刚开始阅读源码的新手,包括我之前的写的一些文章,说实话SpringBoot的源码的确不适合新手,跳转多、结构复杂混乱,很容易迷乱其中。长时间的学习当中,也总结出这些文章的部分问题:没有说明用法,直接讲解源码,其实很......
  • 为组态王编写的 时间段 选择 控件 python
    日历控件使用说明这是一个专门为组态软件(如组态王,力控等)设计的时间选择控件,用于选择一个时间段,来进行数据报表的查询.控件实际由2部分组成,1个UI程序,和1个modbusTCP从机服务器.从机服务器用于UI程序和组态软件的通信.  日期部分,时间间隔部分,支持滚轮改变日期......
  • Mac 下的 MxSrvs 安装 PHPzip 的扩展(感觉各种扩展都是这个样子)
    https://my.oschina.net/wgw888/blog/8563131https://blog.csdn.net/unhejing/article/details/107176891 从PHP官网下载一个zip的扩展,wgethttp://pecl.php.net/get/zip然后在下载好的目录下使用:sudo/Applications/MxSrvs/bin/php/bin/peclinstallzip来安装......
  • java http大文件断点续传上传控件
    ​ javaweb上传文件上传文件的jsp中的部分上传文件同样可以使用form表单向后端发请求,也可以使用ajax向后端发请求    1.通过form表单向后端发送请求         <formid="postForm"action="${pageContext.request.contextPath}/UploadServlet"method="post"e......
  • 认识soui4js(第4篇):定义一个窗口类并显示
    soui4js基于soui4设计实现。首先我们看一下soui4中如何定义一个窗口类。soui4最基本的窗口类是SHostWnd和SHostDialog,它需要一个布局xml。假定布局xml在资源包中的位置为:layout:maindlg。那么soui4中定义一个窗口可以是下面的代码(为了演示方便,这里使用SHostDialog):SHostDia......