CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

回调函数不能做类的成员函数吗?

楼主capoatguitar(菠萝蜜汁红塔山)2004-12-02 23:39:26 在 VC/MFC / 基础类 提问

我有一个类,类中需要一个定时器,所以用在类中用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

相关问题

  • 类成员函数可以当回调函数吗?
  • 回调函数能否是一个类的成员函数?
  • 回调函数能否是一个类的成员函数?
  • 如何将类成员函数作成一个回调函数?
  • 能否把类的成员函数定义为回调函数?
  • 如何用类的成员函数做回调函数呀?
  • php类在成员函数中怎么调用另一个成员函数?
  • 一个类的成员函数可以调用另一个成员函数吗?
  • 如何在成员函数中调用与类成员函数同名的win32 API函数
  • 把类成员函数定义为时钟回调函数的问题

关键词

  • 函数
  • 指针
  • 文件
  • null
  • 类
  • pthisapp
  • 回调
  • timerproc
  • 成员
  • 静态

得分解答快速导航

  • 帖主:capoatguitar
  • whwjn
  • woodwoodwood3
  • hushuangyan74
  • woodwoodwood3
  • qrlvls
  • oyljerry
  • uoyevoli
  • beyondtkl
  • wjjssnew
  • oyljerry
  • steedhorse
  • SatanLi1982
  • angelcool

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo