home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / clrwhl11.zip / dllsrc / editcol.c next >
C/C++ Source or Header  |  1998-01-28  |  10KB  |  206 lines

  1. //=========================================================================\
  2. // editcol.c : color wheel dlg procedure                                   |
  3. // version 1.1                                                             |
  4. //=========================================================================/
  5.  
  6. #pragma strings(readonly)
  7.  
  8. #define INCL_WIN
  9. //#define INCL_GPI
  10. #define INCL_DOSMODULEMGR
  11. #define INCL_DOSMISC
  12. #include <os2.h>
  13. #include "editcol.h"
  14.  
  15.  
  16. //=========================================================================\
  17. // WinEditColorDlg():                                                      |
  18. // parameters: ----------------------------------------------------------- |
  19. // HWND hwndParent  : parent handle                                        |
  20. // HWND hwndOwner   : owner handle                                         |
  21. // COLOR color      : RGB color (LONG)                                     |
  22. // PSZ pszTitle     : dialog title                                         |
  23. // returned value: ------------------------------------------------------- |
  24. // LONG lColor      : RGB color (success), CLR_ERROR (failure)             |
  25. //=========================================================================/
  26.  
  27.  
  28. LONG _Export APIENTRY WinEditColorDlg(HWND hwndParent,
  29.                                       HWND hwndOwner,
  30.                                       COLOR color,
  31.                                       PSZ pszTitle) {
  32.    PAPPDATA pad;
  33.    ULONG i;
  34.  
  35.    // allocate storage for application data
  36.    if (DosAllocMem((PPVOID)&pad, sizeof(APPDATA),
  37.        PAG_READ | PAG_WRITE | PAG_COMMIT))
  38.       return CLR_ERROR;
  39.    // initialize APPDATA structure (size)
  40.    pad->cbSize = sizeof(APPDATA);
  41.    // anchor block
  42.    pad->hab = WinQueryAnchorBlock(hwndOwner);
  43.    // window handles
  44.    pad->hwndParent = hwndParent;
  45.    pad->hwndOwner = hwndOwner;
  46.    // query the OS version
  47.    DosQuerySysInfo(QSV_VERSION_MINOR, QSV_VERSION_MINOR,
  48.                    &pad->ulVer, sizeof(ULONG));
  49.    // sets msg value according to OS version
  50.    if (pad->ulVer > 30) {                  // warp 4
  51.       pad->cwChangedMsg = WM_COLORWHEELCHANGED;
  52.       pad->cwSetMsg = CWM_COLORWHEELSETVAL;
  53.    } else {                                // warp 3 (warp 2?)
  54.       pad->cwChangedMsg = WM_COLORWHEELCHANGED3;
  55.       pad->cwSetMsg = CWM_COLORWHEELSETVAL3;
  56.    } /* endif */
  57.    // register the color wheel control
  58.    if (NULLHANDLE == (pad->hlib = WinLoadLibrary(pad->hab, "WPCONFIG.DLL")))
  59.       return CLR_ERROR;
  60.    // get the module handle to load the dialog from the DLL
  61.    if (DosQueryModuleHandle(SZ_MODULE, &pad->hDlgMod))
  62.       return CLR_ERROR;
  63.    // copy the start color
  64.    pad->clrCurr.lClr = pad->clrUndo.lClr = color;
  65.    // gets the dialog title, if pszTitle is NULL set the default
  66.    if (!pszTitle) pszTitle = SZ_DEFTITLE;
  67.    // code equivalent to strncpy to make DLL smaller
  68.    for (i = 0;
  69.         pad->achDlgTitle[i++] = *pszTitle++;
  70.         i == MAXTITLESIZE - 1? pad->achDlgTitle[i] = 0, pszTitle = "": 0);
  71.    return (LONG)WinDlgBox(hwndParent,
  72.                           hwndOwner,
  73.                           EditColorDlgProc,
  74.                           pad->hDlgMod,
  75.                           DLG_CWHEEL,
  76.                           pad);
  77. }
  78.  
  79.  
  80. //=========================================================================\
  81. // EditColorDlgProc(): color wheel dlg procedure                           |
  82. // processed messages: - WM_INITDLG                                        |
  83. //                     - WM_COLORWHEELCHANGED                              |
  84. //                     - WM_CONTROL                                        |
  85. //                     - WM_COMMAND                                        |
  86. //                     - WM_CLOSE                                          |
  87. //                     - WM_DESTROY                                        |
  88. //=========================================================================/
  89.  
  90. MRESULT EXPENTRY EditColorDlgProc(HWND hwnd,
  91.                                   ULONG msg,
  92.                                   MPARAM mp1,
  93.                                   MPARAM mp2) {
  94.    switch (msg) {
  95.    // init -----------------------------------------------------------------
  96.       case WM_INITDLG: {
  97.          PAPPDATA pad = (PAPPDATA)mp2;
  98.          WinSetWindowPtr(hwnd, 0L, (PVOID)mp2);
  99.          WinSetWindowText(hwnd, pad->achDlgTitle);
  100.          SetSpins(hwnd, pad->clrUndo); // initialize spinbutton
  101.          // initialize the color wheel control
  102.          WinSendDlgItemMsg(hwnd, CWHEEL, pad->cwSetMsg,
  103.                            (MPARAM)pad->clrUndo.lClr, MPVOID);
  104.          pad->flUpd = TRUE;            // sets the update flag
  105.          // show the dialog in the middle of the parent window
  106.          WinQueryWindowRect(pad->hwndParent, &pad->rclPar);
  107.          WinQueryWindowRect(hwnd, &pad->rcl);
  108.          WinSetWindowPos(hwnd, NULLHANDLE,
  109.                          (pad->rclPar.xRight - pad->rcl.xRight) / 2,
  110.                          (pad->rclPar.yTop - pad->rcl.yTop) / 2,
  111.                          0, 0, SWP_MOVE | SWP_SHOW);
  112.          break;
  113.       } // end case WM_INITDLG
  114.    // a new color has been set through the color wheel ---------------------
  115.       case WM_COLORWHEELCHANGED3:
  116.       case WM_COLORWHEELCHANGED: {
  117.          PAPPDATA pad = WinQueryWindowPtr(hwnd, 0L);
  118.          pad->clrCurr.lClr = (LONG)mp1;
  119.          pad->flUpd = FALSE;           // reset update flag
  120.          SetSpins(hwnd, pad->clrCurr);
  121.          pad->flUpd = TRUE;            // set update flag
  122.          // notify new color to owner
  123.          WinSendMsg(pad->hwndOwner, msg, mp1, mp2);
  124.          break;
  125.       } // end case WM_COLORWHEELCHANGED
  126.    // spinbutton value has changed -----------------------------------------
  127.       case WM_CONTROL:
  128.          if ((SHORT1FROMMP(mp1) == SPN_RED ||      // if a spin button
  129.               SHORT1FROMMP(mp1) == SPN_GREEN ||    // originated SPBN_CHANGE
  130.               SHORT1FROMMP(mp1) == SPN_BLUE) &&    // or SPBN_ENDSPIN
  131.              (SHORT2FROMMP(mp1) == SPBN_CHANGE ||
  132.               SHORT2FROMMP(mp1) == SPBN_ENDSPIN)) {
  133.             PAPPDATA pad = WinQueryWindowPtr(hwnd, 0L);
  134.             ULONG ulVal;
  135.             if (!pad->flUpd) break; // value changed on init or by colorwheel
  136.             // query new spinbutton value
  137.             WinSendMsg(HWNDFROMMP(mp2), SPBM_QUERYVALUE,
  138.                        (MPARAM)&ulVal, MPFROM2SHORT(0, SPBQ_ALWAYSUPDATE));
  139.             switch (SHORT1FROMMP(mp1)) {
  140.                case SPN_RED:     pad->clrCurr.rgb.red = (BYTE)ulVal; break;
  141.                case SPN_GREEN:   pad->clrCurr.rgb.grn = (BYTE)ulVal; break;
  142.                default:          pad->clrCurr.rgb.blu = (BYTE)ulVal; break;
  143.             } /* endswitch */
  144.             WinSendDlgItemMsg(hwnd, CWHEEL, pad->cwSetMsg,// update colorwheel
  145.                               (MPARAM)pad->clrCurr.lClr, MPVOID);
  146.             WinSendMsg(pad->hwndOwner, pad->cwChangedMsg, // notify owner
  147.                           (MPARAM)pad->clrCurr.lClr, MPVOID);
  148.          } // end if
  149.          break;
  150.    // user clicked on a PUSHBUTTON -----------------------------------------
  151.       case WM_COMMAND: {
  152.          PAPPDATA pad = WinQueryWindowPtr(hwnd, 0L);
  153.          switch ((USHORT)mp1) {
  154.             case BTN_OK:            // OK: return current color
  155.                WinDismissDlg(hwnd, pad->clrCurr.lClr);
  156.                break;
  157.             case BTN_UNDO:          // UNDO: restore start color
  158.                SetSpins(hwnd, pad->clrUndo);
  159.                WinSendDlgItemMsg(hwnd, CWHEEL, pad->cwSetMsg,
  160.                                  (MPARAM)pad->clrUndo.lClr, MPVOID);
  161.                break;
  162.             default:                // CANCEL: return start color
  163.                WinDismissDlg(hwnd, pad->clrUndo.lClr);
  164.               break;
  165.          } /* endswitch */
  166.          break;
  167.       } // end case WM_COMMAND
  168.    // user closed the "edit color" dialog window ---------------------------
  169.       case WM_CLOSE: {              // return start color
  170.          PAPPDATA pad = WinQueryWindowPtr(hwnd, 0L);
  171.          WinDismissDlg(hwnd, pad->clrUndo.lClr);
  172.          break;
  173.       } // end case WM_CLOSE
  174.       case WM_DESTROY: {
  175.          PAPPDATA pad = WinQueryWindowPtr(hwnd, 0L);
  176.          WinDeleteLibrary(pad->hab, pad->hlib);
  177.          DosFreeMem(pad);
  178.          break;
  179.       } // end case WM_DESTROY
  180.       default:
  181.          return WinDefDlgProc(hwnd, msg, mp1, mp2);
  182.    } /* endswitch */
  183.    return (MRESULT)FALSE;
  184. }
  185.  
  186.  
  187. //=========================================================================\
  188. // SetSpins() : sets the spinbutton values on initialization and when a    |
  189. //              new color is set through the Color Wheel control           |
  190. // parameters: ----------------------------------------------------------- |
  191. // HWND hwnd  : window handle                                              |
  192. // CLR clr    : RGB color structure containing new RGB values              |
  193. // returned value: ------------------------------------------------------- |
  194. // VOID                                                                    |
  195. //=========================================================================/
  196.  
  197.  
  198. VOID SetSpins(HWND hwnd, CLR clr) {
  199.    WinSendDlgItemMsg(hwnd, SPN_RED, SPBM_SETCURRENTVALUE,
  200.                      (MPARAM)clr.rgb.red, MPVOID);
  201.    WinSendDlgItemMsg(hwnd, SPN_GREEN, SPBM_SETCURRENTVALUE,
  202.                      (MPARAM)clr.rgb.grn, MPVOID);
  203.    WinSendDlgItemMsg(hwnd, SPN_BLUE, SPBM_SETCURRENTVALUE,
  204.                      (MPARAM)clr.rgb.blu, MPVOID);
  205. }
  206.