|
|
1.1 ! root 1: /*-------------------------------- ! 2: SPIRAL.C -- GPI Spiral Drawing ! 3: ---------------------------------*/ ! 4: ! 5: #include <os2.h> ! 6: #include <math.h> ! 7: ! 8: #define NUMPOINTS 1000 ! 9: #define NUMREV 20 ! 10: #define PI 3.14159 ! 11: ! 12: MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ; ! 13: ! 14: int main (void) ! 15: { ! 16: static CHAR szClientClass [] = "Spiral" ; ! 17: static ULONG flFrameFlags = FCF_TITLEBAR | FCF_SYSMENU | ! 18: FCF_SIZEBORDER | FCF_MINMAX | ! 19: FCF_SHELLPOSITION | FCF_TASKLIST ; ! 20: HAB hab ; ! 21: HMQ hmq ; ! 22: HWND hwndFrame, hwndClient ; ! 23: QMSG qmsg ; ! 24: ! 25: hab = WinInitialize (0) ; ! 26: hmq = WinCreateMsgQueue (hab, 0) ; ! 27: ! 28: WinRegisterClass (hab, szClientClass, ClientWndProc, CS_SIZEREDRAW, 0) ; ! 29: ! 30: hwndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE, ! 31: &flFrameFlags, szClientClass, NULL, ! 32: 0L, NULL, 0, &hwndClient) ; ! 33: ! 34: while (WinGetMsg (hab, &qmsg, NULL, 0, 0)) ! 35: WinDispatchMsg (hab, &qmsg) ; ! 36: ! 37: WinDestroyWindow (hwndFrame) ; ! 38: WinDestroyMsgQueue (hmq) ; ! 39: WinTerminate (hab) ; ! 40: return 0 ; ! 41: } ! 42: ! 43: MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2) ! 44: { ! 45: static SHORT cxClient, cyClient ; ! 46: double dAngle, dScale ; ! 47: HPS hps ; ! 48: PPOINTL pptl ; ! 49: SEL sel ; ! 50: SHORT sIndex ; ! 51: ! 52: switch (msg) ! 53: { ! 54: case WM_SIZE: ! 55: cxClient = SHORT1FROMMP (mp2) ; ! 56: cyClient = SHORT2FROMMP (mp2) ; ! 57: return 0 ; ! 58: ! 59: case WM_PAINT: ! 60: hps = WinBeginPaint (hwnd, NULL, NULL) ; ! 61: GpiErase (hps) ; ! 62: ! 63: if (!DosAllocSeg (NUMPOINTS * sizeof (POINTL), &sel, 0)) ! 64: { ! 65: pptl = MAKEP (sel, 0) ; ! 66: ! 67: for (sIndex = 0 ; sIndex < NUMPOINTS ; sIndex ++) ! 68: { ! 69: dAngle = sIndex * 2 * PI / (NUMPOINTS / NUMREV) ; ! 70: dScale = 1 - (double) sIndex / NUMPOINTS ; ! 71: ! 72: pptl[sIndex].x = (LONG) (cxClient / 2 * ! 73: (1 + dScale * cos (dAngle))) ; ! 74: ! 75: pptl[sIndex].y = (LONG) (cyClient / 2 * ! 76: (1 + dScale * sin (dAngle))) ; ! 77: } ! 78: GpiMove (hps, pptl) ; ! 79: GpiPolyLine (hps, NUMPOINTS - 1L, pptl + 1) ; ! 80: ! 81: DosFreeSeg (sel) ; ! 82: } ! 83: WinEndPaint (hps) ; ! 84: return 0 ; ! 85: } ! 86: return WinDefWindowProc (hwnd, msg, mp1, mp2) ; ! 87: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.