DISPATCH.C
上传用户:woweijixie
上传日期:2018-12-11
资源大小:131k
文件大小:5k
源码类别:

TAPI编程

开发平台:

Visual C++

  1. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  2. // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  3. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  4. // PARTICULAR PURPOSE.
  5. //
  6. // Copyright (C) 1995  Microsoft Corporation.  All Rights Reserved.
  7. //
  8. //  MODULE:   dispatch.c
  9. //
  10. //  PURPOSE:  Implement the generic message and command dispatchers.
  11. //    
  12. //
  13. //  FUNCTIONS:
  14. //    DispMessage - Call the function associated with a message.
  15. //    DispCommand - Call the function associated with a command.
  16. //    DispDefault - Call the appropriate default window procedure.
  17. //
  18. //  COMMENTS:
  19. //
  20. #include <windows.h>            // required for all Windows applications
  21. #include <windowsx.h>
  22. #include "globals.h"            // prototypes specific to this application
  23. LRESULT DispDefault(EDWP, HWND, UINT, WPARAM, LPARAM);
  24. //
  25. //  FUNCTION: DispMessage(LPMSDI, HWND, UINT, WPARAM, LPARAM)
  26. //
  27. //  PURPOSE: Call the function associated with a message.
  28. //
  29. //  PARAMETERS:
  30. //    lpmsdi - Structure containing the message dispatch information.
  31. //    hwnd - The window handle
  32. //    uMessage - The message number
  33. //    wparam - Message specific data
  34. //    lparam - Message specific data
  35. //
  36. //  RETURN VALUE:
  37. //    The value returned by the message function that was called.
  38. //
  39. //  COMMENTS:
  40. //    Runs the table of messages stored in lpmsdi->rgmsd searching
  41. //    for a message number that matches uMessage.  If a match is found,
  42. //    call the associated function.  Otherwise, call DispDefault to
  43. //    call the default function, if any, associated with the message
  44. //    structure.  In either case, return the value recieved from the
  45. //    message or default function.
  46. //
  47. LRESULT DispMessage(LPMSDI lpmsdi, 
  48.                     HWND   hwnd, 
  49.                     UINT   uMessage, 
  50.                     WPARAM wparam, 
  51.                     LPARAM lparam)
  52. {
  53.     int  imsd = 0;
  54.     MSD *rgmsd = lpmsdi->rgmsd;
  55.     int  cmsd  = lpmsdi->cmsd;
  56.     for (imsd = 0; imsd < cmsd; imsd++)
  57.     {
  58.         if (rgmsd[imsd].uMessage == uMessage)
  59.             return rgmsd[imsd].pfnmsg(hwnd, uMessage, wparam, lparam);
  60.     }
  61.     return DispDefault(lpmsdi->edwp, hwnd, uMessage, wparam, lparam);
  62. }
  63. //
  64. //  FUNCTION: DispCommand(LPCMDI, HWND, WPARAM, LPARAM)
  65. //
  66. //  PURPOSE: Call the function associated with a command.
  67. //
  68. //  PARAMETERS:
  69. //    lpcmdi - Structure containing the command dispatch information.
  70. //    hwnd - The window handle
  71. //    GET_WM_COMMAND_ID(wparam, lparam) - Identifier of the menu item,
  72. //      control, or accelerator.
  73. //    GET_WM_COMMAND_CMD(wparam, lparam) - Notification code.
  74. //    GET_WM_COMMAND_HWND(wparam, lparam) - The control handle or NULL.
  75. //
  76. //  RETURN VALUE:
  77. //    The value returned by the command function that was called.
  78. //
  79. //  COMMENTS:
  80. //    Runs the table of commands stored in lpcmdi->rgcmd searching
  81. //    for a command number that matches wCommand.  If a match is found,
  82. //    call the associated function.  Otherwise, call DispDefault to
  83. //    call the default function, if any, associated with the command
  84. //    structure.  In either case, return the value recieved from the
  85. //    command or default function.
  86. //
  87. LRESULT DispCommand(LPCMDI lpcmdi, 
  88.                     HWND   hwnd, 
  89.                     WPARAM wparam, 
  90.                     LPARAM lparam)
  91. {
  92.     LRESULT lRet = 0;
  93.     WORD    wCommand = GET_WM_COMMAND_ID(wparam, lparam);
  94.     int     icmd;
  95.     CMD    *rgcmd = lpcmdi->rgcmd;
  96.     int     ccmd  = lpcmdi->ccmd;
  97.     // Message packing of wparam and lparam have changed for Win32,
  98.     // so use the GET_WM_COMMAND macro to unpack the commnad
  99.     for (icmd = 0; icmd < ccmd; icmd++)
  100.     {
  101.         if (rgcmd[icmd].wCommand == wCommand)
  102.         {
  103.             return rgcmd[icmd].pfncmd(hwnd,
  104.                                       wCommand,
  105.                                       GET_WM_COMMAND_CMD(wparam, lparam),
  106.                                       GET_WM_COMMAND_HWND(wparam, lparam));
  107.         }
  108.     }
  109.     return DispDefault(lpcmdi->edwp, hwnd, WM_COMMAND, wparam, lparam);
  110. }
  111. //
  112. //  FUNCTION: DispDefault(EDWP, HWND, UINT, WPARAM, LPARAM)
  113. //
  114. //  PURPOSE: Call the appropriate default window procedure.
  115. //
  116. //  PARAMETERS:
  117. //    edwp - Enumerate specifying the appropriate default winow procedure.
  118. //    hwnd - The window handle
  119. //    uMessage - The message number
  120. //    wparam - Message specific data
  121. //    lparam - Message specific data
  122. //
  123. //  RETURN VALUE:
  124. //    If there is a default proc, return the value returned by the
  125. //    default proc.  Otherwise, return 0.
  126. //
  127. //  COMMENTS:
  128. //    Calls the default procedure associated with edwp using the specified
  129. //    parameters.
  130. //
  131. LRESULT DispDefault(EDWP   edwp, 
  132.                     HWND   hwnd, 
  133.                     UINT   uMessage, 
  134.                     WPARAM wparam, 
  135.                     LPARAM lparam)
  136. {
  137.     switch (edwp)
  138.     {
  139.         case edwpNone:
  140.             return 0;
  141.         case edwpWindow:
  142.             return DefWindowProc(hwnd, uMessage, wparam, lparam);
  143.         case edwpDialog:
  144.             return DefDlgProc(hwnd, uMessage, wparam, lparam);
  145.         case edwpMDIFrame:
  146.             return DefFrameProc(hwnd, hwndMDIClient, uMessage, wparam, lparam);
  147.         case edwpMDIChild:
  148.             return DefMDIChildProc(hwnd, uMessage, wparam, lparam);
  149.     }
  150.     return 0;
  151. }