首先使用SOUI的向导建立一个工程

需要注意以下几点:

首先要包含 notifycenter.h这个头文件,这个头文件工程默认是不会添加的,验证方法使用SNotifyCenter在程序的任何一个地方会出现红色的下划线表示没有包含

常规普通模式下的中心事件 作用在目标窗口上的,注意目标窗口需要继承public TAutoEventMapReg<类名> 这样就可以自动注册这个事件中心

两种常规的处理方式(消息映射方式)

1.EVENT_HANDLER(cd,func) //cd:表示事件的ID func:处理事件的函数

2.EVENT_NAME_HANDLER(id,cd,func) //id:表示该条中心消息事件的ID(定义在调用方那边的头文件中) cd:表示事件的ID func:处理事件的函数

下面开始实际的例子 使用中心事件中的 异步通讯方式 和 同步通讯方式

需求:在子窗口中点击按钮,使主窗口的控件得到一个变化

实现步骤:

Step 1: 首先包含notifycenter.h头文件 包含在 stdafx.h中这样就可以整个工程使用 SNotifycenter了,然后在工程的入口函数中 添加

SNotifyCenter *pNotifycenter = new SNotifyCenter;        //添加的部分// BLOCK: Run application{CMainDlg dlgMain;dlgMain.Create(GetActiveWindow());dlgMain.SendMessage(WM_INITDIALOG);dlgMain.CenterWindow(dlgMain.m_hWnd);dlgMain.ShowWindow(SW_SHOWNORMAL);nRet = theApp->Run(dlgMain.m_hWnd);}delete pNotifycenter;      //添加的部分// BLOCK: Run application{CMainDlg dlgMain;dlgMain.Create(GetActiveWindow());dlgMain.SendMessage(WM_INITDIALOG);dlgMain.CenterWindow(dlgMain.m_hWnd);dlgMain.ShowWindow(SW_SHOWNORMAL);nRet = theApp->Run(dlgMain.m_hWnd);}delete pNotifycenter;

黄色的部分,进行添加

Step 2: 创建一个模态对话框需要注意以下问题

-》创建的窗口继承的类是 SHostDialog这个类,并且在构造函数中进行XML文件的初始化

-》在需要创建窗口的地方 使用类的对象来调用DoModal就可以实现一个模态窗口的创建了,具体的属性设置,可以参照主窗口的XML文件配置

Step 3: 来编写需要创建事件的一个类 来测试使用同步或异步事件

//创建一个类 来包含自定义的事件
namespace SOUI
{
#define EVT_TESTEVENT EVT_EXTERNAL_BEGIN + 1class TestEvent :public TplEventArgs<TestEvent>{SOUI_CLASS_NAME(TestEvent, L"on_event_test")public:TestEvent(SObject *pSender) :TplEventArgs<TestEvent>(pSender) {}enum {EventID = EVT_TESTEVENT};};
}//使用自定义的事件来进行同步或异步操作
void TestDlg::OnClickSynchronizationEvent_btn()
{//SMessageBox(NULL, L"同步JamesWu9527", L"", MB_OK);TestEvent pEvt(this);SNotifyCenter::getSingleton().addEvent(EVENTID(TestEvent)); //注册SNotifyCenter::getSingleton().FireEventSync(&pEvt); //同步通讯
}void TestDlg::OnClickAsynchronousEvent_btn()
{//SMessageBox(NULL, L"异步JamesWu9527", L"", MB_OK);//使用异步通讯 必须在堆栈上进行内存的分配,用完记得释放TestEvent *pEvt = new TestEvent(this);SNotifyCenter::getSingleton().addEvent(EVENTID(TestEvent));   //注册SNotifyCenter::getSingleton().FireEventSync(pEvt);  //异步通讯pEvt->Release();
}

Step 4:在主窗口中定义消息映射事件 两种方式,一种是带ID的 一种是不带ID的,这里例子使用带ID的来进行操作,所以还需要在子窗口的类中进行GetID的重写 virtual int GetID() const {return 9527;} 这样就表示这个子窗口的ID就是9527了 有一个固定的窗口ID和其他的窗口消息事件进行区分

在主窗口定义消息映射 在EVENT_MAP_BEGIN() 和  EVENT_MAP_END() 中间进行定义

EVENT_ID_HANDLER(TestDlg::TEST_DLG_ID, EVT_TESTEVENT,OnNotifyCenterFun)

也需要注意OnNotifyCenterFun的定义 void OnNotifyCenterFun(EventArgs *pEvt);

实现:

SEdit *pEdit = FindChildByName2<SEdit>(L"showresult");SASSERT(pEdit);pEdit->SetWindowTextW(L"响应事件成功");

实现效果,在子窗口点击按钮 在主窗口的编辑框内 就出现了 “响应事件成功”

小结:

需要注意两点即可

1.需要添加头文件Notifycenter.h文件 这个文件在SOUI的目录下可以找到,并且在程序入口函数中需要进行新建一个SNotifycenter的对象 并且在程序结束后 释放之~

2.注意需要接受中心事件的目标窗口需要继承public TAutoEventMapReg<类名> 这里我的类名是CMainDlg

