home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / primcuts.zip / DebugTerminal / sample / ClientWindow.c next >
Text File  |  2000-08-26  |  7KB  |  254 lines

  1. #pragma strings(readonly)
  2.  
  3. #define INCL_WINWINDOWMGR
  4. #define INCL_WINMLE
  5. #define INCL_WINBUTTONS
  6. #define INCL_WINERRORS
  7. #define INCL_GPILOGCOLORTABLE
  8. #define INCL_DOSERRORS
  9.  
  10. #include <os2.h>
  11.  
  12. #include <memory.h>
  13. #include <stdlib.h>
  14.  
  15. #ifdef DEBUG_TERM
  16. #include <stdio.h>
  17. #endif
  18.  
  19.  
  20. #include "resource.h"
  21.  
  22.  
  23. typedef struct _WINDOWDATA
  24. {
  25.    LONG lBGColor;
  26.    HWND hwndMLE;
  27.    HWND hwndButton1;
  28.    HWND hwndButton2;
  29. }WINDOWDATA, *PWINDOWDATA;
  30.  
  31.  
  32. #define QWP_WINDOWDATA                   0
  33. #define QWP_HEAP                         QWP_WINDOWDATA+sizeof(PWINDOWDATA)
  34. #define QW_EXTRA                         QWP_HEAP+sizeof(PVOID)
  35.  
  36.  
  37. static MRESULT EXPENTRY WindowProcedure(HWND hWnd, ULONG msg, MPARAM mp1, MPARAM mp2);
  38. static MRESULT _Optlink processCreateMessage(HWND hWnd, MPARAM mp1, MPARAM mp2);
  39. static void _Optlink processPaintMessage(HWND hWnd);
  40. static void _Optlink processRandomColorMessage(HWND hWnd);
  41. static void _Optlink processRandomGrayMessage(HWND hWnd);
  42. static void _Optlink processSizeMessage(HWND hWnd, MPARAM mp1, MPARAM mp2);
  43. static void _Optlink processDestroyMessage(HWND hWnd);
  44.  
  45.  
  46.  
  47. BOOL _Optlink registerClientClass(HAB hAB)
  48. {
  49.    LONG lLength = 0;
  50.    char pszClientClass[64] = "";
  51.    BOOL fSuccess = FALSE;
  52.  
  53.    lLength = WinLoadString(hAB, (HMODULE)NULLHANDLE, IDS_CLIENTCLASS, sizeof(pszClientClass), pszClientClass);
  54.    if(lLength != 0L)
  55.    {
  56.       fSuccess = WinRegisterClass(hAB, pszClientClass, WindowProcedure, CS_CLIPCHILDREN, QW_EXTRA);
  57.    }
  58.    return fSuccess;
  59. }
  60.  
  61. static MRESULT EXPENTRY WindowProcedure(HWND hWnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  62. {
  63.    MRESULT mReturn = 0;
  64.    BOOL fHandled = TRUE;
  65.  
  66.    switch(msg)
  67.    {
  68.       case WM_CREATE:
  69.          processCreateMessage(hWnd, mp1, mp2);
  70.          break;
  71.  
  72.       case WM_PAINT:
  73.          processPaintMessage(hWnd);
  74.          break;
  75.  
  76.       case WM_COMMAND:
  77.          switch(SHORT1FROMMP(mp1))
  78.          {
  79.             case BN_RANDOM_COLOR:
  80.                processRandomColorMessage(hWnd);
  81.                break;
  82.  
  83.             case BN_RANDOM_GRAY:
  84.                processRandomGrayMessage(hWnd);
  85.                break;
  86.  
  87.             default:
  88.                fHandled = FALSE;
  89.                break;
  90.          }
  91.          break;
  92.  
  93.       case WM_SIZE:
  94.          processSizeMessage(hWnd, mp1, mp2);
  95.          break;
  96.  
  97.       case WM_DESTROY:
  98.          processDestroyMessage(hWnd);
  99.          break;
  100.  
  101.       default:
  102.          fHandled = FALSE;
  103.          break;
  104.    }
  105.    if(!fHandled)
  106.       mReturn = WinDefWindowProc(hWnd, msg, mp1, mp2);
  107.  
  108.    return mReturn;
  109. }
  110.  
  111. static MRESULT _Optlink processCreateMessage(HWND hWnd, MPARAM mp1, MPARAM mp2)
  112. {
  113.    BOOL fAbort = TRUE;
  114.    APIRET rc = NO_ERROR;
  115.    PWINDOWDATA pWindowData = NULL;
  116.    PVOID pAlloc = NULL;
  117.  
  118.    rc = DosAllocMem(&pAlloc, sizeof(WINDOWDATA), PAG_READ | PAG_WRITE | PAG_COMMIT);
  119.    if(rc == NO_ERROR)
  120.    {
  121.       LONG lLength = 0;
  122.       ULONG flMLEstyle = MLS_BORDER | MLS_WORDWRAP | WS_VISIBLE;
  123.       ULONG flBnStyle = BS_PUSHBUTTON | WS_VISIBLE;
  124.       char pszTitle[64] = "";
  125.       HAB hAB = WinQueryAnchorBlock(hWnd);
  126.  
  127.       pWindowData = pAlloc;
  128.  
  129.       memset(pWindowData, 0, sizeof(WINDOWDATA));
  130.  
  131.       pWindowData->hwndMLE = WinCreateWindow(hWnd, WC_MLE, NULL, flMLEstyle, 10, 10, 120, 50, hWnd, HWND_TOP, MLE_EDITOR, NULL, NULL);
  132.  
  133.       if(pWindowData->hwndMLE)
  134.       {
  135.          lLength = WinLoadString(hAB, (HMODULE)NULLHANDLE, IDS_BUTTON1, sizeof(pszTitle), pszTitle);
  136.          if(lLength != 0L)
  137.          {
  138.             pWindowData->hwndButton1 = WinCreateWindow(hWnd, WC_BUTTON, pszTitle, flBnStyle, 170, 80, 100, 40, hWnd, HWND_TOP, BN_RANDOM_COLOR, NULL, NULL);
  139.          }
  140.       }
  141.  
  142.       if(pWindowData->hwndButton1)
  143.       {
  144.          lLength = WinLoadString(hAB, (HMODULE)NULLHANDLE, IDS_BUTTON2, sizeof(pszTitle), pszTitle);
  145.          if(lLength != 0L)
  146.          {
  147.             pWindowData->hwndButton2 = WinCreateWindow(hWnd, WC_BUTTON, pszTitle, flBnStyle, 170, 50, 100, 40, hWnd, HWND_TOP, BN_RANDOM_GRAY, NULL, NULL);
  148.          }
  149.       }
  150.  
  151.       if(pWindowData->hwndButton2)
  152.       {
  153.          WinSetWindowPtr(hWnd, QWP_WINDOWDATA, pWindowData);
  154.  
  155.          fAbort = FALSE;
  156.       }
  157.       else
  158.       {
  159. #ifdef DEBUG_TERM
  160.          puts("e processCreateMessage() failed");
  161. #endif
  162.          DosFreeMem(pWindowData);
  163.       }
  164.    }
  165.  
  166.    return (MRESULT)fAbort;
  167. }
  168.  
  169. static void _Optlink processRandomColorMessage(HWND hWnd)
  170. {
  171.    PWINDOWDATA pWindowData = (PWINDOWDATA)WinQueryWindowPtr(hWnd, QWP_WINDOWDATA);
  172.    LONG lRed = rand() % 256;
  173.    LONG lGreen = rand() % 256;
  174.    LONG lBlue = rand() % 256;
  175.    LONG lColor = (lRed<<16) + (lGreen<<8) + lBlue;
  176.  
  177. #ifdef DEBUG_TERM
  178.    printf("i New background RGB(%d,%d,%d)\n", lRed, lGreen, lBlue);
  179. #endif
  180.  
  181.    pWindowData->lBGColor = lColor;
  182.  
  183.    WinInvalidateRect(hWnd, NULL, FALSE);
  184. }
  185.  
  186. static void _Optlink processRandomGrayMessage(HWND hWnd)
  187. {
  188.    PWINDOWDATA pWindowData = (PWINDOWDATA)WinQueryWindowPtr(hWnd, QWP_WINDOWDATA);
  189.    LONG lRed = rand() % 256;
  190.    LONG lGreen = lRed;
  191.    LONG lBlue = lGreen;
  192.    LONG lColor = (lRed<<16) + (lGreen<<8) + lBlue;
  193.  
  194. #ifdef DEBUG_TERM
  195.    printf("i New background Gray(%d)\n", lRed);
  196. #endif
  197.  
  198.    pWindowData->lBGColor = lColor;
  199.  
  200.    WinInvalidateRect(hWnd, NULL, FALSE);
  201. }
  202.  
  203. static void _Optlink processPaintMessage(HWND hWnd)
  204. {
  205.    RECTL rect = { 0, 0, 0, 0 };
  206.    HPS hPS = WinBeginPaint(hWnd, NULLHANDLE, &rect);
  207.  
  208.    if(hPS)
  209.    {
  210.       PWINDOWDATA pWindowData = (PWINDOWDATA)WinQueryWindowPtr(hWnd, QWP_WINDOWDATA);
  211.  
  212.       GpiCreateLogColorTable(hPS, 0UL, LCOLF_RGB, 0UL, 0UL, NULL);
  213.  
  214.       WinFillRect(hPS, &rect, pWindowData->lBGColor);
  215.  
  216.       WinEndPaint(hPS);
  217.    }
  218.    else
  219.    {
  220. #ifdef DEBUG_TERM
  221.       printf("w WinBeginPaint() failed. PM error %u\n", LOUSHORT(WinGetLastError(WinQueryAnchorBlock(hWnd))));
  222. #endif
  223.    }
  224. }
  225.  
  226. static void _Optlink processSizeMessage(HWND hWnd, MPARAM mp1, MPARAM mp2)
  227. {
  228.    SHORT scxold = SHORT1FROMMP(mp1);
  229.    SHORT scyold = SHORT2FROMMP(mp1);
  230.    SHORT scxnew = SHORT1FROMMP(mp2);
  231.    SHORT scynew = SHORT2FROMMP(mp2);
  232.  
  233. #ifdef DEBUG_TERM
  234.    printf("i Size changed (%d,%d) -> (%d,%d)\n", scxold, scyold, scxnew, scynew);
  235. #endif
  236.  
  237.    WinSetWindowPos(WinWindowFromID(hWnd, MLE_EDITOR),      HWND_TOP,  10, 10, 130, 100, SWP_MOVE | SWP_SIZE);
  238.  
  239.    WinSetWindowPos(WinWindowFromID(hWnd, BN_RANDOM_COLOR), HWND_TOP, 150, 110-37, 120, 32, SWP_MOVE | SWP_SIZE);
  240.  
  241.    WinSetWindowPos(WinWindowFromID(hWnd, BN_RANDOM_GRAY),  HWND_TOP, 150, 15, 120, 32, SWP_MOVE | SWP_SIZE);
  242. }
  243.  
  244. static void _Optlink processDestroyMessage(HWND hWnd)
  245. {
  246.    PWINDOWDATA pWindowData = (PWINDOWDATA)WinQueryWindowPtr(hWnd, QWP_WINDOWDATA);
  247.  
  248. #ifdef DEBUG_TERM
  249.    puts("i Destroying window");
  250. #endif
  251.  
  252.    DosFreeMem(pWindowData);
  253. }
  254.