--- pmsdk/samples/linefrac/linefrac.h 2018/08/09 12:28:13 1.1 +++ pmsdk/samples/linefrac/linefrac.h 2018/08/09 12:28:31 1.1.1.2 @@ -1,59 +1,232 @@ -/* - * Header file for LINEFRAC - * Created by Microsoft Corp., 1988 - */ - /**********************************************************************\ -* Resource Ids +* General include for LineFractal application +* +* Created by Microsoft Corporation, 1989 +* \**********************************************************************/ -#define ID_LINEFRACTAL 1 -#define IDD_ABOUT 2 -#define IDD_LINEFRAC 3 +/* + Type definition +*/ +typedef double far * PDBL; + + + +/* + Resource Ids for Linefractal application +*/ + +/* resources loaded via WinCreateStdWindow */ +#define IDR_LINEFRACTAL 0x01 + +/* pointers */ +#define IDR_TRACKINGPTR 0x10 +#define IDR_PASTINGPTR 0x11 +#define IDR_KOCH0 0x12 +#define IDR_KOCH1 0x13 +#define IDR_KOCH2 0x14 +#define IDR_KOCH3 0x15 + +/* dialog boxes */ +#define IDR_ABOUTDLG 0x20 +#define IDR_TIMERDELAYDLG 0x21 +#define IDR_BITMAPPARAMSDLG 0x22 +#define IDR_SWITCHDELAYDLG 0x23 +#define IDR_LINEATTRSDLG 0x24 +#define IDR_MARKERATTRSDLG 0x25 +#define IDR_AREAATTRSDLG 0x26 +#define IDR_IMAGEATTRSDLG 0x27 +#define IDR_MISCATTRSDLG 0x28 +#define IDR_DIMENSIONSDLG 0x29 +#define IDR_PTRPREFERENCESDLG 0x2A /**********************************************************************\ -* IDD - ID for Dialog item -* IDM - ID for Menu commands +* IDD_ - ID for Dialog item +* IDM_ - ID for Menu commands * IDS - ID for String table * IDT - ID for Timers \**********************************************************************/ -#define IDNULL -1 +/* common dialog box control values */ +#define ID_NULL -1 +#define IDD_OK -2 +#define IDD_CANCEL -3 + +/* redraw timer delay */ +#define IDD_MINDELAY 0x001 +#define IDD_MAXDELAY 0x002 + +/* bitmap parameters */ +#define IDD_BMCX 0x010 +#define IDD_BMCY 0x011 +#define IDD_BMPLANES 0x012 +#define IDD_BMBPP 0x013 + +/* thread-switch timer delay */ +#define IDD_SWITCHDELAY 0x020 + +/* line attributes */ +#define IDD_LINECOLOR 0x030 +#define IDD_LINEMIX 0x031 +#define IDD_LINEWIDTH 0x032 +#define IDD_LINEGEOMWIDTH 0x033 +#define IDD_LINETYPE 0x034 +#define IDD_LINEEND 0x035 +#define IDD_LINEJOIN 0x036 + +/* marker attributes */ +#define IDD_MARKCOLOR 0x040 +#define IDD_MARKBACKCOLOR 0x041 +#define IDD_MARKMIX 0x042 +#define IDD_MARKBACKMIX 0x043 +#define IDD_MARKSET 0x044 +#define IDD_MARKSYMBOL 0x045 +#define IDD_MARKCELLWIDTH 0x046 +#define IDD_MARKCELLHEIGHT 0x047 + +/* area attributes */ +#define IDD_AREACOLOR 0x050 +#define IDD_AREABACKCOLOR 0x051 +#define IDD_AREAMIX 0x052 +#define IDD_AREABACKMIX 0x053 +#define IDD_AREASET 0x054 +#define IDD_AREASYMBOL 0x055 +#define IDD_AREAREFX 0x056 +#define IDD_AREAREFY 0x057 + +/* image attributes */ +#define IDD_IMAGECOLOR 0x060 +#define IDD_IMAGEBACKCOLOR 0x061 +#define IDD_IMAGEMIX 0x062 +#define IDD_IMAGEBACKMIX 0x063 + +/* miscellaneous fractal attributes */ +#define IDD_RECURSION 0x070 +#define IDD_CPTMAX 0x071 +#define IDD_NUMSIDES 0x072 +#define IDD_ROTATION 0x073 + +/* fractal dimensions */ +#define IDD_XOFF 0x080 +#define IDD_YOFF 0x081 +#define IDD_XSCALE 0x082 +#define IDD_YSCALE 0x083 + +/* pointer preferences */ +#define IDD_PTRTHRESHOLD 0x090 +#define IDD_USERPTR0 0x091 +#define IDD_USERPTR1 0x092 +#define IDD_USERPTR2 0x093 +#define IDD_USERPTR3 0x094 + + + + +/* menus */ + +#define IDM_FILE 0x100 +#define IDM_LOAD 0x101 +#define IDM_SAVE 0x102 +#define IDM_ABOUT 0x103 + +#define IDM_EDIT 0x200 +#define IDM_SELECT 0x201 +#define IDM_SELECTALL 0x202 +#define IDM_CUT 0x203 +#define IDM_COPY 0x204 +#define IDM_PASTE 0x205 +#define IDM_USECLIPBRD 0x206 +#define IDM_PASTES 0x207 +#define IDM_PASTEDSA 0x208 +#define IDM_PASTEDSO 0x209 +#define IDM_PASTEDSX 0x20A +#define IDM_PASTESN 0x20B +#define IDM_PASTEDSAN 0x20C +#define IDM_PASTEDSON 0x20D +#define IDM_PASTEDSXN 0x20E + +#define IDM_THREAD 0x300 +#define IDM_NEWTHREAD 0x310 +#define IDM_DCDIRECT 0x311 +#define IDM_DCMEMORY 0x312 +#define IDM_DCPOSTSCRIPT 0x313 +#define IDM_DCPROPRINTER 0x314 +#define IDM_THREADTOTOP 0x320 +#define IDM_THR0TOTOP 0x321 +#define IDM_THR1TOTOP 0x322 +#define IDM_THR2TOTOP 0x323 +#define IDM_THR3TOTOP 0x324 +#define IDM_THR4TOTOP 0x325 +#define IDM_THR5TOTOP 0x326 +#define IDM_THR6TOTOP 0x327 +#define IDM_THR7TOTOP 0x328 +#define IDM_THR8TOTOP 0x329 +#define IDM_THR9TOTOP 0x32A +#define IDM_EDITTHREADPARAMS 0x330 +#define IDM_KILLTOPTHREAD 0x340 +#define IDM_KILLALLTHREADS 0x350 +#define IDM_AUTOSWITCH 0x360 +#define IDM_SWITCHDELAY 0x370 +#define IDM_UPDATEMENUS 0x380 +#define IDM_THREADINHERITANCE 0x390 + +#define IDM_CONTROL 0x400 +#define IDM_REDRAW 0x401 +#define IDM_ABORT 0x402 +#define IDM_CLEARBITMAP 0x403 +#define IDM_COPYBITMAPTOSCREEN 0x404 +#define IDM_SQUAREBITMAP 0x405 +#define IDM_RESIZEBITMAPTOWINDOW 0x406 +#define IDM_MOUSECHANGESRECURSION 0x407 +#define IDM_ANIMATEPTR 0x408 +#define IDM_PTRPREFERENCES 0x409 +#define IDM_TIMERDELAY 0x40A + +#define IDM_FRACTAL 0x500 +#define IDM_FRACREDRAW 0x501 +#define IDM_SHARKTOOTH 0x502 +#define IDM_SAWTOOTH 0x503 +#define IDM_KOCH 0x504 +#define IDM_SPACEFILLER 0x505 +#define IDM_STOVE 0x506 +#define IDM_SQUAREWAVE 0x507 +#define IDM_HOURGLASS 0x508 + +#define IDM_PRIMITIVE 0x600 +#define IDM_PRIMREDRAW 0x601 +#define IDM_POLYLINE 0x602 +#define IDM_POLYFILLET 0x603 +#define IDM_POLYSPLINE 0x604 +#define IDM_POLYMARKER 0x605 +#define IDM_PEANO 0x606 + +#define IDM_ATTRIBUTES 0x700 +#define IDM_ATTRREDRAW 0x701 +#define IDM_LINEATTRS 0x702 +#define IDM_MARKERATTRS 0x703 +#define IDM_AREAATTRS 0x704 +#define IDM_IMAGEATTRS 0x705 +#define IDM_MISCATTRS 0x706 +#define IDM_DIMENSIONS 0x707 +#define IDM_DRAGDIMS 0x708 + +#define IDM_ENVIRONMENT 0x800 +#define IDM_AUTORESIZE 0x801 +#define IDM_AUTOSELECTDIMS 0x802 +#define IDM_CLEARONREDRAW 0x803 +#define IDM_AUTOSTARTREDRAW 0x804 +#define IDM_COLLECTBOUNDS 0x805 + + + -#define IDDOK 0x001 -#define IDDCANCEL 0x002 -#define IDDCOLORBK 0x010 -#define IDDCOLOR 0x020 -#define IDDSTYLE 0x030 -#define IDDMIX 0x040 -#define IDDNUMSIDES 0x050 -#define IDDCPTMAX 0x060 -#define IDDRECURSION 0x070 -#define IDDCLEARBETWEEN 0x080 - -#define IDMFILE 0x100 -#define IDMABOUT 0x101 - -#define IDMXFORM 0x200 -#define IDMSHARKTOOTH 0x201 -#define IDMSAWTOOTH 0x202 -#define IDMKOCH 0x203 -#define IDMSTOVE 0x204 -#define IDMESSES 0x205 - -#define IDMENVIRONMENT 0x300 -#define IDMCLEARBITMAP 0x301 -#define IDMAUTOSCALE 0x302 -#define IDMFRACATTRS 0x303 - -#define IDMCONTROL 0x400 -#define IDMREDRAW 0x401 -#define IDMABORT 0x402 -#define IDSTITLE 1 +#define IDS_TITLE 1 +#define IDT_AUTOSTARTREDRAW 1 +#define IDT_AUTOSWITCH 2 @@ -66,13 +239,32 @@ * ************************************************************************/ -#define MAX_POINT_COUNT 500 /* number of points buffered up */ +#define CCHSTR 12 /* work buffer size for MyGetWindowLong, etc */ + +#define MAX_POINT_COUNT 0x10000/sizeof(POINTL) /* number of points buffered up */ #define PI 3.1415926 /* useful in computing angles */ #define TWO_PI (2 * PI) /* ditto */ #define EOLIST 0 /* End-of-list marker for xform */ +#define NUM_PTR_SHAPES 4 + + + + +/************************************************************************ +* +* Aspect ratio structure. +* +************************************************************************/ + +typedef struct _aspect +{ + LONG lHorz; + LONG lVert; +} ASPECT; + @@ -86,10 +278,10 @@ * the form of a linked list. * * next link to the next line segment -* length relative length of a segment, as percentage of -* length segment on which transform was defined * angle relative angle in radians, positive being * counterclockwise +* length relative length of a segment, as percentage of +* length segment on which transform was defined * flip orientation of transform at a segment * FALSE ==> rotate transform by angle[] * TRUE ==> rotate transform by -angle[] @@ -100,8 +292,8 @@ typedef struct _linefrac { struct _linefrac *next; - double length; double angle; + double length; BOOL flip; } LINEFRAC; typedef LINEFRAC *PLINEFRAC; @@ -109,35 +301,344 @@ typedef LINEFRAC *PLINEFRAC; -/********************************************************************\ -* These procedures must be declared FAR because they are exported -* and called by OS/2 Windows Presentation Manager. -\********************************************************************/ +/************************************************************************ +* +* Transform-defaults structure. +* +************************************************************************/ + +typedef struct +{ + PLINEFRAC pXform; + double xOff; + double yOff; + double xScale; + double yScale; + USHORT usSides; +} XFORMDATA; + + + + +/************************************************************************ +* +* Private bitmap info header. This is to avoid having the extra +* cbFix space taken up in the per-thread data structure. I use this +* only to store the data that will go into the real BITMAPINFOHEADER +* structure later. +* +************************************************************************/ + +typedef struct +{ + USHORT cx; + USHORT cy; + USHORT cPlanes; + USHORT cBitCount; +} MYBMINFO; + + + + +#ifdef INCL_GLOBALS +#define INCL_THREADS +#endif -ULONG FAR PASCAL AboutDlg ( HWND, USHORT, MPARAM, MPARAM ); -BOOL FAR PASCAL LineFracInitApp ( VOID ); -ULONG FAR PASCAL LineFracWndProc ( HWND, USHORT, MPARAM, MPARAM ); -ULONG FAR PASCAL LineFracDlg ( HWND, USHORT, MPARAM, MPARAM ); +#ifdef INCL_THREADS +/************************************************************************ +* +* Per-thread overhead structure. +* +************************************************************************/ + +typedef struct _threadoh +{ + /* environment preferences */ + BOOL fAutoSizePS; /* PS resized on various events */ + BOOL fAutoSelectDims; /* scale and offset from fractal defaults */ + BOOL fClearOnRedraw; /* clear surface at start of redraw */ + BOOL fAutoStartRedraw;/* random automatic redraw enabled */ + BOOL fCollectBounds; /* collect bounds on primitives */ + + BOOL fFracRedraw; /* redraw if fractal similarity xform changes */ + BOOL fPrimRedraw; /* redraw if primitive changes */ + BOOL fAttrRedraw; /* redraw if any attributes change */ + + /* fractal attributes */ + + LINEBUNDLE lb; + ULONG flLineAttrs; +#define LFA_LINECOLOR LBB_COLOR +#define LFA_LINEMIX LBB_MIX_MODE +#define LFA_LINEWIDTH LBB_WIDTH +#define LFA_LINEGEOMWIDTH LBB_GEOM_WIDTH +#define LFA_LINETYPE LBB_TYPE +#define LFA_LINEEND LBB_END +#define LFA_LINEJOIN LBB_JOIN +#define LFA_LINEALL (LBB_COLOR|LBB_MIX_MODE|LBB_WIDTH|LBB_GEOM_WIDTH|\ + LBB_TYPE|LBB_END|LBB_JOIN) + + + MARKERBUNDLE mb; + ULONG flMarkerAttrs; +#define LFA_MARKCOLOR MBB_COLOR +#define LFA_MARKBACKCOLOR MBB_BACK_COLOR +#define LFA_MARKMIX MBB_MIX_MODE +#define LFA_MARKBACKMIX MBB_BACK_MIX_MODE +#define LFA_MARKSET MBB_SET +#define LFA_MARKSYMBOL MBB_SYMBOL +#define LFA_MARKCELLWIDTH MBB_BOX /* part of sizfxCell field */ +#define LFA_MARKCELLHEIGHT MBB_BOX /* part of sizfxCell field */ +#define LFA_MARKALL (MBB_COLOR|MBB_BACK_COLOR|MBB_MIX_MODE|MBB_BACK_MIX_MODE|\ + MBB_SET|MBB_SYMBOL|MBB_BOX) + + + AREABUNDLE ab; + ULONG flAreaAttrs; +#define LFA_AREACOLOR ABB_COLOR +#define LFA_AREABACKCOLOR ABB_BACK_COLOR +#define LFA_AREAMIX ABB_MIX_MODE +#define LFA_AREABACKMIX ABB_BACK_MIX_MODE +#define LFA_AREASET ABB_SET +#define LFA_AREASYMBOL ABB_SYMBOL +#define LFA_AREAREFX ABB_REF_POINT /* part of ptlRefPoint field */ +#define LFA_AREAREFY ABB_REF_POINT /* part of ptlRefPoint field */ +#define LFA_AREAALL (ABB_COLOR|ABB_BACK_COLOR|ABB_MIX_MODE|ABB_BACK_MIX_MODE|\ + ABB_SET|ABB_SYMBOL|ABB_REF_POINT) + + + IMAGEBUNDLE ib; + ULONG flImageAttrs; +#define LFA_IMAGECOLOR IBB_COLOR +#define LFA_IMAGEBACKCOLOR IBB_BACK_COLOR +#define LFA_IMAGEMIX IBB_MIX_MODE +#define LFA_IMAGEBACKMIX IBB_BACK_MIX_MODE +#define LFA_IMAGEALL (IBB_COLOR|IBB_BACK_COLOR|IBB_MIX_MODE|IBB_BACK_MIX_MODE) + + + /* miscellaneous other attributes */ + + USHORT usCurPrim; /* primitive to draw with */ + USHORT usCurXform; /* fractal to draw with */ + USHORT usRecursion; /* level of recursion at which to draw */ + USHORT cptMax; /* max batch size for point buffer */ + USHORT usPolygonSides; /* number of sides on polygonal frame */ + double dblRotation; /* rotation in radians of image */ + double dblXOff; /* offset expressed as percentage of surface extents */ + double dblYOff; + double dblXScale; /* scale expressed as percentage of surface extents */ + double dblYScale; + ULONG cxWCS; /* dimensions of drawing in world space */ + ULONG cyWCS; + + ULONG flMiscAttrs; +#define LFA_CURPRIM 0x0001L +#define LFA_CURXFORM 0x0002L +#define LFA_RECURSION 0x0004L +#define LFA_POLYGONSIDES 0x0008L +#define LFA_CPTMAX 0x0010L +#define LFA_XOFF 0x0020L +#define LFA_YOFF 0x0040L +#define LFA_XSCALE 0x0080L +#define LFA_YSCALE 0x0100L +#define LFA_ROTATION 0x0200L +#define LFA_CXWCS 0x0400L +#define LFA_CYWCS 0x0800L + +#define LFA_MISCALL 0x0FFFL + + + /* fixed per-thread overhead */ + + USHORT dcType; /* code identifying type of DC */ + RECTL rcl; /* surface dimensions as a rectangle */ + USHORT cPlanes; /* if bitmap, number of color planes */ + USHORT cBitCount; /* if bitmap, number of color bits per pel */ + ASPECT AspectRatio; /* DC's aspect ratio */ + + + /******************************************************************** + * + * Per-process per-thread overhead. + * + * Data after this point should not be saved + * as part of a fractal context. + * + ********************************************************************/ + + TID tid; /* thread id */ + SEL selStack; /* thread stack selector */ + HDC hdc; + HBITMAP hbm; + HPS hps; + LONG lSemRedraw; /* redraw semaphore */ + BOOL fInterrupted; /* fractal suicide flag recognized in recursion */ + BOOL fTimeToDie; /* thread suicide flag */ + BOOL fUpdateAttrs; /* TRUE --> new attributes since redraw */ + BOOL fBusy; /* TRUE --> not waiting on semaphore */ + PPOINTL pptl; /* fractal point buffer */ + ULONG cptl; /* number of points in buffer */ + RECTL rclBounds; /* bounds of last primitive drawn */ + double x; /* current position */ + double y; + PMATRIXLF pmatlf; /* --> matrices for each side of ngon */ + +} THR; +typedef THR *PTHR; +#endif -/********************************************************************\ -* These procedures are referenced in more than one module, but -* are not exported. -\********************************************************************/ -VOID LineFracInit ( HWND ); -VOID LineFracExit ( VOID ); -VOID LineFracPaint ( HPS ); -VOID LineFracCommand ( HWND, USHORT ); +#ifdef INCL_GLOBALS +/************************************************************************ +* +* Global data structure. This makes it easier to save the state of +* the program to a file. +* +************************************************************************/ + +#define MAX_THREADS 10 + +typedef struct _globaldata +{ + /******************************************************************** + * + * LineFrac session data. + * + * The following can be saved to a file to record the user's + * session. + * + ********************************************************************/ + + BOOL fAutoSwitch; /* TRUE --> automatically cycle through threads */ + BOOL fUpdateMenusOnThreadSwitch;/* TRUE --> per-thread menu items not updated during animation */ + BOOL fThreadInheritance; /* TRUE --> new threads are copies of top one */ + USHORT usSwitchDelay; /* delay between automatic thread switches */ + USHORT usMinTimerDelay; /* lower limit of random redraw delay */ + USHORT usMaxTimerDelay; /* upper limit of random redraw delay */ + BOOL fMouseChangesRecursion; /* TRUE --> mouse clicks change recursion */ + BOOL fAnimatePtr; /* TRUE --> pointer changes with mouse movements */ + USHORT usUserPtr; /* pointer to use when not animated */ + USHORT usPtrThreshold; /* relates to speed of pointer animation */ + USHORT usRopIndex; /* index into paste rop table */ + BOOL fUseClipbrd; /* TRUE --> edit operations use system clipboard */ + /* FALSE --> ... use private bitmaps */ + RECTL rcl; /* window dimensions */ + USHORT cThr; /* number of threads */ + USHORT iThrTop; /* top thread */ + + + /******************************************************************** + * + * Per-process global data. + * + * Data after this point should not be saved + * as part of a linefrac session. + * + ********************************************************************/ + + /* attributes: user's input is put here; thread picks it up when + * told to redraw. + */ + + BOOL fUpdateAttrs; /* TRUE --> no thread has read attrs yet */ + LINEBUNDLE lb; + ULONG flLineAttrs; + MARKERBUNDLE mb; + ULONG flMarkerAttrs; + AREABUNDLE ab; + ULONG flAreaAttrs; + IMAGEBUNDLE ib; + ULONG flImageAttrs; + USHORT usCurPrim; /* primitive to draw with */ + USHORT usCurXform; /* fractal to draw with */ + USHORT usRecursion; /* level of recursion at which to draw */ + USHORT cptMax; /* max batch size for point buffer */ + USHORT usPolygonSides; /* number of sides on polygonal frame */ + double dblRotation; /* rotation in radians of image */ + double dblXOff; /* offset expressed as percentage of surface extents */ + double dblYOff; + double dblXScale; /* scale expressed as percentage of surface extents */ + double dblYScale; + ULONG cxWCS; /* dimensions of drawing in world space */ + ULONG cyWCS; + ULONG flMiscAttrs; + + HAB hab; + HMQ hMsgQ; + HWND hwnd; + HWND hwndFrame; + HPOINTER hptr[NUM_PTR_SHAPES]; /* array of pointer shapes to animate */ + HPOINTER hptrTrack; /* pointer used when dragging a new rect */ + HPOINTER hptrPaste; /* pointer used when dragging paste rect */ + HPOINTER hptrWait; /* hourglass pointer for when top thread is busy */ + USHORT usPtrIncr; /* +1 or -1, so pointer doesn't wrap in array */ + USHORT usPtrCounter; /* counts WM_MOUSEMOVE messages */ + USHORT usCurPtr; /* index into pointer array of current one */ + BOOL fFirstThread; /* TRUE --> no threads initialized yet */ + BOOL fTimerOn; /* TRUE --> auto redraw timer is on */ + HDC CutCopyDC; /* DC for cut/copy private bit storage */ + HPS CutCopyPS; /* PS for cut/copy private bit storage */ + HBITMAP CutCopyBM; /* BM for cut/copy private bit storage */ + RECTL rclSelect; /* most recently dragged selection rect */ + RECTL rclCutCopy; /* most recent cut/copy rect */ + ULONG ulPasteROP; /* BitBlt ROP to use when pasting */ + BOOL fHaveCutCopyDC; /* TRUE --> cut/copy DC exists */ + BOOL fTracking; /* TRUE --> dragging dimensions */ + BOOL fSelecting; /* TRUE --> dragging cut/copy rect */ + BOOL fPasting; /* TRUE --> dragging paste rect */ + BOOL fTempSelect; /* TRUE --> selection rect just dragged */ + BOOL fShowSelectRc; /* TRUE --> display selection rect */ + BOOL fHaveSelectRc; /* TRUE --> have valid selection rect */ + MYBMINFO bm; /* scratch space for various bitmap functions */ + PTHR pThrTop; /* top thread */ + PTHR aThr[MAX_THREADS];/* array of threads */ + +} GLOBALDATA; +#endif + + + + +/************************************************************************ +* +* Handy macros to eliminate some typing. +* +************************************************************************/ + +#define TOGGLE_BOOL(x) ((x)=(!(x))) -BOOL ResizeBitmap ( HWND ); +#ifdef INCL_WINDIALOGS -PLINEFRAC DefineSharkTooth ( VOID ); -PLINEFRAC DefineSawTooth ( VOID ); -PLINEFRAC DefineKochIsland ( VOID ); -PLINEFRAC DefineStovePipe ( VOID ); -PLINEFRAC DefineEsses ( VOID ); +#define SET_CHECK_BOX(x, y, z) \ + WinSendDlgItemMsg((x),(y),BM_SETCHECK, \ + MPFROM2SHORT((z),0),0L) + +#define TOGGLE_MENU_ITEM(x, y, z) \ + WinSendDlgItemMsg((x), FID_MENU, MM_SETITEMATTR, \ + MPFROM2SHORT((y),TRUE), \ + MPFROM2SHORT(MIA_CHECKED,(z)?MIA_CHECKED:NULL)) + +#define CHECK_MENU_ITEM(x, y) \ + WinSendDlgItemMsg((x), FID_MENU, MM_SETITEMATTR, \ + MPFROM2SHORT((y),TRUE), \ + MPFROM2SHORT(MIA_CHECKED,MIA_CHECKED)) + +#define UNCHECK_MENU_ITEM(x, y) \ + WinSendDlgItemMsg((x), FID_MENU, MM_SETITEMATTR, \ + MPFROM2SHORT((y),TRUE), \ + MPFROM2SHORT(MIA_CHECKED,NULL)) + +#define ENABLE_MENU_ITEM(x, y) \ + WinSendDlgItemMsg((x), FID_MENU, MM_SETITEMATTR, \ + MPFROM2SHORT((y),TRUE), \ + MPFROM2SHORT(MIA_DISABLED,NULL)) + +#define DISABLE_MENU_ITEM(x, y) \ + WinSendDlgItemMsg((x), FID_MENU, MM_SETITEMATTR, \ + MPFROM2SHORT((y),TRUE), \ + MPFROM2SHORT(MIA_DISABLED,MIA_DISABLED)) -VOID FAR PASCAL AccumulateLineFractal( VOID ); +#endif