home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / win_lrn / hooks / menuhelp / wndproc.c < prev   
Encoding:
C/C++ Source or Header  |  1988-04-28  |  4.9 KB  |  195 lines

  1. #include "windows.h"
  2. #include "APP.h"
  3. #include "stdlib.h"
  4. #include "string.h"
  5.  
  6. /* Static definitions */
  7. FARPROC lpprocHook;
  8. FARPROC lplpfnNextHook;
  9.  
  10. /* Keep track of the application's window handle for hook processing */
  11. HWND hApp;
  12.  
  13. /* Function proto-types */
  14. void FAR PASCAL InitHook( HWND );
  15. BOOL FAR PASCAL KillHook();
  16. DWORD FAR PASCAL Hook( int, WORD, LPMSG );
  17.  
  18. extern HANDLE hInst;
  19.  
  20. extern APPCommand( HWND, WORD, LONG );
  21. extern APPPaint  ( HWND, WORD, LONG );
  22.  
  23. long FAR PASCAL WndProc( HWND, unsigned, WORD, LONG );
  24. BOOL FAR PASCAL About( HWND, unsigned, WORD, LONG );
  25.  
  26.  
  27. long FAR PASCAL WndProc( hWnd, message, wParam, lParam )
  28. HWND hWnd;
  29. unsigned message;
  30. WORD wParam;
  31. LONG lParam;
  32. {
  33.     FARPROC lpprocAbout;
  34.  
  35.     switch (message)
  36.     {
  37.     case WM_SYSCOMMAND:
  38.         switch (wParam)
  39.         {
  40.         case IDSABOUT:
  41.             /* Bind callback function with module instance */
  42.             lpprocAbout = MakeProcInstance( (FARPROC)About, hInst);
  43.             DialogBox( hInst, MAKEINTRESOURCE(ABOUTBOX), hWnd, lpprocAbout );
  44.             FreeProcInstance( (FARPROC)About );
  45.             break;
  46.         default:
  47.             return DefWindowProc( hWnd, message, wParam, lParam );
  48.         }
  49.         break;
  50.  
  51.     case WM_COMMAND:
  52.         switch (wParam) {
  53.            case IDAPPMENU:
  54.                 APPCommand( hWnd, wParam, lParam );
  55.                 break;
  56.            default:
  57.                 return DefWindowProc( hWnd, message, wParam, lParam );
  58.         }
  59.         break;
  60.  
  61.     case WM_CREATE:
  62.         InitHook( hWnd );
  63.         break;
  64.  
  65.     case WM_DESTROY:
  66.         KillHook();
  67.         PostQuitMessage( 0 );
  68.         break;
  69.  
  70.     case WM_PAINT:
  71.         APPPaint( hWnd, wParam, lParam );
  72.         break;
  73.  
  74.     default:
  75.         return DefWindowProc( hWnd, message, wParam, lParam );
  76.         break;
  77.     }
  78.     return(0L);
  79. }
  80. /*
  81. */
  82.  
  83.  
  84. BOOL FAR PASCAL About( hDlg, message, wParam, lParam )
  85. HWND hDlg;
  86. unsigned message;
  87. WORD wParam;
  88. LONG lParam;
  89. {
  90.     if (message == WM_COMMAND) {
  91.         EndDialog( hDlg, TRUE );
  92.         return TRUE;
  93.         }
  94.     else if (message == WM_INITDIALOG)
  95.         return TRUE;
  96.     else return FALSE;
  97. }
  98. /*
  99. */
  100.  
  101.  
  102. /* Set the HOOK */
  103. void FAR PASCAL InitHook( hWnd )
  104. HWND hWnd;
  105. {
  106.         hApp = hWnd;
  107.  
  108.         lpprocHook = MakeProcInstance( (FARPROC)Hook, hInst);
  109.         lplpfnNextHook = SetWindowsHook( WH_MSGFILTER, lpprocHook );
  110.  
  111.         return;
  112. }
  113. /*
  114. */
  115.  
  116. /* Remove the HOOK */
  117. BOOL FAR PASCAL KillHook()
  118. {
  119.         BOOL fSuccess;
  120.  
  121.         fSuccess = UnhookWindowsHook( WH_MSGFILTER, lpprocHook );
  122.         FreeProcInstance( lpprocHook );
  123.  
  124.         return fSuccess;
  125. }
  126. /*
  127. */
  128.  
  129. /* Hook function */
  130. DWORD FAR PASCAL Hook( nCode, wParam, lParam )
  131. int nCode;
  132. WORD wParam;
  133. LPMSG lParam;
  134. {
  135.         HDC hDC;
  136.         TEXTMETRIC tmFontInfo;
  137.         RECT rRect;
  138.         int TextHeight;
  139.         WORD y;
  140.  
  141.         if ((nCode != MSGF_MENU) || (lParam->message != WM_MENUSELECT) ) {
  142.             DefHookProc( nCode, wParam, lParam, (FARPROC FAR *)&lplpfnNextHook );
  143.             return 0;
  144.         }
  145.  
  146.         hDC = GetDC( hApp );
  147.         GetTextMetrics( hDC, (LPTEXTMETRIC)&tmFontInfo );
  148.         TextHeight = tmFontInfo.tmExternalLeading + tmFontInfo.tmHeight;
  149.         GetClientRect( hApp, (LPRECT)&rRect );
  150.         y = rRect.bottom - TextHeight;
  151.         switch (lParam->wParam) {
  152.            case SC_CLOSE:
  153.               TextOut( hDC, 0, y, (LPSTR)"Close the application ", 22 );
  154.               break;
  155.            case SC_MAXIMIZE:
  156.               TextOut( hDC, 0, y, (LPSTR)"Enlarge to full size  ", 22 );
  157.               break;
  158.            case SC_MINIMIZE:
  159.               TextOut( hDC, 0, y, (LPSTR)"Reduce window to icon ", 22 );
  160.               break;
  161.            case SC_MOVE:
  162.               TextOut( hDC, 0, y, (LPSTR)"Change window position", 22 );
  163.               break;
  164.            case SC_RESTORE:
  165.               TextOut( hDC, 0, y, (LPSTR)"Restore to normal size", 22 );
  166.               break;
  167.            case SC_SIZE:
  168.               TextOut( hDC, 0, y, (LPSTR)"Change window size    ", 22 );
  169.               break;
  170.            
  171.            case IDAPPMENU:
  172.               TextOut( hDC, 0, y, (LPSTR)"Item 1 highlighted    ", 22 );
  173.               break;
  174.            case IDAPPMENU+1:
  175.               TextOut( hDC, 0, y, (LPSTR)"Item 2 highlighted    ", 22 );
  176.               break;
  177.            case IDAPPMENU+2:
  178.               TextOut( hDC, 0, y, (LPSTR)"Item 3 highlighted    ", 22 );
  179.               break;
  180.            case IDHELP:
  181.               TextOut( hDC, 0, y, (LPSTR)"HELP the poor user    ", 22 );
  182.               break;
  183.            case IDSABOUT:
  184.               TextOut( hDC, 0, y, (LPSTR)"Program information   ", 22 );
  185.               break;
  186.  
  187.            default:
  188.               TextOut( hDC, 0, y, (LPSTR)"                      ", 22 );
  189.               break;
  190.         }
  191.         ReleaseDC( hApp, hDC );
  192.         DefHookProc( nCode, wParam, lParam, (FARPROC FAR *)&lplpfnNextHook );
  193.         return 0;
  194. }
  195.