当消息到来时MFC在链表中寻找消息处理函数,但它是如何把实参传给消息处理函数的呢?举例如下:
在.H文件中把原来void OnLButtonDown(UINT nFlags,CPoint point);的声明
改为
void OnLButtonDown(UINT nFlags,CPoint point,char k,int m,char p);
即任意改变消息处理函数中的参数个数或类型,在CPP文件中也作了相应改变,但无论怎么更改均能通过编译,其实消息映射宏只把函数指针(函数名)加入了消息映射表,消息映射表并没有记录函数参数等信息。
我的疑问是:MFC怎么知道我的消息处理函数的参数个数和类型?
哪位大虾详细回答一下,谢谢!

解决方案 »

  1.   

    no way除非响应OnMessage(WM_LBUTTONDOWN
      

  2.   

    WM消息只有WParam和LParam
    最好别修改WM消息的默认行为
    可自定义消息自己响应,如
    #define WM_MYMSG WM_APP+1000
      

  3.   

    楼上的二位大哥,我就是想知道MFC是如何实现把实参传递给消息处理函数的,就是当我更改其参数时却总能通过编译。
      

  4.   

    MFC怎么知道我的消息处理函数的参数个数和类型?
    ===========================
    这个没有原因吧? 它特定的消息响应特定的函数,有特定的参数和类型,一般情况下不要重载消息函数 如果需要对其进行另外的修改的话 就象 一楼朋友所说的  自定义一个消息函数比较好
      

  5.   

    MFC 会调用TranslateMessage(),DispatchMessage().
    传递的就是MSG结构体,其成员就包括窗口处理函数的各个参数。
      

  6.   

    MFC 会调用TranslateMessage(),DispatchMessage().
    传递的就是MSG结构体,其成员就包括窗口处理函数的各个参数。
    =====================================
    但消息处理函数的参数被我大大地改动了,MFC怎么还懂得如何调用?调用一个函数时肯定参数要一致才能通过编译。但MFC好似总能知道消息处理函数的参数。
      

  7.   

    谢谢楼上几位大哥的回答!
    我知道自定义消息等操作,但就是不明白MFC如何把实参传给消息处理函数而不管消息处理函数的参数被改成什么样子。
      

  8.   

    MFC 会调用TranslateMessage(),DispatchMessage().
    传递的就是MSG结构体,其成员就包括窗口处理函数的各个参数。这里不讲清了吗?在消息被响应时,会带MSG结构啊,当然只识别这结构里的相同参数了啦,如带了wParam, lParam的响应函数,会被传进去啊..通过编译,是因为C++支持重载啊
      

  9.   

    MFC 会调用TranslateMessage(),DispatchMessage().
    传递的就是MSG结构体,其成员就包括窗口处理函数的各个参数。这里不讲清了吗?在消息被响应时,会带MSG结构啊,当然只识别这结构里的相同参数了啦,如带了wParam, lParam的响应函数,会被传进去啊..通过编译,是因为C++支持重载啊
    ====================================================
    我新增的参数呢?MSG结构体里肯定没有,当MFC调用消息处理函数只传了wParam, lParam等实参,那函数的其它参数呢?虽然C++支持重载,但调用函数总要参数一致吧?
      

  10.   

    其实是全局函数到类成员函数的转换过程.具体的参看wincore.cpp
      

  11.   

    我都试过了,无论如何更改参数,都能运行得好好的,并且MFC调用的也是自已的消息处理函数而不是父类的函数。
      

  12.   

    运行得好好的?在DEBUG版下试过吗?
    如果你的参数个数比MFC要求的多,那么多出来的参数的值是什么?随机的?
      

  13.   

    However, you should notice that compiler only force casts the pointer of function who processes the certain message.
      

  14.   

    Only a few message maps have type checking...  
    http://blog.csdn.net/jiangsheng/archive/2004/01/05/3797.aspx
      

  15.   

    However, you should notice that compiler only force casts the pointer of function who processes the certain message.
    =====================================
    通过函数指针调用一个函数时参数要匹配,而我修改了参数,问题是MFC怎么还能调用我的函数?
      

  16.   

    void OnLButtonDown(UINT nFlags,CPoint point;
    改为
    void OnLButtonDown(UINT nFlags,CPoint point,char k,int m,char p);
    后在vs2005下编译没通过,不知道楼主是那个版本的,应该是编译器的问题
      

  17.   

    在 ON_WM_LBUTTONDOWN() 行报错
    error C2440: 'static_cast' : cannot convert from 'void (__thiscall CMFCTestSingleView::* )(UINT,CPoint,char,int,char)' to 'void (__thiscall CWnd::* )(UINT,CPoint)'
      

  18.   

    In Visual C++ 6.0, the function type is not checked. Since Visual C++ 7.0, the function type is checked.
      

  19.   

    In Visual C++ 6.0, the function type is not checked. Since Visual C++ 7.0, the function type is checked.
    ==========================================
    蒋大侠,VC6.0不检查函数类型?不可能吧?再说就算它不检查函数类型,那MFC怎么匹配地调用一个函数?
      

  20.   

    ON_COMMAND()
    ON_WM_CREATE()
    其实在这类宏出现的时候,函数类型已经确定
    请查看AFX_MSGMAP_ENTRY的成员nSig,
    但MFC如何将原函数指针转换成与nSig匹配的类型,就是union MessageMapFunctions的功劳了。