SOUI是一套基于Win32 SDK的窗口开发的一套DirectUI框架。在SOUI中除了有真窗口使用窗口消息通讯机制外,还有SOUI控件之间的通讯,及控件的事件处理等。

1、真窗口消息通讯

因此可以使用::SendMessage这个API来与宿主窗口通讯。在任意一个地方只要获取到了SOUI的宿主窗口句柄就可以向该窗口发消息。

发消息以后可以在主界面的真窗口的消息映射表中响应各种自定义消息(如下):

#define WM_MYMSG (WM_USER+100)
LRESULT OnMyMsg(UINT uMsg,WPARAM wp,LPARAM lp,BOOL & bHandled)
{
return ;
}
//HOST消息及响应函数映射表
BEGIN_MSG_MAP_EX(CMainDlg)
MESSAGE_HANDLER(WM_MYMSG,OnMyMsg)
MSG_WM_CREATE(OnCreate)
MSG_WM_INITDIALOG(OnInitDialog)
MSG_WM_DESTROY(OnDestory)
MSG_WM_CLOSE(OnClose)
MSG_WM_SIZE(OnSize)
MSG_WM_COMMAND(OnCommand)
MSG_WM_SHOWWINDOW(OnShowWindow)
CHAIN_MSG_MAP(SHostWnd)
REFLECT_NOTIFICATIONS_EX()
END_MSG_MAP()

注意上面代码的红色部分。有WTL开发经验的朋友应该已经看出来了,SOUI处理真窗口消息的形式和WTL完全一样。

2、SOUI控件通讯

我们知道,在win32编译中,要与一个控件(窗口)通讯能用SendMessage(PostMessage)发送一个消息给目标窗口,目标窗口收到后进行处理。那么问题来了,如何向一个SOUI窗口发消息?

SOUI的窗口类和MFC的窗口类很像,和MFC使用SendMessage(PostMessage)发消息类似,在SOUI中也可以使用SWindow::SSendMessage来向目标窗口发送一个消息来通讯,但不支持PostMessage,目标窗口在SOUI窗口的消息映射表中响应发送过来的消息。下面是一个内置控件STabCtrl的消息映射表:

        SOUI_MSG_MAP_BEGIN()
MSG_WM_PAINT_EX(OnPaint)
MSG_WM_DESTROY(OnDestroy)
MSG_WM_LBUTTONDOWN(OnLButtonDown)
MSG_WM_MOUSEMOVE(OnMouseMove)
MSG_WM_MOUSELEAVE(OnMouseLeave)
MSG_WM_KEYDOWN(OnKeyDown)
SOUI_MSG_MAP_END()

和真窗口的映射表使用WTL的映射宏不一样,SOUI窗口的映射宏使用SOUI_MSG_MAP_BEGIN 和SOUI_MSG_MAP_END来构造消息处理函数,但是映射表中的消息映射项基本和WTL的映射形式是一样的(注意个别消息是经过重定义的,典型的如WM_PAINT消息,在SOUI中需要使用MSG_WM_PAINT_EX来处理)。

3、SOUI的事件机制

此外SOUI中控件要发出事件交给应用层处理使用的是一套事件机制。

每一个事件有对应一个EventArg类,事件在控件中使用FireEvent启动事件路由,应用程序可以在事件响应映射表中对各种事件统一处理,也可以使用subscribeEvent来直接订阅特定SOUI窗口的一个事件,直接将事件与事件处理函数关联。这一部分请参考前面相关章节。

