soui2,29更新,30资源导入器,31异步通知

原创
2022/09/23 22:08
阅读数 20

1,修改uiresbuilder,增加自动生成资源ID功能.包括自动提取所有布局中控件名,自动生成ID,自动提取串表,颜色表.

2,@string/str-name引用串,不支持嵌套.

3,增加颜色表:@color/color-name引用.

4,给EventArg增加bubbleUp属性,为时,中断冒泡.

5,增加STreeView控件.

uiresimporter工具下面,支持5个参数.

参数 意思
-p 指定uires目录
-s 中指定需要在uires.idx中自动更新的文件夹.多个目录时应该使用"a|b|c"这样的形式分割,并使用引号
-i 参数中指定的图片支持自动生成skin,自动生成skin只支持imglist,imgframe两种,不支持的图片放到其它目录,如示例中的滚动条皮肤.
-b yes自动备份原有XML.no不备份.
-c yes皮肤默认支持高亮,no默认禁止着色

如下为示例:

%SOUIPATH%\tools\uiresImporter.exe -p uires -s "layout|icon|imgx" -i image -b yes -c no


一般用Post/Send传递消息,但要有窗口句柄,且发出的消息只能在该窗口句柄消息处理函数中处理.

SNotifyCenter来解决它.是全局单例.它的通知由SOUI事件系统分发,借助订阅系统,可在任意位置处理发出的事件.

#pragma once
#include <core/SSingleton.h>
namespace SOUI
{

template<class T>
class TAutoEventMapReg
{//自动注册事件映射.
typedef TAutoEventMapReg<T> _thisClass;
public:
TAutoEventMapReg()
{
SNotifyCenter::getSingleton().RegisterEventMap(Subscriber(&_thisClass::OnEvent,this));
}

~TAutoEventMapReg()
{
SNotifyCenter::getSingleton().UnregisterEventMap(Subscriber(&_thisClass::OnEvent,this));
}

protected:
bool OnEvent(EventArgs *e){
T * pThis = static_cast<T*>(this);
return !!pThis->_HandleEvent(e);
}
};

class SOUI_EXP SNotifyCenter : public SSingleton<SNotifyCenter>,public SEventSet{
//通知中心
public:
SNotifyCenter(void);
~SNotifyCenter(void);
void FireEventSync(EventArgs *e);
//触发通知事件.只能在界面线程中调用.
void FireEventAsync(EventArgs *e);
//异步通知,事件参数必须在堆上分配,用Release释放引用计数.
bool RegisterEventMap(const ISlotFunctor &slot);
//注册,
bool UnregisterEventMap(const ISlotFunctor & slot);//注销

protected:
void OnFireEvent(EventArgs *e);
void ExecutePendingEvents();
static VOID CALLBACK OnTimer( HWND hwnd,
UINT uMsg,
UINT_PTR idEvent,
DWORD dwTime
);

SCriticalSection m_cs;//线程同步对象
SList<EventArgs*>*m_evtPending;//挂起的等待执行事件
DWORD m_dwMainTrdID;//主线程ID
UINT_PTRm_timerID;//定时器ID,用来执行异步事件
SList<ISlotFunctor*>m_evtHandlerMap;
};
}


使用

主函数中实例化SNotifyCenter,先定义事件,再注册:

void CMainDlg::OnBtnStartNotifyThread()
{//启动.
if(IsRunning()) return;
SNotifyCenter::getSingleton().addEvent(EVENTID(EventThreadStart));...
EventThreadStart evt(this);
SNotifyCenter::getSingleton().FireEventSync(&evt);
BeginThread();
}

void CMainDlg::OnBtnStopNotifyThread()
{

if(!IsRunning()) return;EndThread();
EventThreadStop evt(this);

SNotifyCenter::getSingleton().FireEventSync(&evt);

SNotifyCenter::getSingleton().removeEvent(EventThreadStart::EventID);...

}


要处理通知中心分发事件对象从TAutoEventMapReg继承,实现自动订阅事件.

事件映射表里处理事件.


本文分享自微信公众号 - 周三石(gh_6eecda59ada1)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部