soui4js基于soui4设计实现。

首先我们看一下soui4中如何定义一个窗口类。

soui4最基本的窗口类是SHostWnd和SHostDialog,它需要一个布局xml。

假定布局xml在资源包中的位置为:layout:maindlg。

那么soui4中定义一个窗口可以是下面的代码(为了演示方便,这里使用SHostDialog):

SHostDialog dlg("layout:maindlg");
dlg.DoModal(NULL);

在soui4js中,这两个对象被导出为soui4.JsHostWnd, soui4.JsHostDialog。

如果不需要处理窗口消息或者事件,可以使用下面的方法来直接创建窗口:

let dlg = new soui4.JsHostDialog("layout:maindlg");
dlg.DoModal(0);

可以看出来,js的代码和C++代码基本上是一样的。

如果需要处理UI中的事件要如何处理呢?

在C++中,最简单的方法是从SHostDialog继承一个新的对象,然后使用消息或者事件映射表来响应窗口消息及控件的事件。

伪代码如下:

class CDemoDialog : public SHostDialog{
public:
CDemoDialog():SHostDialog("layout:maindlg"){}
//....
protected:
void OnBtnTest(){
SSLOGI()<<"test button click";
}
EVENT_MAP_BEGIN()
EVENT_NAME_COMMAND(L"btn_test", OnBtnTest)
EVENT_MAP_END()
};

EVENT_MAP_BEGIN, EVENT_MAP_END一起构成SHostDialog的事件响应虚函数,从而实现接管事件处理流程。

在js中,用法基本类似:

class OptionDlg extends soui4.JsHostDialog{
constructor(settings){
super("layout:maindlg");
this.onEvt = this.onEvent;//这一行实现事件处理的接管
} onBtnTest(){
console.log("test button click");
}
onEvent(e){
//事件处理函数,e是事件对象,可以使用GetID(),Sender()等来获取id及发送者
let evt_id = e.GetID();
switch(evt_id){
case soui4.EVT_CMD:
if(e.NameFrom()=="btn_test")
this.onBtnTest();
break;
}
}
}

这样就完成了窗口中事件的处理。

窗口消息处理也类似,只需要设定JsHostDialog.onMsg就可以接管消息处理。

SOUI中另一种常见的事件响应方法是事件订阅:

例如下面的代码实现订阅表头的子控件checkbox的点击事件:

 1 void CMainDlg::InitListCtrl()
2 {
3 //找到列表控件
4 SListCtrl *pList=FindChildByName2<SListCtrl>(L"lc_test");
5 if(pList)
6 {
7 //列表控件的唯一子控件即为表头控件
8 SWindow *pHeader=pList->GetWindow(GSW_FIRSTCHILD);
9 //向表头控件订阅表明点击事件,并把它和OnListHeaderClick函数相连。
10 pHeader->GetEventSet()->subscribeEvent(EVT_HEADER_CLICK,Subscriber(&CMainDlg::OnListHeaderClick,this));
11 }
12 }
13
14 //表头点击事件处理函数
15 BOOL CMainDlg::OnListHeaderClick(IEvtArgs *pEvtBase)
16 {
17 //事件对象强制转换
18 EventHeaderClick *pEvt =(EventHeaderClick*)pEvtBase;
19 SHeaderCtrl *pHeader=(SHeaderCtrl*)pEvt->Sender();
20 //从表头控件获得列表控件对象
21 SListCtrl *pList= (SListCtrl*)pHeader->GetParent();
22 //列表数据排序
23 SHDITEM hditem;
24 hditem.mask=SHDI_ORDER;
25 pHeader->GetItem(pEvt->iItem,&hditem);
26 pList->SortItems(funCmpare,&hditem.iOrder);
27 return true;
28 }
29 //以上代码来自soui4 demo

soui4js包含了一个SConnect方法,可以方便的订阅一个窗口的事件:

函数原型下下:

/**
* 将指定IWindow的指定事件对象连接到指定对象的事件处理方法
* @param pObj IWindow窗口
* @param evtId 事件类型
* @param jsThis 处理事件的对象
* @param jsFun 处理事件的方法
*/
export function SConnect(pObj:IWindow,evtId:number,jsThis:object,jsFun:(evt:IEvtArgs)=>boolean):boolean;

因此在js中可以使用下面的代码来实现事件订阅:

class MainDialog extend soui4.JsHostWnd
{
//...
init(){
soui4.SConnect(this.GetIRoot(),soui4.EVT_MENU_CMD,this,this.onMenuCmd);
}
onMenuCmd(e){
let menuCmd = soui4.toEventMenuCmd(e);
return true;
}
//...
}

具体代码,参考 https://github.com/soui4js-app/somine

