认识soui4js(第4篇):定义一个窗口类,响应控件的事件
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篇):定义一个窗口类,响应控件的事件的更多相关文章
- C#中一个窗口是一个类呢,还是一个窗口类的实例呢?(转)
C#中一个窗口是一个类呢,还是一个窗口类的实例呢? 答: 没有一个人说到重点上. 一个窗口,它不是仅仅用一个类可以描述的: 首先,这个窗口的数据类型类型,是从Form类派生下来的,也就是说它的定义是一 ...
- 实验四 (1):定义一个形状类(Shape)方法:计算周长,计算面积
(1)定义一个形状类(Shape)方法:计算周长,计算面积子类:矩形类(Rectangle) :额外的方法:differ() 计算长宽差圆形类(Circle)三角形类(Triangle)正方形类(Sq ...
- 定义一个Rectangle类,该类提供getLength和getWidth方法。
import java.util.Comparator; /** * 定义一个Rectangle类,该类提供getLength和getWidth方法.利用图1-18中的findMax例程编写 * 一种 ...
- java定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个findArea()方法返回圆的面积
需求如下:(1)定义一个Circle类,包含一个double型的radius属性代表圆的半径,一个findArea()方法返回圆的面积. (2)定义一个类PassObject,在类中定义一个方法pri ...
- 定义一个Person类,其中包括:1.定义属性:姓名、年龄、民族作为成员变量。定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化。3.定义多个方法:分别显示相应的属性值,例如getName(){System.out.print("名称="+name+";"); }4.定义一个方法“成长”:实现年龄的增加,每执行一次年龄增加1
题目显示不全,完整题目描述: (1)定义一个Person类,其中包括:1.定义属性:姓名:年龄:民族作为成员变量.定义静态成员变量:人数2.定义构造方法:对成员变量进行初始化.3.定义多个方法:分别显 ...
- Java初学者作业——定义一个计算器类, 实现计算器类中加、 减、 乘、 除的运算方法, 每个方法能够接收2个参数。
返回本章节 返回作业目录 需求说明: 定义一个计算器类, 实现计算器类中加. 减. 乘. 除的运算方法, 每个方法能够接收2个参数. 实现思路: 定义计算器类. 定义计算器类中加.减.乘.除的方法. ...
- 34 异常机制 异常体系结构 Java把异常当做对象来处理 并定义一个基类java.lang.Throwable作为所有异常的超类 Error Exception
异常体系结构 概念 Java把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类. 在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Erro ...
- 【Windows编程】系列第二篇:Windows SDK创建基本控件
在Win32 SDK环境下,怎么来创建常用的那些基本控件呢?我们知道如果用MFC,简单的拖放即可完成大多数控件的创建,但是我们既然是用Windows SDK API编程,当然是从根上解决这个问题,实际 ...
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇
原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇 第三章 为控件添加事件 好了,我们之前以前开发一个控件.而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件. 系列 ...
- ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇
原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇 第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是 ...
随机推荐
- dotnet学习笔记-专题01-异步与多线程-01
专题01 异步 多线程 1. Thread类 1.1 使用Thread创建线程 namespace ConsoleApp1; internal class Program { private stat ...
- python命令行工具之Click
Click 是一个简洁好用的Python模块,它能用尽量少的代码实现漂亮的命令行界面.它不仅开箱即用.还能支持高度自定义的配置. 示例: import click @click.command() @ ...
- Windows下的终端工具-Terminal
文档:https://docs.microsoft.com/zh-cn/windows/terminal/ Windows 终端是一个面向命令行工具和 shell(如命令提示符.PowerShell ...
- uni-app小程序(快手、抖音)getCurrentPages使用坑位记录
前情 uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验也挺棒的,公司项目就是主推uni-app. 坑位 最近在做一个 ...
- 使用 Autofac, MediatR 和 FluentValidator 构建松耦合 ASP.NET Core API 应用
使用 MediatR 和 FluentValidator 1. 创建示例文件夹 Sample 首先,创建示例文件夹 Sample. 2. 创建表示层项目 Web 在示例文件夹 Sample 中,使用标 ...
- 使用 VS Code 徒手构建 PDF 文件
使用 VS Code 徒手构建 PDF 文件 PDF 文件是广泛应用的页面描述文件格式,从本质上讲,文件内部的结构混合使用了文本格式描述和二进制格式描述,对于简单的文件,比如说我们今天要创建的第一个 ...
- Swagger2学习——@ApiImplicitParams注解
@ApiImplicitParams:用在请求的方法上,表示一组参数说明 @ApiImplicitParam:用在@ApiImplicitParams注解中,指定一个请求参数的各个方面 name:参数 ...
- Qt/C++音视频开发67-保存裸流加入sps/pps信息/支持264/265裸流/转码保存/拉流推流
一.前言 音视频组件除了支持保存MP4文件外,同时还支持保存裸流即264/265文件,以及解码后最原始的yuv文件.在实际使用过程中,会发现部分视频文件保存的裸流文件,并不能直接用播放器播放,查阅资料 ...
- Github无法访问解决办法
Github无法访问解决办法 问题描述:网速正常,但是github无法访问. 解决办法: 1.因为Github网址域名更换.查询网站https://ipchaxun.com/ ,例如输入github. ...
- Solution Set - “愿所有罗盘都指向那片海洋”
目录 0.「NOI Simu.」哈希计数 1.「NOI Simu.」运输计划 2.「NOI Simu.」时代的眼泪 3.「Subset」LP 的被动练习 4.「EC Final 2018」「LOJ # ...