home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: Graphics / Graphics.zip / bmviewer.zip / FrameSubProc.c < prev    next >
Text File  |  2000-07-09  |  3KB  |  120 lines

  1. #pragma strings(readonly)
  2.  
  3. #define INCL_WINWINDOWMGR
  4. #define INCL_WINFRAMEMGR
  5. #define INCL_WINSCROLLBARS
  6.  
  7. #include <os2.h>
  8.  
  9. #include <malloc.h>
  10. #include <memory.h>
  11.  
  12.  
  13. #include "FrameSubProc.h"
  14.  
  15.  
  16. typedef struct _WINDOWDATA
  17. {
  18.    PFNWP pfnOldProc;
  19.    ULONG ulMaxWidth;                     /* Maximum width of frame */
  20.    ULONG ulMaxHeight;                    /* Maximum height of frame */
  21.    HWND hwndClient;
  22.    HWND hwndVertScroll;
  23.    HWND hwndHorzScroll;
  24. }WINDOWDATA, *PWINDOWDATA;
  25.  
  26.  
  27. /*
  28.  * Function prototypes - Local
  29.  */
  30. static MRESULT EXPENTRY SubProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
  31.  
  32.  
  33.  
  34. BOOL _Optlink subclassFrameWindow(HWND hwndFrame)
  35. {
  36.    BOOL fSuccess = FALSE;
  37.    PWINDOWDATA wd = NULL;
  38.  
  39.    /*
  40.     * Sub allocate frame window
  41.     */
  42.    wd = (PWINDOWDATA)malloc(sizeof(WINDOWDATA));
  43.    if(wd)
  44.    {
  45.       memset(wd, 0, sizeof(WINDOWDATA));
  46.  
  47.       WinSetWindowULong(hwndFrame, QWL_USER, (ULONG)wd);
  48.  
  49.       wd->hwndClient = WinWindowFromID(hwndFrame, FID_CLIENT);
  50.  
  51.       /*
  52.        * Create scrollbars. See #2 in notes.text
  53.        */
  54.       wd->hwndHorzScroll = WinCreateWindow(HWND_OBJECT, WC_SCROLLBAR, NULL, WS_VISIBLE | SBS_HORZ, 0L, 0L, 0L, 0L, hwndFrame, HWND_TOP, FID_HORZSCROLL, NULL, NULL);
  55.       wd->hwndVertScroll = WinCreateWindow(HWND_OBJECT, WC_SCROLLBAR, NULL, WS_VISIBLE | SBS_VERT, 0L, 0L, 0L, 0L, hwndFrame, HWND_TOP, FID_VERTSCROLL, NULL, NULL);
  56.  
  57.       wd->pfnOldProc = WinSubclassWindow(hwndFrame, SubProc);
  58.       if(wd->pfnOldProc != 0L)
  59.       {
  60.          fSuccess = TRUE;
  61.       }
  62.       else
  63.       {
  64.          free(wd);
  65.       }
  66.    }
  67.    return fSuccess;
  68. }
  69.  
  70.  
  71. static MRESULT EXPENTRY SubProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  72. {
  73.    MRESULT mReturn = 0;
  74.    BOOL fHandled = TRUE;
  75.    PWINDOWDATA wd = (PWINDOWDATA)WinQueryWindowPtr(hwnd, 0);
  76.  
  77.    switch(msg)
  78.    {
  79.       case WM_TRACKFRAME:
  80.          /*
  81.           * In a perfect world, message is posted directly to the worker thread.
  82.           */
  83.          WinSendMsg(wd->hwndClient, WM_TRACKFRAME, mp1, MPVOID);
  84.  
  85.          /*
  86.           * Must call old window procedure or tracking will be disabled.
  87.           */
  88.          return (*wd->pfnOldProc)(hwnd, msg, mp1, mp2);
  89.  
  90.       case WMU_QUERY_SCROLLBAR_HANDLES:
  91.          /*
  92.           * Since the scrollbars are created with HWND_OBJECT as their parents, the worker thread can not simply use
  93.           * WinWindowFromID() to get the scrollbar handles. This messages allows the worker thread to get the
  94.           * scrollbar handles in a secure fashion.
  95.           */
  96.          *(PULONG)mp1 = wd->hwndHorzScroll;
  97.          *(PULONG)mp2 = wd->hwndVertScroll;
  98.          break;
  99.  
  100.       case WM_DESTROY:
  101.          (*wd->pfnOldProc)(hwnd, msg, mp1, mp2);
  102.  
  103.          /*
  104.           * Reset subclassing and free window buffer
  105.           */
  106.          WinSubclassWindow(hwnd, wd->pfnOldProc);
  107.          free(wd);
  108.          break;
  109.  
  110.       default:
  111.          fHandled = FALSE;
  112.          break;
  113.    }
  114.    if(!fHandled)
  115.    {
  116.       mReturn = (*wd->pfnOldProc)(hwnd, msg, mp1, mp2);
  117.    }
  118.    return mReturn;
  119. }
  120.