3.同步和异步事件的处理顺序一定都是 创建一个对象堆或者栈(同步都可以,异步只能在堆上分配内存)-》注册事件-》触发事件

拓展:

使用不带ID的就使用下面的消息映射

EVENT_HANDLER(cd,func) //cd:表示事件的ID func:处理事件的函数

参考:http://www.cnblogs.com/setoutsoft/p/5642056.html

参考:https://blog.csdn.net/ceffans/article/details/78403910

SOUI中心事件的使用实例相关推荐

  1. Sonic 开源移动端云真机测试平台 - 设备中心接入安卓设备实例演示,Agent端服务部署过程详解

    Sonic 开源移动端云真机测试平台 - Agent端服务部署与安卓设备接入演示 一加8手机连接效果图展示 第一章:环境准备 ① agent-sources 资源包下载 ② Android SDK安装 ...

  2. php接收键盘事件,js获取键盘事件的方法实例

    本文主要和大家分享js获取键盘事件的方法实例,希望能帮助到大家. document.οnkeydοwn=function(event){ var e = event || window.event | ...

  3. JS--popstate事件--使用/教程/实例

    原文网址:JS--popstate事件--使用/教程/实例_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍JavaScript的popstate事件的用法. 官网网址 WindowEventH ...

  4. vue中 点击事件的写法_vue实现绑定事件的方法实例代码详解

    一.前言 vuejs中的事件绑定,使用来完成的,这里函数名是定义在Vue实例中的methods对象中的,Vue实例可以直接访问其中的方法. 二.事件绑定方式 1. 直接在标签中写js方法 执行方法的第 ...

  5. html div的点击事件,Jquery为DIV添加click事件的简单实例

    今天在做一个抽奖活动时小编要做一个抽奖没有中奖之后直接弹出一个提示,然后再给div添加一个事件了,下面我们来看这个例子的做法. html jquery事件 $('#click_ms').click(f ...

  6. Silverlight实用窍门系列:35.细解Silverlight冒泡路由事件和注册冒泡路由事件【附带实例源码】...

    Silverlight中的事件分为普通事件和冒泡路由事件,它并没有包括WPF中的隧道路由事件,在本章中将详细讲解冒泡路由事件和如何注册一个冒泡路由事件. 一.细解冒泡路由事件 冒泡路由事件可以比喻为: ...

  7. Android Touch事件原理加实例分析

    Android中有各种各样的事件,以响应用户的操作.这些事件可以分为按键事件和触屏事件.而Touch事件是触屏事件的基础事件,在进行Android开发时经常会用到,所以非常有必要深入理解它的原理机制. ...

  8. javascript的实现事件的一些实例

    嘿嘿,今天学习到了事件,其实在C#中事件只需要我们触发即可实现,但是在javascript并不是这样的,在这里,事件是javascript与html的交互,就是文档或者浏览器窗口发生的一件特定的交互瞬 ...

  9. js事件监听器用法实例详解

    这篇文章主要介绍了js事件监听器用法,以实例形式较为详细的分析了javascript事件监听器使用注意事项与相关技巧,需要的朋友可以参考下 本文实例讲述了js事件监听器用法.分享给大家供大家参考.具体 ...

最新文章

  1. 错误处理:RuntimeError: [enforce fail at ..\caffe2\serialize\inline_container.cc:145] . PytorchStreamRead
  2. Android开发之打开QQ聊天页面的方法
  3. ejb 2.0 3.0_EJB 3.1全局JNDI访问
  4. 不插网线终端缓慢的问题解决办法
  5. 每个数据科学专家都应该知道的六个概率分布
  6. C#中Split用法
  7. java语言体系的技术简介之JSP、Servlet、JDBC、JavaBean(Application)
  8. 【英语学习】【WOTD】bower 释义/词源/示例
  9. (PotPlayer)Windows视频播放神器
  10. .NET回归 HTML----表单元素(1)和一些常用的标记
  11. python割圆法求“圆周率”
  12. ubuntu安装nginx
  13. 11210怎么等于24_算24点
  14. 计算机在游戏界面应用,电脑在游戏界面怎么返回桌面
  15. 快速排序---(面试碰到过好几次)
  16. Word2010去除页眉上的横线
  17. 香港珠宝零售商将使用区块链平台追踪钻石
  18. MYSQL存储过程梳理
  19. FreeRTOS任务控制函数
  20. Jetbrains系列软件高版本闪退问题解决

热门文章

  1. android 音频显示器,安卓手机投屏(带声音同步)教程
  2. 【正点原子FPGA连载】第三十一章RTC实时时钟数码管显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
  3. 【快速打点综合工具 -- ALLiN】
  4. 利用github和godaddy搭建使用二级域名的个人主页
  5. MBA 消费者行为学 大白兔故事以及换装变化给老字号的启示
  6. MySQL5.7和MySQL8的区别
  7. 使用网络唤醒功能实现远程开机 —— 定时执行专家
  8. MP4测试视频URL地址分享,亲测有效。可用于测试HTML5播放器效果。
  9. problem 1278
  10. 音频延时测试方法与实现