|
|
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.