回调函数不能做类的成员函数吗?
我有一个类,类中需要一个定时器,所以用在类中用settimer创建一个,但是回调函数timerproc没法写了,写成类的成员函数编译不通过;也不能将回调函数写在类外面,因为回调函数timerproc还要调用类中的成员函数和变量,我该怎么办??大家帮忙,先谢谢各位了!! 问题点数:40、回复次数:16Top
1 楼whwjn(哈哈)回复于 2004-12-03 01:00:29 得分 6
定义成static静态成员函数试试看
或者SetTimer最后一个参数设定成NULL,就没这个问题了。
void CMainFrame::OnStartTimer()
{
m_nTimer = SetTimer(1, 2000, 0);
}
void CMainFrame::OnStopTimer()
{
KillTimer(m_nTimer);
}
void CMainFrame::OnTimer(UINT nIDEvent)
{
MessageBeep(0xFFFFFFFF); // Beep
// Call base class handler.
CMDIFrameWnd::OnTimer(nIDEvent);
}
Top
2 楼woodwoodwood3()回复于 2004-12-03 01:17:14 得分 6
在类的头文件中将回调函数声明成静态的,使之成为静态成员
static void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT uIDEvent,DWORD dwTime);
在类的头文件中定义一个类本身的指针,并且也是静态的:
static CMyApp* pThisApp;//给静态回调函数定义的一个this指针
在类的CPP文件中,在类外再声明一下指针:
CMyApp* CMyApp::pThisApp;//在类外定义一下静态变量
在类的初始化中给指针赋值:
CMyApp::pThisApp=this;
启动计时:
m_timerID=SetTimer(NULL,NULL,5000,TimerProc);//UINT m_timerID;
在回调函数中就可以用pThisApp调用类中的成员:
void CALLBACK CMyApp::TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
{
pThisApp->.....;
KillTimer(NULL,pThisApp->m_timerID);
}Top
3 楼hushuangyan74()回复于 2004-12-03 01:19:59 得分 3
回调函数timerproc应该写在类外面,并把类的指针this传给它,然后在回调函数里面就可以访问类实例的成员了!Top
4 楼woodwoodwood3()回复于 2004-12-03 16:44:02 得分 1
回调函数timerproc可以不写在类外面,上面的我的代码是在我的程序中摘录出来的,运行一点问题也没有!Top
5 楼capoatguitar(菠萝蜜汁红塔山)回复于 2004-12-03 20:38:05 得分 0
to whwjn(菜鸟学飞) 我用的是WIN32程序,没有MFC,如果是MFC就简单了,呵呵
to hushuangyan74() 谢谢你,你的意思明白。
to woodwoodwood3() 差不多,就按你说的做了,谢谢。Top
6 楼qrlvls( 空 气 )回复于 2004-12-03 20:39:01 得分 1
可以是类成员,但必须是CALLBACK类型Top
7 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2004-12-03 21:06:04 得分 1
保持CALLBACK类型Top
8 楼uoyevoli(爱什么呢?www.FARPROC.com)回复于 2004-12-05 16:16:40 得分 5
第一,类的成员函数和回掉函数的调用方式不同。一个是....(忘了,呵呵)另一个是stdcll
第二,类的成员函数会隐含传递一个this指针,无法和回掉要求的参数个数保持一致,所以无法用作回掉。
解决办法:1,把CallBack函数写为全局函数。
2,用类的static成员函数,加CALLBACK关键字(或stdcll)指明调用方式。Top
9 楼capoatguitar(菠萝蜜汁红塔山)回复于 2004-12-09 17:25:28 得分 0
道理是明白了,不过我是要每个类的对象都有自己的一个时间器的回调函数,并不是所有类的对象共用一个。
uoyevoli(爱什么呢?) 说的静态成员函数是不可以了,写成全局的话也还是所有对象共用一个回调函数。。Top
10 楼beyondtkl(大龙驹<*好久没来了,兄弟们好吧。*>)回复于 2004-12-09 17:34:03 得分 5
o ..static function 就可以。。
道理是明白了,不过我是要每个类的对象都有自己的一个时间器的回调函数,并不是所有类的对象共用一个。
// 你為什麼一定要每個對象都有自己的回調函數那。那你可以多定義幾個static函數 然後你調用的時候進行選擇 就也ok亞。。Top
11 楼wjjssnew(暗恋一个叫张文玲的女孩)回复于 2004-12-09 17:56:53 得分 5
可以自行指定啊~。
不过 太多的 回调函数 程序占用系统资源 会比较大!
不如 使用相同的 回调函数 然后 用 switchTop
12 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2004-12-09 18:43:00 得分 2
static申明了,就只可以在本模块(类)中调用了Top
13 楼steedhorse(晨星)回复于 2004-12-09 18:48:50 得分 3
不同的对象自然应该使用不同的Timer ID,设法通过此ID映射相关的对象就可以了。Top
14 楼SatanLi1982(红魔)回复于 2004-12-09 19:01:46 得分 1
可以,但要定义为staticTop
15 楼capoatguitar(菠萝蜜汁红塔山)回复于 2004-12-11 20:44:18 得分 0
我明白定义一个回调函数的意思。
我程序运行时候那个类的对象数目是不确定的,有1~20个不等,在回掉函数里用switch分支的话没法写,所以每个对象都有一个回掉函数。
大家在帮我想想办法,分不够再加,如果真没有办法我就自己写一个定时器算了。Top
16 楼angelcool(快乐需要创造)回复于 2004-12-11 22:03:09 得分 1
markTop




