認識soui4js(第5篇):使用擴展控件
無論內置控件多么豐富,也不可能滿足用戶所有需求??傆袝r候用戶需要自己擴展控件。
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)。

浙公網安備 33010602011771號