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源创计划”,欢迎正在阅读的你也加入,一起分享。