home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast.iso / pcmag / vol11n15.zip / OBJWND.C < prev    next >
C/C++ Source or Header  |  1992-05-19  |  3KB  |  144 lines

  1. /* OBJWND.C -- "object windows" from WMHANDLER */
  2.  
  3. #include "windows.h"
  4. #include "objwnd.h"
  5.  
  6. static WMHANDLER wmhandler[WM_USER] = {0};
  7.  
  8. #define MAX_EXTRA    32
  9.  
  10. typedef struct {
  11.     WORD message;
  12.     WMHANDLER handler;
  13.     } EXTRAHANDLER;
  14.  
  15. static EXTRAHANDLER extrahandler[MAX_EXTRA] = {0};
  16. static int num_extra = 0;
  17.  
  18. static int isextramsg(WORD message)
  19. {
  20.     EXTRAHANDLER *pex;
  21.     int i;
  22.     for (i=0, pex=extrahandler; i<MAX_EXTRA; i++, pex++)
  23.         if (pex->message == message)
  24.             return i;
  25.     return -1;
  26. }
  27.  
  28. static long defwmhandler(HWND hwnd, WORD msg, WORD wParam, LONG lParam)
  29. {   
  30.     return DefWindowProc(hwnd, msg, wParam, lParam);
  31. }
  32.  
  33. static BOOL did_init = FALSE;
  34. void objwnd_init(void)
  35. {
  36.     EXTRAHANDLER *pex;
  37.     WMHANDLER *pwm;
  38.     int i;
  39.     for (i=0, pwm=wmhandler; i < WM_USER; i++, pwm++) 
  40.         *pwm = defwmhandler;
  41.     for (i=0, pex=extrahandler; i < MAX_EXTRA; i++, pex++)
  42.     {
  43.         pex->message = 0;
  44.         pex->handler = defwmhandler;
  45.     }
  46.     did_init = TRUE;
  47. }
  48.  
  49. long FAR PASCAL _export WndProc(HWND hWnd, WORD message, 
  50.     WORD wParam, LONG lParam)
  51. {
  52.     int iExtraMsg;
  53.     
  54.     if (message < WM_USER)
  55.         return (*wmhandler[message])(hWnd, message, wParam, lParam);
  56.     else if ((iExtraMsg = isextramsg(message)) != -1)
  57.         return (*extrahandler[iExtraMsg].handler)(hWnd, 
  58.             message, wParam, lParam);
  59.     else
  60.         return DefWindowProc(hWnd, message, wParam, lParam);
  61. }
  62.  
  63. WMHANDLER on(unsigned message, WMHANDLER f)
  64. {
  65.     WMHANDLER oldf;
  66.     int iExtraMsg;
  67.     
  68.     if (! did_init)    
  69.         objwnd_init();
  70.         
  71.     if (message < WM_USER)
  72.     {
  73.         oldf = wmhandler[message];
  74.         wmhandler[message] = f ? f : defwmhandler;
  75.         return (oldf) ? oldf : defwmhandler;
  76.     }
  77.     else if ((iExtraMsg = isextramsg(message)) != -1)
  78.     {
  79.         oldf = extrahandler[iExtraMsg].handler;
  80.         extrahandler[iExtraMsg].handler = f ? f : defwmhandler;
  81.         return (oldf) ? oldf : defwmhandler;
  82.     }
  83.     else if (num_extra < MAX_EXTRA)
  84.     {
  85.         extrahandler[num_extra].message = message;
  86.         extrahandler[num_extra].handler = f;
  87.         num_extra++;
  88.         return defwmhandler;
  89.     }
  90.     else
  91.         return -1;    // couldn't set!
  92. }
  93.  
  94. HWND objwnd(HANDLE hPrevInst, HANDLE hInst, char *name)
  95. {
  96.     static HWND hwnd = 0;
  97.     
  98.     if (hwnd)        
  99.         return hwnd;
  100.     
  101.     if (! did_init)    
  102.         objwnd_init();
  103.         
  104.     if (! hPrevInst)
  105.     {
  106.         WNDCLASS wndclass;
  107.         memset(&wndclass, 0, sizeof(wndclass));
  108.         wndclass.lpfnWndProc = WndProc;
  109.         wndclass.hInstance = hInst;
  110.         wndclass.hbrBackground = GetStockObject(WHITE_BRUSH);
  111.         wndclass.lpszClassName = "OBJECTWND";
  112.         if (! RegisterClass(&wndclass))
  113.             return 0;
  114.     }
  115.     
  116.     hwnd = CreateWindow("OBJECTWND", name, 
  117.         WS_OVERLAPPEDWINDOW,
  118.         CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, 
  119.         NULL, NULL, hInst, NULL);
  120.     return hwnd;
  121. }
  122.  
  123. int mainloop(void)
  124. {
  125.     MSG msg;
  126.     while (GetMessage(&msg, NULL, 0, 0))
  127.     {
  128.         TranslateMessage(&msg);
  129.         DispatchMessage(&msg);
  130.     }
  131.     return msg.wParam;
  132. }
  133.  
  134. void yield(void)
  135. {
  136.     MSG msg;
  137.     if (GetMessage(&msg, NULL, 0, 0))
  138.     {
  139.         TranslateMessage(&msg);
  140.         DispatchMessage(&msg);
  141.     }
  142. }
  143.  
  144.