Page 1 of 1

wxwidgets有像MFC那样的时间事件吗?

Posted: Tue Aug 04, 2009 12:53 am
by happybamboo
我想写一个和时间相关的东西,比如说一秒钟数字变一次,我记的MFC有一个TIMER啥的东西可以发送时间事件,wxwidgets有吗?没有的话怎么做到一秒钟刷新一次界面啊?
请高手指教一下,先谢啦。

Posted: Tue Aug 04, 2009 1:31 am
by samsam598
俺不是高手,俺是菜鸟

使用wxTimer

wxTimer类让你的程序可以周期性的收到提示,或者在某个特定的时间间隔收到提醒.如果你要使用线程处理的事情可以分成小的时间片,每隔几个毫秒处理一次,以便你的应用程序可以有足够的时间响应用户的输入,你就可以使用wxTimer来代替多线程.

你可以自己选择提醒的通知方式,如果你更喜欢使用虚函数,就实现一个wxTimer的派生类,然后重载其Notify函数,如果你更倾向使用事件机制,就给你的wxTimer构造函数指定一个wxEvtHandler指针(或者使用SetOwner)函数,然后使用EVT_TIMER(id, func)事件映射宏来将事件映射到对应的处理函数.

你可以给wxTimer的构造函数或者SetOwner函数传递一个可选的定时器标识符,这个标识符可以用在EVT_TIMER事件映射宏中.这在你需要使用多个定时器的时候比较有用.

使用Start函数启动定时器,需要传递的参数包括一个毫秒为单位的定时器时长和可选的wxTIMER_ONE_SHOT指示(如果你只希望收到一次提示).Stop函数用来终止某个定时器,IsRunning函数用来检测当前定时器是否出于运行状态.

下面的代码演示了怎样通过事件的方式使用定时器:


#define TIMER_ID 1000
class MyFrame : public wxFrame
{
public:
...
void OnTimer(wxTimerEvent& event);
private:
wxTimer m_timer;
};
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_TIMER(TIMER_ID, MyFrame::OnTimer)
END_EVENT_TABLE()
MyFrame::MyFrame()
: m_timer(this, TIMER_ID)
{
// 1秒的间隔
m_timer.Start(1000);
}
void MyFrame::OnTimer(wxTimerEvent& event)
{
// 你可以在这里作任何你希望1秒执行一次的动作
}

另外你可以看一下这个教程,用WX写的贪吃蛇,主要事件用wxTimer来驱动.
http://code.technoplaza.net/wxNibbles/

Posted: Tue Aug 04, 2009 2:31 am
by ollydbg23
上面这个教程不错啊!谢谢!

Posted: Tue Aug 04, 2009 7:13 am
by happybamboo
谢了,呵呵

Posted: Wed Aug 05, 2009 9:31 am
by arust
samsam598的回复很精彩 :D