home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Programmer's Library 1.3 / Microsoft-Programers-Library-v1.3.iso / sampcode / os2sdk / os2sdk12 / linefrac / lfdlg.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-07-05  |  20.4 KB  |  870 lines

  1. /************************************************************************
  2. *
  3. *   lfdlg.c -- Window procedures for dialog boxes used in LineFractal.
  4. *
  5. *   Created by Microsoft Corporation, 1989
  6. *
  7. ************************************************************************/
  8.  
  9. #define INCL_WIN
  10. #define INCL_GPI
  11. #include <os2.h>
  12.  
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <math.h>
  16.  
  17. #define INCL_GLOBALS
  18. #define INCL_THREADS
  19. #include "linefrac.h"
  20.  
  21. #define INCL_LFDLG
  22. #define INCL_LFUTIL
  23. #include "lffuncs.h"
  24.  
  25.  
  26.  
  27.  
  28. /************************************************************************
  29. *
  30. *   Global Variables
  31. *
  32. *   global    Global data block.
  33. *
  34. ************************************************************************/
  35.  
  36. extern GLOBALDATA global;
  37.  
  38.  
  39.  
  40.  
  41. /************************************************************************
  42. *
  43. *   AboutDlg
  44. *
  45. *   Process messages for the About box.
  46. *
  47. ************************************************************************/
  48.  
  49. ULONG CALLBACK
  50. AboutDlg(hwnd, usMsg, mp1, mp2)
  51. HWND   hwnd;
  52. USHORT usMsg;
  53. MPARAM mp1;
  54. MPARAM mp2;
  55. {
  56.     switch (usMsg)
  57.     {
  58.     case WM_COMMAND:            /* the user has pressed a button */
  59.     switch (SHORT1FROMMP(mp1))    /* which button? */
  60.     {
  61.     case IDD_OK:
  62.     case IDD_CANCEL:
  63.         WinDismissDlg(hwnd, TRUE);
  64.         break;
  65.  
  66.     default:
  67.         return FALSE;
  68.     }
  69.     break;
  70.  
  71.     default:
  72.     return (ULONG) WinDefDlgProc(hwnd, usMsg, mp1, mp2);
  73.     }
  74.     return FALSE;
  75. }
  76.  
  77.  
  78.  
  79.  
  80. /************************************************************************
  81. *
  82. *   TimerDelayDlg
  83. *
  84. *   Process messages for the dialog box used to set the timer delay
  85. *   values for automatically restarting a drawing.
  86. *
  87. ************************************************************************/
  88.  
  89. ULONG CALLBACK
  90. TimerDelayDlg(hwnd, usMsg, mp1, mp2)
  91. HWND   hwnd;
  92. USHORT usMsg;
  93. MPARAM mp1;
  94. MPARAM mp2;
  95. {
  96.     BOOL fRet = FALSE;
  97.  
  98.     switch (usMsg)
  99.     {
  100.     case WM_INITDLG:
  101.     MySetWindowUShort(hwnd, IDD_MINDELAY, global.usMinTimerDelay);
  102.     MySetWindowUShort(hwnd, IDD_MAXDELAY, global.usMaxTimerDelay);
  103.     return FALSE;
  104.  
  105.     case WM_COMMAND:
  106.     switch (SHORT1FROMMP(mp1))
  107.         {
  108.     case IDD_OK:
  109.         MyGetWindowUShort(hwnd, IDD_MINDELAY, &global.usMinTimerDelay);
  110.         MyGetWindowUShort(hwnd, IDD_MAXDELAY, &global.usMaxTimerDelay);
  111.  
  112.         fRet = TRUE;
  113.  
  114.         /* fall through to some common code */
  115.  
  116.     case IDD_CANCEL:
  117.         WinDismissDlg(hwnd, fRet);
  118.             break;
  119.  
  120.         default:
  121.         return FALSE;
  122.         }
  123.         break;
  124.  
  125.     default:
  126.     return (ULONG) WinDefDlgProc(hwnd, usMsg, mp1, mp2);
  127.     }
  128.     return FALSE;
  129. }
  130.  
  131.  
  132.  
  133.  
  134. /************************************************************************
  135. *
  136. *   BitmapParamsDlg
  137. *
  138. *   Process messages for the bitmap parameters dialog box.
  139. *
  140. ************************************************************************/
  141.  
  142. ULONG CALLBACK
  143. BitmapParamsDlg( hwnd, usMsg, mp1, mp2 )
  144. HWND   hwnd;
  145. USHORT usMsg;
  146. MPARAM mp1;
  147. MPARAM mp2;
  148. {
  149.     BOOL fRet = FALSE;
  150.  
  151.     switch (usMsg)
  152.     {
  153.     case WM_INITDLG:
  154.  
  155.     MySetWindowUShort(hwnd, IDD_BMCX,     global.bm.cx);
  156.     MySetWindowUShort(hwnd, IDD_BMCY,     global.bm.cy);
  157.     MySetWindowUShort(hwnd, IDD_BMPLANES, global.bm.cPlanes);
  158.     MySetWindowUShort(hwnd, IDD_BMBPP,    global.bm.cBitCount);
  159.  
  160.     return FALSE;
  161.  
  162.     case WM_COMMAND:
  163.     switch (SHORT1FROMMP(mp1))
  164.         {
  165.     case IDD_OK:
  166.  
  167.         MyGetWindowUShort(hwnd, IDD_BMCX,      &global.bm.cx);
  168.         MyGetWindowUShort(hwnd, IDD_BMCY,      &global.bm.cy);
  169.         MyGetWindowUShort(hwnd, IDD_BMPLANES, &global.bm.cPlanes);
  170.         MyGetWindowUShort(hwnd, IDD_BMBPP,      &global.bm.cBitCount);
  171.  
  172.         fRet = TRUE;
  173.  
  174.         /* fall through to some common code */
  175.  
  176.     case IDD_CANCEL:
  177.         WinDismissDlg(hwnd, fRet);
  178.             break;
  179.  
  180.         default:
  181.         return FALSE;
  182.         }
  183.         break;
  184.  
  185.     default:
  186.     return (ULONG) WinDefDlgProc(hwnd, usMsg, mp1, mp2);
  187.     }
  188.     return FALSE;
  189. }
  190.  
  191.  
  192.  
  193.  
  194. /************************************************************************
  195. *
  196. *   SwitchDelayDlg
  197. *
  198. *   Process messages for the dialog box used to set the switch
  199. *   delay value for automatically switching between threads.
  200. *
  201. ************************************************************************/
  202.  
  203. ULONG CALLBACK
  204. SwitchDelayDlg(hwnd, usMsg, mp1, mp2)
  205. HWND   hwnd;
  206. USHORT usMsg;
  207. MPARAM mp1;
  208. MPARAM mp2;
  209. {
  210.     BOOL fRet = FALSE;
  211.  
  212.     switch (usMsg)
  213.     {
  214.     case WM_INITDLG:
  215.     MySetWindowUShort(hwnd, IDD_SWITCHDELAY, global.usSwitchDelay);
  216.     return FALSE;
  217.  
  218.     case WM_COMMAND:
  219.     switch (SHORT1FROMMP(mp1))
  220.         {
  221.     case IDD_OK:
  222.         MyGetWindowUShort(hwnd, IDD_SWITCHDELAY, &global.usSwitchDelay);
  223.  
  224.         fRet = TRUE;
  225.  
  226.         /* fall through to some common code */
  227.  
  228.     case IDD_CANCEL:
  229.         WinDismissDlg(hwnd, fRet);
  230.             break;
  231.  
  232.         default:
  233.         return FALSE;
  234.         }
  235.         break;
  236.  
  237.     default:
  238.     return (ULONG) WinDefDlgProc(hwnd, usMsg, mp1, mp2);
  239.     }
  240.     return FALSE;
  241. }
  242.  
  243.  
  244.  
  245.  
  246. /************************************************************************
  247. *
  248. *   LineAttrsDlg
  249. *
  250. *   Process messages for the line attributes dialog box.
  251. *
  252. ************************************************************************/
  253.  
  254. #define SETLINEATTR(H, I, J)                          \
  255.     MySetWindow##I(hwnd, J, global.lb.H)
  256.  
  257. #define GETLINEATTR(H, I, J, K, L)                      \
  258.     {                                  \
  259.         J temp;                              \
  260.         MyGetWindow##I(hwnd, K, &temp);                  \
  261.         if (temp != global.lb.H)                      \
  262.         {                                  \
  263.         global.lb.H = temp;                      \
  264.         global.flLineAttrs |= L;                  \
  265.         }                                  \
  266.     }
  267.  
  268. ULONG CALLBACK
  269. LineAttrsDlg( hwnd, usMsg, mp1, mp2 )
  270. HWND   hwnd;
  271. USHORT usMsg;
  272. MPARAM mp1;
  273. MPARAM mp2;
  274. {
  275.     BOOL fRet = FALSE;
  276.  
  277.     switch (usMsg)
  278.     {
  279.     case WM_INITDLG:
  280.  
  281.     if (!global.fUpdateAttrs || !(global.flLineAttrs & LFA_LINEALL))
  282.         global.lb = global.pThrTop->lb;
  283.  
  284.     SETLINEATTR(lColor,    Long,    IDD_LINECOLOR);
  285.     SETLINEATTR(usMixMode,    UShort, IDD_LINEMIX);
  286.     SETLINEATTR(fxWidth,    Long,    IDD_LINEWIDTH);
  287.     SETLINEATTR(lGeomWidth, Long,    IDD_LINEGEOMWIDTH);
  288.     SETLINEATTR(usType,    UShort, IDD_LINETYPE);
  289.     SETLINEATTR(usEnd,    UShort, IDD_LINEEND);
  290.     SETLINEATTR(usJoin,    UShort, IDD_LINEJOIN);
  291.  
  292.     return FALSE;
  293.  
  294.     case WM_COMMAND:
  295.     switch (SHORT1FROMMP(mp1))
  296.         {
  297.     case IDD_OK:
  298.  
  299.         GETLINEATTR(lColor,     Long,   LONG,   IDD_LINECOLOR,     LFA_LINECOLOR);
  300.         GETLINEATTR(usMixMode,  UShort, USHORT, IDD_LINEMIX,       LFA_LINEMIX);
  301.         GETLINEATTR(fxWidth,    Long,   LONG,   IDD_LINEWIDTH,     LFA_LINEWIDTH);
  302.         GETLINEATTR(lGeomWidth, Long,   LONG,   IDD_LINEGEOMWIDTH, LFA_LINEGEOMWIDTH);
  303.         GETLINEATTR(usType,     UShort, USHORT, IDD_LINETYPE,      LFA_LINETYPE);
  304.         GETLINEATTR(usEnd,        UShort, USHORT, IDD_LINEEND,       LFA_LINEEND);
  305.         GETLINEATTR(usJoin,     UShort, USHORT, IDD_LINEJOIN,      LFA_LINEJOIN);
  306.  
  307.         if (global.flLineAttrs & LFA_LINEALL)
  308.         {
  309.         global.pThrTop->fUpdateAttrs = TRUE;
  310.         global.fUpdateAttrs = TRUE;
  311.         }
  312.  
  313.         fRet = TRUE;
  314.  
  315.         /* fall through to some common code */
  316.  
  317.     case IDD_CANCEL:
  318.         WinDismissDlg(hwnd, fRet);
  319.             break;
  320.  
  321.         default:
  322.         return FALSE;
  323.         }
  324.         break;
  325.  
  326.     default:
  327.     return (ULONG) WinDefDlgProc(hwnd, usMsg, mp1, mp2);
  328.     }
  329.     return FALSE;
  330. }
  331. #undef SETLINEATTR
  332. #undef GETLINEATTR
  333.  
  334.  
  335.  
  336.  
  337. /************************************************************************
  338. *
  339. *   MarkerAttrsDlg
  340. *
  341. *   Process messages for the marker attributes dialog box.
  342. *
  343. ************************************************************************/
  344.  
  345. #define SETMARKATTR(H, I, J)                          \
  346.     MySetWindow##I(hwnd, J, global.mb.H)
  347.  
  348. #define GETMARKATTR(H, I, J, K, L)                      \
  349.     {                                  \
  350.         J temp;                              \
  351.         MyGetWindow##I(hwnd, K, &temp);                  \
  352.         if (temp != global.mb.H)                      \
  353.         {                                  \
  354.         global.mb.H = temp;                      \
  355.         global.flMarkerAttrs |= L;                  \
  356.         }                                  \
  357.     }
  358.  
  359. ULONG CALLBACK
  360. MarkerAttrsDlg( hwnd, usMsg, mp1, mp2 )
  361. HWND   hwnd;
  362. USHORT usMsg;
  363. MPARAM mp1;
  364. MPARAM mp2;
  365. {
  366.     BOOL fRet = FALSE;
  367.  
  368.     switch (usMsg)
  369.     {
  370.     case WM_INITDLG:
  371.  
  372.     if (!global.fUpdateAttrs || !(global.flMarkerAttrs & LFA_MARKALL))
  373.         global.mb = global.pThrTop->mb;
  374.  
  375.     SETMARKATTR(lColor,       Long,   IDD_MARKCOLOR);
  376.     SETMARKATTR(lBackColor,    Long,   IDD_MARKBACKCOLOR);
  377.     SETMARKATTR(usMixMode,       UShort, IDD_MARKMIX);
  378.     SETMARKATTR(usBackMixMode, UShort, IDD_MARKBACKMIX);
  379.     SETMARKATTR(usSet,       UShort, IDD_MARKSET);
  380.     SETMARKATTR(usSymbol,       UShort, IDD_MARKSYMBOL);
  381.     SETMARKATTR(sizfxCell.cx,  Long,   IDD_MARKCELLWIDTH);
  382.     SETMARKATTR(sizfxCell.cy,  Long,   IDD_MARKCELLHEIGHT);
  383.  
  384.     return FALSE;
  385.  
  386.     case WM_COMMAND:
  387.     switch (SHORT1FROMMP(mp1))
  388.         {
  389.     case IDD_OK:
  390.  
  391.         GETMARKATTR(lColor,        Long,   LONG,   IDD_MARKCOLOR,      LFA_MARKCOLOR);
  392.         GETMARKATTR(lBackColor,    Long,   LONG,   IDD_MARKBACKCOLOR,  LFA_MARKBACKCOLOR);
  393.         GETMARKATTR(usMixMode,     UShort, USHORT, IDD_MARKMIX,      LFA_MARKMIX);
  394.         GETMARKATTR(usBackMixMode, UShort, USHORT, IDD_MARKBACKMIX,      LFA_MARKBACKMIX);
  395.         GETMARKATTR(usSet,           UShort, USHORT, IDD_MARKSET,      LFA_MARKSET);
  396.         GETMARKATTR(usSymbol,      UShort, USHORT, IDD_MARKSYMBOL,      LFA_MARKSYMBOL);
  397.         GETMARKATTR(sizfxCell.cx,  Long,   LONG,   IDD_MARKCELLWIDTH,  LFA_MARKCELLWIDTH);
  398.         GETMARKATTR(sizfxCell.cy,  Long,   LONG,   IDD_MARKCELLHEIGHT, LFA_MARKCELLHEIGHT);
  399.  
  400.         if (global.flMarkerAttrs & LFA_MARKALL)
  401.         {
  402.         global.pThrTop->fUpdateAttrs = TRUE;
  403.         global.fUpdateAttrs = TRUE;
  404.         }
  405.  
  406.         fRet = TRUE;
  407.  
  408.         /* fall through to some common code */
  409.  
  410.     case IDD_CANCEL:
  411.         WinDismissDlg(hwnd, fRet);
  412.             break;
  413.  
  414.         default:
  415.         return FALSE;
  416.         }
  417.         break;
  418.  
  419.     default:
  420.     return (ULONG) WinDefDlgProc(hwnd, usMsg, mp1, mp2);
  421.     }
  422.     return FALSE;
  423. }
  424. #undef SETMARKATTR
  425. #undef GETMARKATTR
  426.  
  427.  
  428.  
  429.  
  430. /************************************************************************
  431. *
  432. *   AreaAttrsDlg
  433. *
  434. *   Process messages for the area attributes dialog box.
  435. *
  436. ************************************************************************/
  437.  
  438. #define SETAREAATTR(H, I, J)                          \
  439.     MySetWindow##I(hwnd, J, global.ab.H)
  440.  
  441. #define GETAREAATTR(H, I, J, K, L)                      \
  442.     {                                  \
  443.         J temp;                              \
  444.         MyGetWindow##I(hwnd, K, &temp);                  \
  445.         if (temp != global.ab.H)                      \
  446.         {                                  \
  447.         global.ab.H = temp;                      \
  448.         global.flAreaAttrs |= L;                  \
  449.         }                                  \
  450.     }
  451.  
  452. ULONG CALLBACK
  453. AreaAttrsDlg( hwnd, usMsg, mp1, mp2 )
  454. HWND   hwnd;
  455. USHORT usMsg;
  456. MPARAM mp1;
  457. MPARAM mp2;
  458. {
  459.     BOOL fRet = FALSE;
  460.  
  461.     switch (usMsg)
  462.     {
  463.     case WM_INITDLG:
  464.  
  465.     if (!global.fUpdateAttrs || !(global.flAreaAttrs & LFA_AREAALL))
  466.         global.ab = global.pThrTop->ab;
  467.  
  468.     SETAREAATTR(lColor,       Long,   IDD_AREACOLOR);
  469.     SETAREAATTR(lBackColor,    Long,   IDD_AREABACKCOLOR);
  470.     SETAREAATTR(usMixMode,       UShort, IDD_AREAMIX);
  471.     SETAREAATTR(usBackMixMode, UShort, IDD_AREABACKMIX);
  472.     SETAREAATTR(usSet,       UShort, IDD_AREASET);
  473.     SETAREAATTR(usSymbol,       UShort, IDD_AREASYMBOL);
  474.     SETAREAATTR(ptlRefPoint.x, Long,   IDD_AREAREFX);
  475.     SETAREAATTR(ptlRefPoint.y, Long,   IDD_AREAREFY);
  476.  
  477.     return FALSE;
  478.  
  479.     case WM_COMMAND:
  480.     switch (SHORT1FROMMP(mp1))
  481.         {
  482.     case IDD_OK:
  483.  
  484.         GETAREAATTR(lColor,        Long,   LONG,   IDD_AREACOLOR,     LFA_AREACOLOR);
  485.         GETAREAATTR(lBackColor,    Long,   LONG,   IDD_AREABACKCOLOR, LFA_AREABACKCOLOR);
  486.         GETAREAATTR(usMixMode,     UShort, USHORT, IDD_AREAMIX,     LFA_AREAMIX);
  487.         GETAREAATTR(usBackMixMode, UShort, USHORT, IDD_AREABACKMIX,     LFA_AREABACKMIX);
  488.         GETAREAATTR(usSet,           UShort, USHORT, IDD_AREASET,     LFA_AREASET);
  489.         GETAREAATTR(usSymbol,      UShort, USHORT, IDD_AREASYMBOL,     LFA_AREASYMBOL);
  490.         GETAREAATTR(ptlRefPoint.x, Long,   LONG,   IDD_AREAREFX,     LFA_AREAREFX);
  491.         GETAREAATTR(ptlRefPoint.y, Long,   LONG,   IDD_AREAREFY,     LFA_AREAREFY);
  492.  
  493.         if (global.flAreaAttrs & LFA_AREAALL)
  494.         {
  495.         global.pThrTop->fUpdateAttrs = TRUE;
  496.         global.fUpdateAttrs = TRUE;
  497.         }
  498.  
  499.         fRet = TRUE;
  500.  
  501.         /* fall through to some common code */
  502.  
  503.     case IDD_CANCEL:
  504.         WinDismissDlg(hwnd, fRet);
  505.             break;
  506.  
  507.         default:
  508.         return FALSE;
  509.         }
  510.         break;
  511.  
  512.     default:
  513.     return (ULONG) WinDefDlgProc(hwnd, usMsg, mp1, mp2);
  514.     }
  515.     return FALSE;
  516. }
  517. #undef SETAREAATTR
  518. #undef GETAREAATTR
  519.  
  520.  
  521.  
  522.  
  523. /************************************************************************
  524. *
  525. *   ImageAttrsDlg
  526. *
  527. *   Process messages for the image attributes dialog box.
  528. *
  529. ************************************************************************/
  530.  
  531. #define SETIMAGEATTR(H, I, J)                          \
  532.     MySetWindow##I(hwnd, J, global.ib.H)
  533.  
  534. #define GETIMAGEATTR(H, I, J, K, L)                      \
  535.     {                                  \
  536.         J temp;                              \
  537.         MyGetWindow##I(hwnd, K, &temp);                  \
  538.         if (temp != global.ib.H)                      \
  539.         {                                  \
  540.         global.ib.H = temp;                      \
  541.         global.flImageAttrs |= L;                  \
  542.         }                                  \
  543.     }
  544.  
  545. ULONG CALLBACK
  546. ImageAttrsDlg( hwnd, usMsg, mp1, mp2 )
  547. HWND   hwnd;
  548. USHORT usMsg;
  549. MPARAM mp1;
  550. MPARAM mp2;
  551. {
  552.     BOOL fRet = FALSE;
  553.  
  554.     switch (usMsg)
  555.     {
  556.     case WM_INITDLG:
  557.  
  558.     if (!global.fUpdateAttrs || !(global.flImageAttrs & LFA_IMAGEALL))
  559.         global.ib = global.pThrTop->ib;
  560.  
  561.     SETIMAGEATTR(lColor,        Long,   IDD_IMAGECOLOR);
  562.     SETIMAGEATTR(lBackColor,    Long,   IDD_IMAGEBACKCOLOR);
  563.     SETIMAGEATTR(usMixMode,     UShort, IDD_IMAGEMIX);
  564.     SETIMAGEATTR(usBackMixMode, UShort, IDD_IMAGEBACKMIX);
  565.  
  566.     return FALSE;
  567.  
  568.     case WM_COMMAND:
  569.     switch (SHORT1FROMMP(mp1))
  570.         {
  571.     case IDD_OK:
  572.  
  573.         GETIMAGEATTR(lColor,    Long,    LONG,    IDD_IMAGECOLOR,       LFA_IMAGECOLOR);
  574.         GETIMAGEATTR(lBackColor,    Long,    LONG,    IDD_IMAGEBACKCOLOR, LFA_IMAGEBACKCOLOR);
  575.         GETIMAGEATTR(usMixMode,    UShort, USHORT, IDD_IMAGEMIX,       LFA_IMAGEMIX);
  576.         GETIMAGEATTR(usBackMixMode, UShort, USHORT, IDD_IMAGEBACKMIX,   LFA_IMAGEBACKMIX);
  577.  
  578.         if (global.flImageAttrs & LFA_IMAGEALL)
  579.         {
  580.         global.pThrTop->fUpdateAttrs = TRUE;
  581.         global.fUpdateAttrs = TRUE;
  582.         }
  583.  
  584.         fRet = TRUE;
  585.  
  586.         /* fall through to some common code */
  587.  
  588.     case IDD_CANCEL:
  589.         WinDismissDlg(hwnd, fRet);
  590.             break;
  591.  
  592.         default:
  593.         return FALSE;
  594.         }
  595.         break;
  596.  
  597.     default:
  598.     return (ULONG) WinDefDlgProc(hwnd, usMsg, mp1, mp2);
  599.     }
  600.     return FALSE;
  601. }
  602. #undef SETIMAGEATTR
  603. #undef GETIMAGEATTR
  604.  
  605.  
  606.  
  607.  
  608. /************************************************************************
  609. *
  610. *   MiscAttrsDlg
  611. *
  612. *   Process messages for the fractal attributes dialog box.
  613. *
  614. ************************************************************************/
  615.  
  616. #define SETMISCATTR(H, I, J)                          \
  617.     MySetWindow##I(hwnd, J, global.H)
  618.  
  619. #define GETMISCATTR(H, I, J, K, L)                      \
  620.     {                                  \
  621.         J temp;                              \
  622.         MyGetWindow##I(hwnd, K, &temp);                  \
  623.         if (temp != global.H)                      \
  624.         {                                  \
  625.         global.H = temp;                      \
  626.         global.flMiscAttrs |= L;                  \
  627.         }                                  \
  628.     }
  629.  
  630. ULONG CALLBACK
  631. MiscAttrsDlg( hwnd, usMsg, mp1, mp2 )
  632. HWND   hwnd;
  633. USHORT usMsg;
  634. MPARAM mp1;
  635. MPARAM mp2;
  636. {
  637.     BOOL fRet = FALSE;
  638.  
  639.     switch (usMsg)
  640.     {
  641.     case WM_INITDLG:
  642.  
  643.     if (!global.fUpdateAttrs || !(global.flMiscAttrs &
  644.         (LFA_RECURSION|LFA_CPTMAX|LFA_POLYGONSIDES|LFA_ROTATION)))
  645.     {
  646.         global.usRecursion      = global.pThrTop->usRecursion;
  647.         global.cptMax      = global.pThrTop->cptMax;
  648.         global.usPolygonSides = global.pThrTop->usPolygonSides;
  649.         global.dblRotation      = global.pThrTop->dblRotation;
  650.     }
  651.  
  652.     SETMISCATTR(usRecursion,    UShort, IDD_RECURSION);
  653.     SETMISCATTR(cptMax,        UShort, IDD_CPTMAX);
  654.     SETMISCATTR(usPolygonSides, UShort, IDD_NUMSIDES);
  655.     SETMISCATTR(dblRotation,    Double, IDD_ROTATION);
  656.  
  657.     return FALSE;
  658.  
  659.     case WM_COMMAND:
  660.     switch (SHORT1FROMMP(mp1))
  661.         {
  662.     case IDD_OK:
  663.  
  664.         GETMISCATTR(usRecursion,    UShort, USHORT, IDD_RECURSION, LFA_RECURSION);
  665.         GETMISCATTR(cptMax,     UShort, USHORT, IDD_CPTMAX,    LFA_CPTMAX);
  666.         GETMISCATTR(usPolygonSides, UShort, USHORT, IDD_NUMSIDES,  LFA_POLYGONSIDES);
  667.         GETMISCATTR(dblRotation,    Double, double, IDD_ROTATION,  LFA_ROTATION);
  668.  
  669.         if (global.flMiscAttrs & LFA_POLYGONSIDES)
  670.         if (global.usPolygonSides == 0)
  671.             global.usPolygonSides = 2;
  672.  
  673.         if (global.flMiscAttrs & LFA_CPTMAX)
  674.         {
  675.         if (global.cptMax == 0)
  676.             global.cptMax = 1;
  677.         else if (global.cptMax > MAX_POINT_COUNT)
  678.             global.cptMax = MAX_POINT_COUNT;
  679.         }
  680.  
  681.         if (global.flMiscAttrs & (LFA_RECURSION|LFA_CPTMAX|
  682.         LFA_POLYGONSIDES|LFA_ROTATION))
  683.         {
  684.         global.pThrTop->fUpdateAttrs = TRUE;
  685.         global.fUpdateAttrs = TRUE;
  686.         }
  687.  
  688.         fRet = TRUE;
  689.  
  690.         /* fall through to some common code */
  691.  
  692.     case IDD_CANCEL:
  693.         WinDismissDlg(hwnd, fRet);
  694.             break;
  695.  
  696.         default:
  697.         return FALSE;
  698.         }
  699.         break;
  700.  
  701.     default:
  702.     return (ULONG) WinDefDlgProc(hwnd, usMsg, mp1, mp2);
  703.     }
  704.     return FALSE;
  705. }
  706. #undef SETMISCATTR
  707. #undef GETMISCATTR
  708.  
  709.  
  710.  
  711.  
  712. /************************************************************************
  713. *
  714. *   DimensionsDlg
  715. *
  716. *   Process messages for the fractal dimensions dialog box.
  717. *
  718. ************************************************************************/
  719.  
  720. #define SETDIMENSIONS(H, I, J)                          \
  721.     MySetWindow##I(hwnd, J, global.H)
  722.  
  723. #define GETDIMENSIONS(H, I, J, K, L)                      \
  724.     {                                  \
  725.         J temp;                              \
  726.         MyGetWindow##I(hwnd, K, &temp);                  \
  727.         if (temp != global.H)                      \
  728.         {                                  \
  729.         global.H = temp;                      \
  730.         global.flMiscAttrs |= L;                  \
  731.         }                                  \
  732.     }
  733.  
  734. ULONG CALLBACK
  735. DimensionsDlg( hwnd, usMsg, mp1, mp2 )
  736. HWND   hwnd;
  737. USHORT usMsg;
  738. MPARAM mp1;
  739. MPARAM mp2;
  740. {
  741.     BOOL fRet = FALSE;
  742.  
  743.     switch (usMsg)
  744.     {
  745.     case WM_INITDLG:
  746.  
  747.     if (!global.fUpdateAttrs || !(global.flMiscAttrs &
  748.         (LFA_XOFF|LFA_YOFF|LFA_XSCALE|LFA_YSCALE)))
  749.     {
  750.         global.dblXOff   = global.pThrTop->dblXOff;
  751.         global.dblYOff   = global.pThrTop->dblYOff;
  752.         global.dblXScale = global.pThrTop->dblXScale;
  753.         global.dblYScale = global.pThrTop->dblYScale;
  754.     }
  755.  
  756.     SETDIMENSIONS(dblXOff,     Double, IDD_XOFF);
  757.     SETDIMENSIONS(dblYOff,     Double, IDD_YOFF);
  758.     SETDIMENSIONS(dblXScale, Double, IDD_XSCALE);
  759.     SETDIMENSIONS(dblYScale, Double, IDD_YSCALE);
  760.  
  761.     return FALSE;
  762.  
  763.     case WM_COMMAND:
  764.     switch (SHORT1FROMMP(mp1))
  765.         {
  766.     case IDD_OK:
  767.  
  768.         GETDIMENSIONS(dblXOff,   Double, double, IDD_XOFF,    LFA_XOFF);
  769.         GETDIMENSIONS(dblYOff,   Double, double, IDD_YOFF,    LFA_YOFF);
  770.         GETDIMENSIONS(dblXScale, Double, double, IDD_XSCALE, LFA_XSCALE);
  771.         GETDIMENSIONS(dblYScale, Double, double, IDD_YSCALE, LFA_YSCALE);
  772.  
  773.         if (global.flMiscAttrs & (LFA_XOFF|LFA_YOFF|LFA_XSCALE|LFA_YSCALE))
  774.         {
  775.         global.pThrTop->fUpdateAttrs = TRUE;
  776.         global.fUpdateAttrs = TRUE;
  777.         }
  778.  
  779.         fRet = TRUE;
  780.  
  781.         /* fall through to some common code */
  782.  
  783.     case IDD_CANCEL:
  784.         WinDismissDlg(hwnd, fRet);
  785.             break;
  786.  
  787.         default:
  788.         return FALSE;
  789.         }
  790.         break;
  791.  
  792.     default:
  793.     return (ULONG) WinDefDlgProc(hwnd, usMsg, mp1, mp2);
  794.     }
  795.     return FALSE;
  796. }
  797. #undef SETDIMENSIONS
  798. #undef GETDIMENSIONS
  799.  
  800.  
  801.  
  802.  
  803. /************************************************************************
  804. *
  805. *   PtrPreferencesDlg
  806. *
  807. *   Process messages for the mouse pointer preferences dialog box.
  808. *
  809. ************************************************************************/
  810.  
  811. #define SETPTRPREF(H, I, J)                    \
  812.     MySetWindow##I(hwnd, J, global.H)
  813.  
  814. #define GETPTRPREF(H, I, J)                    \
  815.     MyGetWindow##I(hwnd, J, &global.H)
  816.  
  817. ULONG CALLBACK
  818. PtrPreferencesDlg( hwnd, usMsg, mp1, mp2 )
  819. HWND   hwnd;
  820. USHORT usMsg;
  821. MPARAM mp1;
  822. MPARAM mp2;
  823. {
  824.     BOOL fRet = FALSE;
  825.  
  826.     switch (usMsg)
  827.     {
  828.     case WM_INITDLG:
  829.  
  830.     SETPTRPREF(usPtrThreshold, UShort, IDD_PTRTHRESHOLD);
  831.     WinSendDlgItemMsg(hwnd, global.usUserPtr+IDD_USERPTR0,
  832.               BM_SETCHECK, (MPARAM)TRUE, 0L);
  833.     return FALSE;
  834.  
  835.     case WM_COMMAND:
  836.     switch (SHORT1FROMMP(mp1))
  837.         {
  838.     case IDD_OK:
  839.  
  840.         GETPTRPREF(usPtrThreshold, UShort, IDD_PTRTHRESHOLD);
  841.         global.usUserPtr = SHORT1FROMMR( WinSendDlgItemMsg(hwnd, IDD_USERPTR0,
  842.                           BM_QUERYCHECKINDEX, 0L, 0L));
  843.  
  844. /*        if (global.usPtrThreshold < 0)
  845.         global.usPtrThreshold = 0; */
  846.  
  847.         if (!global.fAnimatePtr)
  848.         global.usCurPtr = global.usUserPtr;
  849.  
  850.         fRet = TRUE;
  851.  
  852.         /* fall through to some common code */
  853.  
  854.     case IDD_CANCEL:
  855.         WinDismissDlg(hwnd, fRet);
  856.             break;
  857.  
  858.         default:
  859.         return FALSE;
  860.         }
  861.         break;
  862.  
  863.     default:
  864.     return (ULONG) WinDefDlgProc(hwnd, usMsg, mp1, mp2);
  865.     }
  866.     return FALSE;
  867. }
  868. #undef SETPTRPREF
  869. #undef GETPTRPREF
  870.