-
Notifications
You must be signed in to change notification settings - Fork 281
第十四篇:在SOUI中使用定时器
原文链接:《第十四篇:在SOUI中使用定时器》
定时器是win32编程中常用的制作动画效果的手段。在Win32编程中,可以使用::SetTimer
来创建定时器,定时器消息会被会发到调用SetTimer时指定的HWND。
在SOUI中一般来说只有一个宿主窗口有HWND,所有的SWindow都属于一个宿主窗口,如此一来直接使用::SetTimer
创建的定时器就难以直接分发到SWindow对象了。
为了能够方便的在SWindow中使用定时器,在SOUI系统中,我们通过将定时器ID(共32位)按位进行分解:
class SOUI_EXP STimerID
{
public:
DWORD Swnd:24; //窗口句柄,如果窗口句柄超过24位范围,则不能使用这种方式设置定时器
DWORD uTimerID:7; //定时器ID,一个窗口最多支持128个定时器。
DWORD bSwndTimer:1; //区别通用定时器的标志,标志为1时,表示该定时器为SWND定时器
STimerID(SWND hWnd,char id)
{
SASSERT(hWnd<0x00FFFFFF && id>=0);
bSwndTimer=1;
Swnd=hWnd;
uTimerID=id;
}
STimerID(DWORD dwID)
{
memcpy(this,&dwID,sizeof(DWORD));
}
operator DWORD &() const
{
return *(DWORD*)this;
}
};
低24位用来存储SWindow的窗口ID(swnd)。swnd是一个SWindow创建序号,在一个应用中,通常很难产生超过0xFFFFFF(16777215)
个窗口对象,因此使用低24位来存储窗口ID在大部分情况下都是够用的了。
高8位中保留最高位设置为1,用来区别直接使用::SetTimer创建的定时器(不可以把最高位置1)。
剩下7位用于SWindow中作为定时器ID。因此在SOUI中,一个SWindow最多可以创建0-127
个定时器。
SWindow::SetTimer(0~127);
/**
* SWindow::SetTimer
* @brief 利用窗口定时器来设置一个ID为0-127的SWND定时器
* @param char id -- 定时器ID
* @param UINT uElapse -- 延时(MS)
* @return BOOL
*
* Describe 参考::SetTimer
*/
BOOL SWindow::SetTimer(char id,UINT uElapse);
SWindow::KillTimer;
/**
* KillTimer
* @brief 删除一个SWND定时器
* @param char id -- 定时器ID
* @return void
*
* Describe
*/
void KillTimer(char id);
在消息映射表中使用MSG_WM_TIMER_EX
。参见:SGifPlayer.h
SOUI_MSG_MAP_BEGIN()
MSG_WM_TIMER_EX(OnTimer) //定时器消息
MSG_WM_PAINT_EX(OnPaint) //窗口绘制消息
MSG_WM_SHOWWINDOW(OnShowWindow)//窗口显示状态消息
SOUI_MSG_MAP_END()
如果在一个窗口中必须要创建使用32位的定时器ID,在SOUI中可以使用另一个接口来实现:
/**
* SetTimer2
* @brief 利用函数定时器来模拟一个兼容窗口定时器
* @param UINT_PTR id -- 定时器ID
* @param UINT uElapse -- 延时(MS)
* @return BOOL
*
* Describe 由于SetTimer只支持0-127的定时器ID,SetTimer2提供设置其它timerid
* 能够使用SetTimer时尽量不用SetTimer2,在Kill时效率会比较低
*/
BOOL SetTimer2(UINT_PTR id,UINT uElapse);
/**
* KillTimer2
* @brief 删除一个SetTimer2设置的定时器
* @param UINT_PTR id -- SetTimer2设置的定时器ID
* @return void
*
* Describe 需要枚举定时器列表
*/
void KillTimer2(UINT_PTR id);
使用SWindow::SetTimer2
创建的定时器,最后会通过一个消息:WM_TIMER2
来分发到SWindow
。
#define WM_TIMER2 (WM_USER+5432) //定义一个与HWND定时器兼容的SOUI定时器
#define MSG_WM_TIMER2(func) \
if (uMsg == WM_TIMER2) \
{ \
SetMsgHandled(TRUE); \
func(wParam); \
lResult = 0; \
if(IsMsgHandled()) \
return TRUE; \
}
前面两种定时器都是在控件开发的时候使用定时器的方法。而在应用层,还可以为宿主窗口直接使用::SetTimer
或者宿主窗口的基类:CSimpleWnd::SetTimer
来创建定时器**(注意最高位必须是0)**。
在响应这类定时器时,一样可以在宿主窗口的消息映射表中使用MSG_WM_TIMER
来响应定时器消息。但是需要注意的是,这个映射宏会截获所有分发给宿主窗口的定时器,如果不是自己创建的定时器,则需要继续交给基类处理。
可以调用:SetMsgHandled(FALSE);
或者:SHostWnd::OnTimer(UINT_PTR idEvent);
实现。
UI? just so so!
- 第一篇:SOUI是什么?
- 第二篇:SOUI源码的获取及编译
- 第三篇:用SOUI能做什么?
- 第四篇:SOUI资源文件组织
- 第五篇:在SOUI中使用XML布局属性指引
- 第六篇:在SOUI中用九宫格拉伸方式显示一个图片资源
- 第七篇:创建一个SOUI的Hello World
- 第八篇:SOUI中控件事件的响应
- 第九篇:在SOUI中使用多语言翻译
- 第十篇:扩展SOUI的控件及绘图对象
- 第十一篇:SOUI系统资源管理
- 第十二篇:SOUI的utilities模块为什么要用DLL编译?
- 第十三篇:在SOUI中使用有窗口句柄的子窗口
- 第十四篇:在SOUI中使用定时器
- 第十五篇:在SOUI中消息通讯
- 第十六篇:SWindow的布局属性pos2type及offset
- 第十七篇:使用窗口的cache属性加速SOUI的渲染
- 第十八篇:在SOUI中实现PreTranslateMessage
- 第十九篇:提高SOUI应用程序渲染性能的三种武器
- 第二十篇:在SOUI中使用分层窗口
- 第二十一篇:SOUI中的控件注册机制
- 第二十二篇:在SOUI中使用代码向窗口中插入子窗口
- 第二十三篇:在SOUI中使用LUA脚本开发界面
- 第二十四篇:导出SOUI对象到LUA脚本
- 第二十五篇:在SOUI中做事件分发处理
- 第二十六篇:两个SOUI新控件 ---- SListView和SComboView
- 第二十七篇:SOUI中控件属性查询方法
- 第二十八篇:SOUI中自定义控件开发过程
- 第二十九篇:使用SOUI的SMCListView控件
- 第三十篇:SOUI模块结构图及SOUI框架图
- 第三十一篇:SOUI布局之相对于特定兄弟窗口
- 第三十二篇:在SOUI2.0中像android一样使用资源
- 第三十三篇:使用uiresImporter生成uires.idx及skin.xml
- 第三十四篇:在SOUI中使用异步通知
﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊
This wiki is created by [SOUI Team]