开始

假定您使用向导在d:\jsdemo目录创建一个工程,您也已经安装好了vscode, 那么您应该可以看到下面的界面效果:

工程生成后,主要包含一个soui资源包及一个main.js

要运行这个程序,您需要给vscode安装一个插件:quickjs-debug

由于向导已经自动配置了一个launch.json,

这里,你可在选择vscode菜单中的Run/Start Debugging或者Run/Run Without Debugging来启动soui4js-host.exe来加载这个测试工程。

然后你可以看到下面的效果:

在这个demo中只有一个test按钮,点击该按钮,会弹出一个msgbox。

如果您已经看到上面界面,恭喜,您已经可以开始soui4js的开发了。

切换到main.js的代码,展开OutLine, 我们可以看到整个main.js的代码结构:

主要有3个对象:

g_workDir,这是一个全局变量,标识当前程序的运行路径。

MainDialog, 这是一个继承自soui4.JsHostWnd主界面窗口。

main, 这是main.js的入口函数。

main函数功能:

 1 function main(inst,workDir,args)
2 {
3 soui4.log(workDir);
4 g_workDir = workDir;
5 let theApp = soui4.GetApp();
6 let souiFac = soui4.CreateSouiFactory();
7 //*
8 let resProvider = souiFac.CreateResProvider(1);
9 soui4.InitFileResProvider(resProvider,workDir + "\\uires");
10 //*/
11 /*
12 // show how to load resource from a zip file
13 let resProvider = soui4.CreateZipResProvider(theApp,workDir +"\\uires.zip","souizip");
14 if(resProvider === 0){
15 soui4.log("load res from uires.zip failed");
16 return -1;
17 }
18 //*/
19 let resMgr = theApp.GetResProviderMgr();
20 resMgr.AddResProvider(resProvider,"uidef:xml_init");
21 resProvider.Release();
22 let hwnd = soui4.GetActiveWindow();
23 let hostWnd = new MainDialog();
24 hostWnd.Create(hwnd,0,0,0,0);
25 hostWnd.SendMessage(0x110,0,0);//send init dialog message.
26 hostWnd.ShowWindow(soui4.SW_SHOWNORMAL);
27 souiFac.Release();
28 let ret= theApp.Run(hostWnd.GetHwnd());
29 hostWnd=null;
30 soui4.log("js quit");
31 return ret;
32 }
33
34 globalThis.main=main;

main函数代码基本上是固定的,没有特殊要求的情况下,可以不需要修改。

它的功能就是从资源包路径(或者zip包,见注释部分代码)创建一个soui资源包,然后交给theApp管理。

再从MainDialog创建一个窗口对象并显示。

再调用theApp.Run来运行程序的消息循环。

最后退出程序。

main函数后面需要有一行globalThis.main = main, 这样soui4js-host.exe才能通过全局对象找到这个函数并执行。

MainDialog方法介绍:

constructor(){
super("layout:dlg_main");
this.onEvt = this.onEvent;
}

MainDialog的基类soui4.JsHostWnd的构造函数需要一个参数:布局文件的资源ID,因此在MainDialog的构造里需要把这个数据传递给基类。

此外,还在构造函数中指定了使用MainDialog的onEvent方法来处理窗口的事件。

1     onEvent(e){
2 if(e.GetID()==soui4.EVT_INIT){//event_init
3 this.init();
4 }else if(e.GetID()==soui4.EVT_EXIT){
5 this.uninit();
6 }
7 return false;
8 }

onEvent方法有一个参数e, 这个参数是soui的事件对象。通过e.GetID来识别是哪一种事件。

这里处理了两个事件:soui4.EVT_INIT, soui4.EVT_EXIT

这两个事件分别在界面元素创建完成及窗口退出前触发。

1     init(){
2 console.log("init");
3 soui4.SConnect(this.FindIChildByName("btn_test"),soui4.EVT_CMD,this,this.onBtnTest);
4 }

init方法只干了一件事:使用soui4.FindIChildByName("btn_test"), 找到布局文件里配置的name为btn_test的按钮,并且将它产生的soui4.EVT_CMD事件(点击事件)和this.onBtnTest方法相关联。

也就是说这个按钮按下后,执行this.onBtnTest。

1     uninit(){
2 //do uninit.
3 console.log("uninit");
4 }

uninit目前只打印了一行日志。

1     onBtnTest(e){
2 console.log("you click test button");
3 soui4.SMessageBox(this.GetHwnd(),"you click test button","test",soui4.MB_OK);
4 }

onBtnTest中,调用soui4.SMessageBox来显示一个msgbox。

代码调试:

写代码离不开调试,好在quickjs已经提供了调试支持,配合vscode的quickjs debugger插件就可以断点,调试。

我们可以在调试运行前或者运行过程中在代码行设置断点。

假定我们在onBtnTest里断点,点击test按钮,程序在断点中断。

从界面上可以看到程序的调用栈及当前的局部及全局变量的值。

需要注意的下,目前这个调试功能还不完美,仅仅是能用,部分操作可能会导致host崩溃。不过问题不大,已经足可能应对我们一般的代码调试需求。

到这里你应该已经基本了解了soui4js的开发流程了。

