|
|
1.1 ! root 1: /*--------------------- file identification ------------------------*/ ! 2: ! 3: /* ! 4: chaos.c ! 5: Opens a window. ! 6: ! 7: Supports the system menu and default window behavior ! 8: ! 9: Also supports window menus and an about dialog ! 10: ! 11: Created by Microsoft Corp., 1988 ! 12: */ ! 13: ! 14: ! 15: /*---------------------- include files -----------------------------*/ ! 16: #define INCL_PM ! 17: #define INCL_DOS ! 18: #include <os2.h> ! 19: #include "chaos.h" ! 20: ! 21: /*-------------------------- global variables ----------------------*/ ! 22: /* message stuff */ ! 23: HMQ hmqTheMessageQueue; ! 24: HAB habTheAnchorBlock; ! 25: ! 26: /* window stuff */ ! 27: char szClassName[] = "chaos"; /* our window class name */ ! 28: HWND hwndClient; /* handle to the client */ ! 29: HWND hwndFrame; /* handle to the frame window */ ! 30: HPS hps; ! 31: ! 32: ! 33: /* Thread stuff */ ! 34: #define STACK_SIZE 32000 ! 35: ! 36: BOOL bContinue = FALSE; ! 37: LONG lSemTrigger; ! 38: TID idThread; ! 39: UCHAR rbThreadStack[STACK_SIZE]; ! 40: ! 41: ! 42: /*------------------------------ main ------------------------------*/ ! 43: ! 44: BOOL main() ! 45: ! 46: { ! 47: /* ! 48: * local constants ! 49: */ ! 50: #define USE_DEF_QUEUE_SIZE 0 ! 51: ! 52: /* ! 53: * local variables ! 54: */ ! 55: QMSG qmsg; ! 56: ! 57: /* ! 58: * initialize this application thread's use of the PM ! 59: */ ! 60: habTheAnchorBlock = WinInitialize (NULL) ; ! 61: ! 62: /* ! 63: * create a message queue for this application thread ! 64: */ ! 65: hmqTheMessageQueue = WinCreateMsgQueue ! 66: (habTheAnchorBlock, USE_DEF_QUEUE_SIZE) ; ! 67: /* ! 68: * initialize the application ! 69: */ ! 70: if (!GenericInit()) ! 71: return(FALSE); /* failed loading */ ! 72: ! 73: ! 74: ! 75: /* ! 76: * run the main event loop ! 77: */ ! 78: while ( WinGetMsg ( (HAB)NULL, &qmsg, (HWND)NULL, 0, 0 ) ) ! 79: WinDispatchMsg( (HAB)NULL, &qmsg ); ! 80: ! 81: ! 82: ! 83: /* suspend the other thread so it doesn't mess around while we quit */ ! 84: DosSuspendThread(idThread); ! 85: ! 86: /* ! 87: * kill the window ! 88: */ ! 89: WinDestroyWindow( hwndFrame ); ! 90: ! 91: /* ! 92: * PM cleanup ! 93: */ ! 94: WinDestroyMsgQueue( hmqTheMessageQueue ); ! 95: WinTerminate( habTheAnchorBlock ); ! 96: } ! 97: ! 98: ! 99: /*--------------------- GenericInit -------------------------*/ ! 100: BOOL GenericInit() { ! 101: ULONG lControlStyle = FCF_STANDARD; ! 102: ! 103: ! 104: if (!WinRegisterClass( habTheAnchorBlock, ! 105: szClassName, ! 106: (PFNWP)GenericWndProc, ! 107: CS_SIZEREDRAW, ! 108: 0)) ! 109: return( FALSE ); ! 110: ! 111: hwndFrame = WinCreateStdWindow( HWND_DESKTOP, ! 112: FS_ACCELTABLE | FS_BORDER, ! 113: &lControlStyle, ! 114: szClassName, ! 115: "chaos", ! 116: 0L, ! 117: NULL, ! 118: ID_RESOURCE, /* resource ID from .rc file */ ! 119: &hwndClient); ! 120: ! 121: ! 122: WinSetWindowPos(hwndFrame, /* window */ ! 123: HWND_TOP, /* window behind */ ! 124: 50, /* x pos */ ! 125: 50, /* y pos */ ! 126: 200, /* x size */ ! 127: 100, /* y size */ ! 128: SWP_ACTIVATE|SWP_SIZE|SWP_MOVE|SWP_SHOW); /* flags */ ! 129: ! 130: if (!hwndFrame) ! 131: return(FALSE); ! 132: ! 133: return(TRUE); ! 134: } ! 135: ! 136: /*---------------- the main window procedure --------------------------*/ ! 137: MRESULT FAR PASCAL GenericWndProc( hwnd, usMessage, mp1, mp2 ) ! 138: HWND hwnd; ! 139: USHORT usMessage; ! 140: MPARAM mp1; ! 141: MPARAM mp2; ! 142: { ! 143: HPS hpsLocal; ! 144: RECTL rect; ! 145: POINTL point; ! 146: USHORT usBarWidth; ! 147: LINEBUNDLE stTheLineBundle ; ! 148: ! 149: switch (usMessage) { ! 150: ! 151: ! 152: case WM_CREATE: ! 153: hps = WinGetPS(hwnd); ! 154: DosSemSet(&lSemTrigger); ! 155: ! 156: DosCreateThread((PFNTHREAD)ThreadProc, ! 157: &idThread, ! 158: rbThreadStack+STACK_SIZE-2); ! 159: ! 160: return 0L; ! 161: ! 162: case WM_PAINT: ! 163: hpsLocal = WinBeginPaint(hwnd,NULL,&rect); ! 164: WinFillRect(hpsLocal,&rect,CLR_WHITE); ! 165: WinEndPaint(hpsLocal); ! 166: return 0L; ! 167: ! 168: case WM_COMMAND: ! 169: DoMenuCommand(hwnd,LOUSHORT (mp1)); ! 170: return 0L; ! 171: ! 172: case WM_RESETPLOT: ! 173: /*hps = WinGetPS(hwndClient);*/ ! 174: WinQueryWindowRect(hwnd,&rect); ! 175: point.x = 0;point.y = rect.yTop / 2; ! 176: GpiMove(hps,&point); ! 177: WinFillRect(hps,&rect,CLR_WHITE); ! 178: return 0L; ! 179: ! 180: case WM_PLOTPOINT: ! 181: WinQueryWindowRect(hwnd,&rect); ! 182: usBarWidth = (rect.xRight /MAX_ITERATIONS) ; ! 183: point.x = ((USHORT)mp1)* usBarWidth ; ! 184: point.y = ((((USHORT)mp2) * rect.yTop) / 100); ! 185: ! 186: stTheLineBundle.lColor= CLR_RED; ! 187: GpiSetAttrs(hps, ! 188: PRIM_LINE, ! 189: (ULONG) LBB_COLOR, ! 190: (ULONG) 0, ! 191: &stTheLineBundle); ! 192: ! 193: ! 194: GpiLine(hps,&point); ! 195: return 0L; ! 196: ! 197: case WM_CLOSE: ! 198: WinReleasePS(hps); ! 199: break; /* go to default winproc */ ! 200: ! 201: } ! 202: return( WinDefWindowProc( hwnd, usMessage, mp1, mp2 ) ); ! 203: ! 204: } ! 205: ! 206: /*--------------------------- AboutProc -----------------------------*/ ! 207: MRESULT FAR PASCAL AboutProc (hwnd, usMessage, ! 208: mp1, mp2) ! 209: ! 210: HWND hwnd ; ! 211: USHORT usMessage ; ! 212: MPARAM mp1 ; ! 213: MPARAM mp2 ; ! 214: ! 215: { ! 216: /* case out on the message */ ! 217: switch (usMessage) ! 218: { ! 219: case WM_COMMAND: ! 220: switch (LOUSHORT (mp1)) ! 221: { ! 222: case DID_OK: ! 223: WinDismissDlg(hwnd,0); ! 224: return 0L; ! 225: } ! 226: break; ! 227: } ! 228: return ( WinDefDlgProc (hwnd, usMessage, ! 229: mp1, mp2) ) ; ! 230: ! 231: } ! 232: ! 233: /*---------------------------- DoMenuCommand -----------------------*/ ! 234: ULONG DoMenuCommand(hwnd, usMenuID) ! 235: ! 236: HWND hwnd; ! 237: USHORT usMenuID; ! 238: { ! 239: switch (usMenuID) ! 240: { ! 241: case IDM_FI_GO: ! 242: bContinue = TRUE; ! 243: DosSemClear(&lSemTrigger); ! 244: ! 245: break; ! 246: case IDM_FI_STOP: ! 247: bContinue = FALSE; ! 248: ! 249: break; ! 250: case IDM_FI_QUIT: ! 251: /* Don't use WinSENDMsg here */ ! 252: WinPostMsg(hwnd,WM_CLOSE,0L,0L); ! 253: break; ! 254: case IDM_FI_ABOUT: ! 255: /* this is a modal dialog */ ! 256: WinDlgBox(HWND_DESKTOP , ! 257: hwndFrame, ! 258: (PFNWP)AboutProc, ! 259: NULL, ! 260: IDD_ABOUT, ! 261: NULL); ! 262: break; ! 263: ! 264: default: ! 265: break; ! 266: ! 267: }; ! 268: } ! 269: ! 270: /*----------------------------- ThreadProc --------------------------*/ ! 271: ! 272: VOID FAR ThreadProc() ! 273: { ! 274: ! 275: double dPopulation = .5; ! 276: double dCurrentPop; ! 277: double dGrowthRate = INITIAL_GROWTH_RATE; ! 278: double dInc = .01; ! 279: ! 280: short i; ! 281: HPS hps; ! 282: RECTL rect; ! 283: POINTL point; ! 284: LINEBUNDLE stTheLineBundle ; ! 285: ! 286: DosSetPrty(PRTYS_THREAD, ! 287: PRTYC_IDLETIME, ! 288: 0, ! 289: 0); ! 290: ! 291: while (1) ! 292: { ! 293: DosSemWait(&lSemTrigger,-1L); ! 294: ! 295: WinPostMsg(hwndClient,WM_RESETPLOT, ! 296: 0L,0L); ! 297: ! 298: dCurrentPop = dPopulation; ! 299: ! 300: for (i = 0; i <= MAX_ITERATIONS; i++) ! 301: { ! 302: ! 303: if (!bContinue) ! 304: break; ! 305: ! 306: dCurrentPop = dCurrentPop * dGrowthRate * (1 - dCurrentPop); ! 307: ! 308: WinPostMsg(hwndClient,WM_PLOTPOINT, ! 309: MPFROMSHORT(i), ! 310: MPFROMSHORT((USHORT)(dCurrentPop*100))); ! 311: } ! 312: ! 313: ! 314: dGrowthRate = dGrowthRate + dInc; ! 315: if (dGrowthRate >= MAX_GROWTH_RATE) ! 316: dGrowthRate = INITIAL_GROWTH_RATE; ! 317: ! 318: if (!bContinue) ! 319: DosSemSet(&lSemTrigger); ! 320: ! 321: DosSleep(500L); ! 322: ! 323: } ! 324: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.