第十五篇:在SOUI中消息通讯的更多相关文章

  1. Egret入门学习日记 --- 第十五篇(书中 6.1~6.9节 内容)

    第十五篇(书中 6.1~6.9节 内容) 好的,昨天完成了第五章. 今天来看第六章. 总结重点: 1.如何对组件进行分组? 跟着做: 重点1:如何对组件进行分组? 首先,选中你想要组合的组件. 然后点 ...

  2. 第二十八篇:SOUI中自定义控件开发过程

    在SOUI中已经提供了大部分常用的控件,但是内置控件不可能满足用户的所有要求,因此一个真实的应用少不得还要做一些自定义控件. 学习一个新东西,最简单的办法就是依葫芦画瓢.事实上在SOUI系统中内置控件 ...

  3. 第二十五篇 -- C++宝典中的图书管理系统

    此篇文章是基于C++宝典写的图书管理系统,本人对其中的部分做了相应修改,并且以现有格式替代原有格式,使程序更加清晰明了.此程序运行在VS2017上. 系统设计 图书管理系统分为四个模块:图书管理模块. ...

  4. 第十五篇 Integration Services:SSIS参数

    本篇文章是Integration Services系列的第十五篇,详细内容请参考原文. 简介在前一篇,我们使用SSDT-BI将第一个SSIS项目My_First_SSIS_Project升级/转换到S ...

  5. 【译】第十五篇 Integration Services:SSIS参数

    本篇文章是Integration Services系列的第十五篇,详细内容请参考原文. 简介在前一篇,我们使用SSDT-BI将第一个SSIS项目My_First_SSIS_Project升级/转换到S ...

  6. 解剖SQLSERVER 第十五篇 SQLSERVER存储过程的源文本存放在哪里?(译)

    解剖SQLSERVER 第十五篇  SQLSERVER存储过程的源文本存放在哪里?(译) http://improve.dk/where-does-sql-server-store-the-sourc ...

  7. Python之路【第十五篇】:Web框架

    Python之路[第十五篇]:Web框架   Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 1 2 3 4 5 6 ...

  8. 跟我学SpringCloud | 第十五篇:微服务利剑之APM平台(一)Skywalking

    目录 SpringCloud系列教程 | 第十五篇:微服务利剑之APM平台(一)Skywalking 1. Skywalking概述 2. Skywalking主要功能 3. Skywalking主要 ...

  9. Egret入门学习日记 --- 第十六篇(书中 6.10~7.3节 内容)

    第十六篇(书中 6.10~7.3节 内容) 昨天搞定了6.9节,今天就从6.10节开始. 其实这个蛮简单的. 这是程序员模式. 这是设计师模式. 至此,6.10节 完毕. 开始 6.11节. 有点没营 ...

随机推荐

  1. Iterator中hasNext(), next() 和ResultSet结果集的next方法的区别

    接口 Iterator专门的迭代输出接口,将元素一个个进行判断,用hasNext() 判断是否有值,用next()方法把元素取出.hasNext() 如果仍有元素可以迭代,则返回 true.next( ...

  2. Android Studio (Gradle)编译错误

    Error:Execution failed for task ':app:processDebugResources' .com.android.ide.common.process.Process ...

  3. DOS与批处理

    cmd命令不区分大小写 d: cd .. cd 文件夹 dir dir 文件或文件夹 可执行文件(.exe, .bat., .com),只需进入文件当前目录并输入文件名(不需要后缀)即可执行, 如果将 ...

  4. memcpy vs memmove

    [本文连接] http://www.cnblogs.com/hellogiser/p/memcpy_vs_memmove.html [分析] memcpy与memmove的目的都是将N个字节的源内存地 ...

  5. Oracle10g下载地址--多平台下的32位和64位

    前段时间ORACLE把10G的下载从官网拿掉了 ,许多童鞋不知道ORACLE 10g 的下载地址,这里我附上oracle 10g 下载的链接,方便大家下载.      点击链接使用迅雷即可下载.    ...

  6. ACM/ICPC 之 拓扑排序范例(POJ1094-POJ2585)

    两道拓扑排序问题的范例,用拓扑排序解决的实质是一个单向关系问题 POJ1094(ZOJ1060)-Sortng It All Out 题意简单,但需要考虑的地方很多,因此很容易将code写繁琐了,会给 ...

  7. 解决VM虚拟机MAC OS X 10.10.x的卡顿问题

    点此链接下载beamoff安装到虚拟机即可.

  8. Python初识

    Python第一天   一.为什么学Python        作为一名linux运维工程师现在越来越感觉不好干了.没有地位,还待背黑锅,并且运维自动化发展的这么快,普通运维岗位的路也越来越窄(因为我 ...

  9. pom.xml中引入局域网仓库

    <repositories> <repository> <id>nexus</id> <name>my-nexus-repository&l ...

  10. 20145213《Java程序设计》第二周学习总结

    20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...