认识soui4js(第2篇):代码编辑及调试的更多相关文章

  1. Eclipse常用快捷键之代码编辑篇

    Eclipse是Java开发常用的IDE工具,熟练使用快捷键可以提高开发效率,使得编码工作事半功倍,下面介绍几种常用的代码编辑和补全工具 重命名快捷键:Alt+Shift+R 可用于类名,方法名,属性 ...

  2. 本地GoLand编辑与调试远端服务器上的代码

    Goland是专为Go开发人员构建的跨平台IDE,功能非常强大,拥有强大的代码洞察力,帮助所有Go开发人员即时错误检测和修复建议,快速和安全的重构,一步撤销,智能代码完成,死代码检测和文档提示,让您创 ...

  3. Adobe Dreamweaver代码编辑

    Adobe Dreamweaver 同义词 DW(Adobe Dreamweaver的缩写)一般指Adobe Dreamweaver Adobe Dreamweaver,简称“DW”,中文名称 &qu ...

  4. 花了一年时间完成的 在线G代码编辑,加工系统 G-Code Editor V1.0

    G代码是数控程序中的加工指令.一般都称为G指令.可以直接用来驱动机床,各种控制系统.是一种数控行业标准.传统的G代码编写以及编辑无法在线编辑,也不能实时看到g代码编辑的最后加工路径已经不能直接对编辑的 ...

  5. 推荐一款优秀的代码编辑软件--Source Insight

    “工欲善其事,必先利其器”,好的工具能够提高我们办事的效率,进而提升团队乃至企业的竞争力. 对于软件开发工程师来说,选择一款优秀的代码编辑软件也是很重要的.最近,我看到有很多同事还在用微软的VC ++ ...

  6. 关于设置Visaul Studio 2010 代码编辑界面背景的方法

    1.打开代码编辑界面: 2.找到工具--选项: 3.打开选项后选中纯文本--项背景色: 4.点击自定义,找到自己需要的颜色: [注]: “项前景色”即代码的颜色: “项背景色”即背景颜色. 设置好后, ...

  7. VS2015提示:未安装Style的Visual Studio语言支持,代码编辑Intellisense将不可用。服务器控件的标记Intellisense可能不起作用

    一.问题 最近在VS2015打开文件,提示未安装Style的Visual Studio语言支持,代码编辑Intellisense将不可用.服务器控件的标记Intellisense可能不起作用. Int ...

  8. C++入职学习篇--代码规范(持续更新)

    C++入职学习篇--代码规范(持续更新) 一.头文件规范 在头文件中大家一般会定义宏.引入库函数.声明.定义全局变量等,在设计时最后进行分类,代码示范(自己瞎琢磨的,请多多指点): #ifndef T ...

  9. VS2017 无法修改代码编辑区的项背景颜色问题

    以前都是好好的,安装  ClaudiaIDE: https://github.com/buchizo/ClaudiaIDE 之后也没啥问题,用着用着代码编辑区自定义的颜色就没有了,好几台电脑都是这样, ...

  10. visual studio 2005/2010/2013/2015/2017 vc++ c#代码编辑常用快捷键-代码编辑器的展开和折叠

    visual studio 2005/2010/2013/2015/2017 vc++ c#代码编辑快捷键-代码编辑器的展开和折叠 VS2015代码编辑器的展开和折叠代码确实很方便和实用.以下是展开代 ...

随机推荐

  1. python 爬虫基本玩法,统计杭电oj题目正确率并排序

    python爬虫主要用两个库:Urllib和BeautifulSoup4.一个用来爬取网页,一个用来解析网页. Urllib是Python内置的HTTP请求库,它包含四个模块: 1.request,最 ...

  2. flask+APScheduler定时任务的使用

    目录 APScheduler简介 安装 add_job参数详解 结合flask使用 用uwsgi启动项目 用gunicorn+gevent启动flask项目 APScheduler简介 APSched ...

  3. 使用 spring stream 发送消息

    为什么使用spring stream ? spring stream 是用来做消息队列发送消息使用的.他隔离了各种消息队列的区别,使用统一的编程模型来发送消息. 目前支持: rabbitmq kafk ...

  4. 规模法则(Scaling Law)与参数效率的提高,

    上一篇:<人工智能大语言模型起源篇(三),模型规模与参数效率> 规模法则与效率提高 如果你想了解更多关于提高变换器效率的各种技术,我推荐阅读2020年的<Efficient Tran ...

  5. COSBrowser文件链接导出——爆赞的本地化管理功能

    前言 ​ 用过COSBrowser的小伙伴们应该都知道,COSBrowser的文件分享功能非常好用.但是,文件分享功能又有所局限,就是它只能分享单个文件,而文件夹分享,更有其因为部分必要因素,如安全性 ...

  6. vba interpreter 结束

    https://github.com/inshua/vba-interpreter 已覆盖几乎 VB 所有的特性,只是库还不够全. VB 语言自身较为落后,语法也有诸多设计不当.最严重的莫过于函数和数 ...

  7. 关于在Rocky linux下安装dotnet sdk不成功的问题

    Rocky Linux 9,运行 dnf install -y dotnet-sdk-6.0 一切正常,运行起来非常顺利,安装完毕.但是非常诡异,运行 dotnet --list-sdks dotne ...

  8. 【Rive】波动文字

    1 前言 ​ 本文将使用文本修改器(Text Modifiers)做文字动画,实现文字波动效果. ​ 按以下步骤可以创建一个 Modifier Group 和 Range. ​ 部分参数的释义如下. ...

  9. Qt/C++编写视频监控系统82-自定义音柱显示

    一.前言 通过音柱控件实时展示当前播放的声音产生的振幅的大小,得益于音频播放组件内置了音频振幅的计算,可以动态开启和关闭,开启后会对发送过来的要播放的声音数据,进行运算得到当前这个音频数据的振幅,类似 ...

  10. Qt编写地图综合应用10-点聚合

    一.前言 点聚合在地图相关应用中比较常用,比如在地图上查询结果通常以标记点的形式展现,但是如果标记点较多,不仅会大大增加客户端的渲染时间,让客户端变得很卡,而且会让人产生密集恐惧症,密密麻麻的一大堆点 ...