在WindowsX.h中我看到了很多类似这个形式的代码:
    #define HANDLE_WM_MBUTTONDBLCLK(hwnd, wParam, lParam, fn) \
    ((fn)((hwnd), TRUE, (int)(short)LOWORD(lParam), (int)(short)HIWORD(lParam), (UINT)(wParam)), 0L)
我知道这是用于为消息分流器设定的处理各种消息时回调函数的定义形式,但是这段代码的细节不是很清楚,想问一下,就针对上面这个HANDLE_WM_MBUTTONDBLCLK吧:看这一行:((fn)((hwnd), TRUE, (int)(short)LOWORD(lParam), (int)(short)HIWORD(lParam), (UINT)(wParam)), 0L)1.首先函数名为fn,这个没错吧?:)
  第一个参数是HWND hwnd,这个也没错吧?:)
  那第三个参数这里写了个TRUE是什么意思呢?
  第四、五两行更糟糕,怎么又是int又是short的?又是LOWORD又是HIWORD?
  最后个参数UINT wParam又是做什么的呢?2.上面的形式中怎么没定义函数的返回值类型的呢?
  但是我看到也有一些定义就说明了返回值类型,如:    #define HANDLE_WM_INITDIALOG(hwnd, wParam, lParam, fn) \
    (LRESULT)(DWORD)(UINT)(BOOL)(fn)((hwnd), (HWND)(wParam), lParam)
  为什么这个就给出了返回类型的呢?而且返回类型怎么又是(LRESULT)(DWORD)(UINT)(BOOL)呢?要这么多类型干吗?我具体用的时候怎么知道用哪个返回类型呢?太奇怪了。小弟是VC新手,处于初始阶段,但是一个人摸索进步真的比较慢。有些东西一点就通的,我一个人可能要摸索半天。
请各路朋友帮小弟释疑,谢谢。

解决方案 »

  1.   

    自己弄个例子, 自己在消息处理函数加上断点, 断下来看callstack, 找到对应的代码, 然后就可以看到消息的处理框架及原因...
      

  2.   

    HANDLE_WM_MBUTTONDBLCLK是宏,应该是用来设置消息的处理函数的,即设置fn。在源码里面找HANDLE_WM_MBUTTONDBLCLK的使用,找到对应的fn函数,就可以知道函数各个参数的意义了。
      

  3.   

    你看MFC源代码:
    #define HANDLE_WM_MBUTTONDBLCLK(hwnd, wParam, lParam, fn) \
        ((fn)((hwnd), TRUE, (int)(short)LOWORD(lParam), (int)(short)HIWORD(lParam), (UINT)(wParam)), 0L)
    处理 WM_MBUTTONDBLCLK消息,至于你上面说的HIWORD,LOWORD,你可以看具体的消息,参看MSDN,他们表示不同的含义  #define HANDLE_WM_INITDIALOG(hwnd, wParam, lParam, fn) \
        (LRESULT)(DWORD)(UINT)(BOOL)(fn)((hwnd), (HWND)(wParam), lParam)
    处理WM_INITDIALOG消息你可以看到MFC给出的标准的消息处理的函数原型
    void OnMButtonDblClk(UINT nFlags, CPoint point);处理WM_MBUTTONDBLCLK,你可以对应着第一个宏看
    virtual BOOL OnInitDialog();虚函数处理WM_INITDIALOG消息的,你可以对应着第二个宏看
      

  4.   

    谢谢楼上~ 不过我没玩过MFC,是Win32 SDK的程序分析,
    我刚学VC的,还没敢去碰MFC呢,先在看SDK编程
    -------------
    看来还是继续摸索。。