1. 是谁产生的lParam和wParam传给windowproc? 这两个值通常都是什么?
2. 什么过程触发了windowproc的调用? DispatchMessage()? 还有什么函数会触发windowproc?
3. 在函数的结尾,为什么最后还要DefWindowProc? 不调用不行么?
请简单举例
谢谢!!!!!

解决方案 »

  1.   

    补充一点,windowproc函数实现里面,通常switch msg的类型,但是WM_COMMAND的时候,判断lParam==0,然后LOWORD(菜单或者是按钮的ID)。问题: 什么情况下,msg类型是WM_COMMAND的时候,lParam!=0呢?
    谢谢
      

  2.   

    2 是消息处理时调用, 其参数就是消息中的wParam和lParam
    1 这两个值通常都和相应的消息相关, 不同的消息值的意义通常都不一样, 详情查MSDN
    3 末尾调用DefWindowProc是使用默认的消息处理函数
    对于WM_COMMAND消息类型,MSDN解说如下
    WM_COMMAND
    The WM_COMMAND message is sent when the user selects a command item from a menu, when a control sends a notification message to its parent window, or when an accelerator keystroke is translated. WM_COMMAND 
    wNotifyCode = HIWORD(wParam); // notification code 
    wID = LOWORD(wParam);         // item, control, or accelerator identifier 
    hwndCtl = (HWND) lParam;      // handle of control 
     
    Parameters
    wNotifyCode 
    Value of the high-order word of wParam. Specifies the notification code if the message is from a control. If the message is from an accelerator, this parameter is 1. If the message is from a menu, this parameter is 0. 
    wID 
    Value of the low-order word of wParam. Specifies the identifier of the menu item, control, or accelerator. 
    hwndCtl 
    Value of lParam. Handle to the control sending the message if the message is from a control. Otherwise, this parameter is NULL. 
      

  3.   

    >>是谁产生的lParam和wParam传给windowproc? 这两个值通常都是什么?
      系统自动产生的,系统为每个窗口维护一个消息对列.lParam和wParam 因系统消息的不同而不用,比较直观的列子: 在窗口上移动鼠标会产生WM_MOUSEMOVE消息,lParam参数的高字是光标的y坐标值,低字是光标的x坐标值.
    2. 什么过程触发了windowproc的调用? DispatchMessage()? 还有什么函数会触发windowproc?
      从程序的角度看,是DispatchMessage()函数,当然也有其它函数也能间接触发.
      消息处理基本过程:
               系统为窗口维护一个消息对列,当有消息时,程序调用GetMessage()获取消息,并作适当处理(一般不处理),再DispatchMessage()传递给系统,
               系统把属于本窗口的消息交给windowpro(),假设有自己不想处理的消息怎么办,直接交给DefWindowProc函数(多文档窗口里面叫DefFrameProc),
               消息处理基本结束.   
    3. 在函数的结尾,为什么最后还要DefWindowProc? 不调用不行么?
       2 已回答,不调用不行,再说了,那么多消息自己用程序也处理不完
     其实windowpro()函数只是系统给的一个接口,得按它的要求办事.
    4.什么情况下,msg类型是WM_COMMAND的时候,lParam!=0呢?
       是控件产生WM_COMMAND 消息时,比如 button.有问题,多看MSDN.