home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / primcuts.zip / FrameWindowTricks / StatusBarWindow.c < prev    next >
Text File  |  2000-05-26  |  3KB  |  131 lines

  1. #pragma strings(readonly)
  2.  
  3. #define INCL_WINWINDOWMGR
  4. #define INCL_WINMESSAGEMGR
  5.  
  6. #include <os2.h>
  7.  
  8. #include <malloc.h>
  9. #include <memory.h>
  10. #include <string.h>
  11. #include <stdlib.h>
  12.  
  13. #include "StatusbarWindow.h"
  14.  
  15. #define TEXTLIMIT                        512
  16.  
  17. #define DB_RAISED    0x0400
  18. #define DB_DEPRESSED 0x0800
  19.  
  20.  
  21. typedef struct _WINDOWDATA
  22. {
  23.    PSZ pszText;
  24.    ULONG cchText;
  25. }WINDOWDATA, *PWINDOWDATA;
  26.  
  27.  
  28. static MRESULT EXPENTRY WindowProcedure(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2);
  29.  
  30.  
  31. BOOL _Optlink registerStatusbarWindow(HAB hab)
  32. {
  33.    return WinRegisterClass(hab, WC_STATUSBAR, WindowProcedure, CS_SIZEREDRAW | CS_CLIPSIBLINGS, sizeof(PWINDOWDATA));
  34. }
  35.  
  36.  
  37.  
  38. static MRESULT EXPENTRY WindowProcedure(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  39. {
  40.    MRESULT mReturn = 0;
  41.    BOOL fHandled = TRUE;
  42.    HPS hps;
  43.    RECTL rect;
  44.    PWINDOWDATA wd = (PWINDOWDATA)WinQueryWindowPtr(hwnd, 0);
  45.  
  46.    switch(msg)
  47.    {
  48.       case WM_CREATE:
  49.          wd = (PWINDOWDATA)malloc(sizeof(WINDOWDATA));
  50.          if(wd)
  51.          {
  52.             PCREATESTRUCT pCREATE = (PCREATESTRUCT)mp2;
  53.  
  54.             memset(wd, 0, sizeof(WINDOWDATA));
  55.             wd->pszText = malloc(TEXTLIMIT);
  56.             if(pCREATE->pszText)
  57.             {
  58.                wd->cchText = min(strlen(pCREATE->pszText), TEXTLIMIT);
  59.                memcpy(wd->pszText, pCREATE->pszText, wd->cchText);
  60.             }
  61.             WinSetWindowPtr(hwnd, 0, wd);
  62.          }
  63.          break;
  64.  
  65.       case WM_PAINT:
  66.          hps = WinBeginPaint(hwnd, NULLHANDLE, &rect);
  67.          if(hps)
  68.          {
  69.             RECTL r;
  70.  
  71.             WinQueryWindowRect(hwnd, &r);
  72.  
  73.             WinDrawBorder(hps, &r, 1, 1, CLR_WHITE, CLR_BLACK, DB_RAISED);
  74.             r.xLeft++;
  75.             r.yBottom++;
  76.             r.xRight--;
  77.             r.yTop--;
  78.             WinDrawBorder(hps, &r, 2, 2, CLR_PALEGRAY, CLR_PALEGRAY, 0UL);
  79.  
  80.             r.xLeft+=2;
  81.             r.yBottom+=2;
  82.             r.xRight-=2;
  83.             r.yTop-=2;
  84.             WinDrawBorder(hps, &r, 1, 1, CLR_WHITE, CLR_BLACK, DB_DEPRESSED);
  85.             r.xLeft++;
  86.             r.yBottom++;
  87.             r.xRight--;
  88.             r.yTop--;
  89.  
  90.             WinDrawText(hps, wd->cchText, wd->pszText, &r, CLR_BLACK, CLR_PALEGRAY, DT_LEFT | DT_VCENTER | DT_ERASERECT);
  91.  
  92.             WinEndPaint(hps);
  93.          }
  94.          break;
  95.  
  96.       case WM_SETWINDOWPARAMS:
  97.          {
  98.             PWNDPARAMS pwndparams = (PWNDPARAMS)mp1;
  99.  
  100.             switch(pwndparams->fsStatus)
  101.             {
  102.                case WPM_TEXT:
  103.                   wd->cchText = min(pwndparams->cchText, TEXTLIMIT);
  104.                   memcpy(wd->pszText, pwndparams->pszText, wd->cchText);
  105.                   WinInvalidateRect(hwnd, NULL, FALSE);
  106.                   mReturn = (MRESULT)TRUE;
  107.                   break;
  108.  
  109.                default:
  110.                   fHandled = FALSE;
  111.                   break;
  112.             }
  113.          }
  114.          break;
  115.  
  116.       case WM_DESTROY:
  117.          free(wd->pszText);
  118.          free(wd);
  119.          break;
  120.  
  121.       default:
  122.          fHandled = FALSE;
  123.          break;
  124.    }
  125.    if(!fHandled)
  126.    {
  127.       mReturn = WinDefWindowProc(hwnd, msg, mp1, mp2);
  128.    }
  129.    return mReturn;
  130. }
  131.