none
消息处理函数的共享 RRS feed

  • 问题

  • 本人是个新手,目前正在学vs2010,在一本书上看到关于消息处理函数的共享的一个操作,但是按照书上说的程序运行出现错误,错误在:

    ON_CONTROL_RANGE(BN_CLICKED,IDC_BUTTON1,IDC_BUTTON3,OnButtonClicked)

    错误 1 error C2440: “static_cast”: 无法从“void (__thiscall CMfcdialogDlg::* )(void)”转换为“void (__thiscall CCmdTarget::* )(UINT)” f:\workspace\mfcdialog\mfcdialog\mfcdialogdlg.cpp 66 1 Mfcdialog

     错误3 IntelliSense: 类型转换无效 f:\workspace\mfcdialog\mfcdialog\mfcdialogdlg.cpp 66 2 Mfcdialog
    请教高手解惑!

    2011年1月5日 8:24

答案

  • 问题是你的这个函数OnButtonClicked

    他需要一个参数来识别哪个按钮被按下了

    也就是说你声明时应该加一个参数

    UINT idBtn

    • 已标记为答案 student_s 2011年1月6日 5:06
    2011年1月6日 2:13
  • void (__thiscall CMfcdialogDlg::* )(void)函数无法转为void (__thiscall CCmdTarget::* )(UINT)我觉得你的CMfcdialogDlg应该是从CCmdTarget派生的,除非CMfcdialogDlg没有从CWnd派生。

    问题可能在于你的OnButtonClicked函数是无参的。而不是要求的UINT。

    把OnButtonClicked加上UINT参数。


    麻烦把正确答案设为解答。
    • 已标记为答案 student_s 2011年1月6日 5:06
    2011年1月6日 2:36
    版主

全部回复

  • 改为ON_CONTROL_RANGE(BN_CLICKED,IDC_BUTTON1,IDC_BUTTON3,&OnButtonClicked)

    把OnButtonClicked改为有类型为UINT的参数,

    你的书估计是为VC6编写的,VC6对消息宏中错误的函数类型检查不严格。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2011年1月6日 1:19
    版主
  • 首先感谢你的回复,我看的书确实是为vc6编写的,那这个问题在vs2010中应该如何解决呢?还望赐教!呵呵

    2011年1月6日 1:36
  • 在vs2010的头文件sfxmsg.h中是这么定义消息共享处理函数的

    #define ON_CONTROL_RANGE(wNotifyCode, id, idLast, memberFxn) \
     { WM_COMMAND, (WORD)wNotifyCode, (WORD)id, (WORD)idLast, AfxSigCmd_RANGE, \
      (AFX_PMSG) \
      (static_cast< void (AFX_MSG_CALL CCmdTarget::*)(UINT) > (memberFxn)) },

    看不懂~

    2011年1月6日 1:39
  • 问题是你的这个函数OnButtonClicked

    他需要一个参数来识别哪个按钮被按下了

    也就是说你声明时应该加一个参数

    UINT idBtn

    • 已标记为答案 student_s 2011年1月6日 5:06
    2011年1月6日 2:13
  • void (__thiscall CMfcdialogDlg::* )(void)函数无法转为void (__thiscall CCmdTarget::* )(UINT)我觉得你的CMfcdialogDlg应该是从CCmdTarget派生的,除非CMfcdialogDlg没有从CWnd派生。

    问题可能在于你的OnButtonClicked函数是无参的。而不是要求的UINT。

    把OnButtonClicked加上UINT参数。


    麻烦把正确答案设为解答。
    • 已标记为答案 student_s 2011年1月6日 5:06
    2011年1月6日 2:36
    版主