认识soui4js(第4篇):定义一个窗口类,响应控件的事件的更多相关文章

  1. C#中一个窗口是一个类呢,还是一个窗口类的实例呢?(转)

    C#中一个窗口是一个类呢,还是一个窗口类的实例呢? 答: 没有一个人说到重点上. 一个窗口,它不是仅仅用一个类可以描述的: 首先,这个窗口的数据类型类型,是从Form类派生下来的,也就是说它的定义是一 ...

  2. 实验四 (1):定义一个形状类(Shape)方法:计算周长,计算面积

    (1)定义一个形状类(Shape)方法:计算周长,计算面积子类:矩形类(Rectangle) :额外的方法:differ() 计算长宽差圆形类(Circle)三角形类(Triangle)正方形类(Sq ...

  3. 定义一个Rectangle类,该类提供getLength和getWidth方法。

    import java.util.Comparator; /** * 定义一个Rectangle类,该类提供getLength和getWidth方法.利用图1-18中的findMax例程编写 * 一种 ...

  4. java定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个findArea()方法返回圆的面积

    需求如下:(1)定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个findArea()方法返回圆的面积. (2)定义一个类PassObject,在类中定义一个方法pri ...

  5. 定义一个Person类,其中包括:1.定义属性:姓名、年龄、民族作为成员变量。定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化。3.定义多个方法:分别显示相应的属性值,例如getName(){System.out.print("名称="+name+";"); }4.定义一个方法“成长”:实现年龄的增加,每执行一次年龄增加1

    题目显示不全,完整题目描述: (1)定义一个Person类,其中包括:1.定义属性:姓名:年龄:民族作为成员变量.定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化.3.定义多个方法:分别显 ...

  6. Java初学者作业——定义一个计算器类, 实现计算器类中加、 减、 乘、 除的运算方法, 每个方法能够接收2个参数。

    返回本章节 返回作业目录 需求说明: 定义一个计算器类, 实现计算器类中加. 减. 乘. 除的运算方法, 每个方法能够接收2个参数. 实现思路: 定义计算器类. 定义计算器类中加.减.乘.除的方法. ...

  7. 34 异常机制 异常体系结构 Java把异常当做对象来处理 并定义一个基类java.lang.Throwable作为所有异常的超类 Error Exception

    异常体系结构 概念 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类. 在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Erro ...

  8. 【Windows编程】系列第二篇:Windows SDK创建基本控件

    在Win32 SDK环境下,怎么来创建常用的那些基本控件呢?我们知道如果用MFC,简单的拖放即可完成大多数控件的创建,但是我们既然是用Windows SDK API编程,当然是从根上解决这个问题,实际 ...

  9. ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇

    原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇 第三章 为控件添加事件 好了,我们之前以前开发一个控件.而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件. 系列 ...

  10. ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇

    原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇 第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是 ...

随机推荐

  1. 70 个群都来问我的 AI 日报,是这么做的。

    最近我给 FastGPT 用户交流群里接入了 AI 日报,每天早上 10 点会自动向群里推送 AI 日报,让群里的小伙伴们第一时间了解到昨天 AI 领域都发生了哪些大事. 效果大概是这个样子的: 如果 ...

  2. 【网关开发】Openresty使用cosocket API 发送http与tcp网络请求

    背景 为网关提供健康检查功能时需要对节点发送http或者tcp探活请求.Openresty 提供cosocket来处理非阻塞IO. 实现 跟工程结合在一起,这里简单拼接数据结构 local funct ...

  3. 51单片机入门:LED灯控制(01)

    第一篇博客,博客园注册很久却一直没有好好利用,今天把以前的文章都删掉,就当开个好头吧. 希望在以后的时间中,自己能够认真.努力.珍惜时间. 零基础入门51单片机 单片机(Microcontroller ...

  4. 通过jconsole查看tomcat运行情况的配置方法——基于JDK1.5、Linux(Redhat5.5)、Tomcat6

    由于项目的原因,需要使用jconsole对tomcat进行远程监控,结合网上的资料对配置方法进行了总结. 第一步.配置tomcat 打开%TOMCAT_HOME%/bin下的文件catalina.sh ...

  5. HZNUOJ-1503公路乘车--DP

    题目传送门:https://acm.hznu.edu.cn/OJ/problem.php?id=1503 题解:我们发现后一状态由前一状态决定,即后一公里由前面十公里的状态决定,经典 dp,我们直接列 ...

  6. mongoose 读取表中数据始终返回空值

    在项目中使用MongoDB存取数据,在另一个项目中使用mongoose读取同一数据库中表数据却始终返回空值. 后发现mongoose在创建model时会自动添加"s",而Mongo ...

  7. HWS 2023 山东大学专场 决赛wp

    写在前面: 通过这次比赛,认识到了自己和高手的不足,知识面还需要拓展 1.Re ezapk 因为自己本身不是做逆向的,所以没什么经验,赛后复盘的时候解决了这道题 首先使用apktool将给出的apk文 ...

  8. Spring Cloud Alibaba:一站式微服务解决方案

    一.简介 Spring Cloud Alibaba(简称SCA) 是一个基于 Spring Cloud 构建的开源微服务框架,专为解决分布式系统中的服务治理.配置管理.服务发现.消息总线等问题而设计. ...

  9. solon 集成 rocketmq5 sdk

    使用 rocketmq5 是比较简单的事情.也有些同学对 sdk 原始接口会陌生,会希望有个集成的示例. <dependency> <groupId>org.apache.ro ...

  10. GraphQL Part V: 字段,参数和变量

    字段 我们对字段已经有了好的起点,我们在 HelloWorldQuery 中有两个字段:hello 和 world.他们都是单值字段. 现在我们可以扩展应用来支持复杂类型.例如,我们想象一下,我们在创 ...