|
|
Microsoft OS/2 SDK PM 08-08-1988
/*
Source code for OBJECT application
*/
#define INCL_WIN
#define INCL_DOS
#include <os2.h>
#include <math.h>
#include <stdio.h>
#include "object.h"
#define STATUS_READY 0
#define STATUS_WORKING 1
#define STATUS_DONE 2
#define WM_OBJECT_CREATED (WM_USER + 0)
#define WM_START_CALC (WM_USER + 1)
#define WM_ABORT_CALC (WM_USER + 2)
#define WM_CALC_DONE (WM_USER + 3)
#define WM_CALC_ABORTED (WM_USER + 4)
#define WM_OBJECT_DESTROYED (WM_USER + 5)
/* globals */
HWND vhwndMenu;
HAB vhab;
HWND vhwndClient;
HWND vhwndObject;
UCHAR vcThreadStack[4096];
MRESULT FAR PASCAL WndProc(HWND hwnd,
USHORT msg,
MPARAM mp1,
MPARAM mp2);
VOID PASCAL FAR SecondThread(VOID);
MRESULT FAR PASCAL ObjectWndProc(HWND hwnd,
USHORT msg,
MPARAM mp1,
MPARAM mp2);
double Savage(double A)
{
return tan(atan(exp(log(sqrt(A * A))))) + 1.0;
}
VOID Paint(HWND hwnd,
SHORT iStatus,
SHORT iRep,
LONG lTime)
{
static CHAR *szMessage[3] = {"Ready",
"Working...",
"%d reps in %ld msec."};
CHAR szBuffer[60];
HPS hps;
RECTL rcl;
hps = WinBeginPaint(hwnd, (HPS)NULL, (PRECTL)NULL);
WinQueryWindowRect(hwnd, (PRECTL)&rcl);
WinFillRect(hps, (PRECTL)&rcl, SYSCLR_WINDOW);
sprintf(szBuffer, szMessage[iStatus], iRep, lTime);
WinDrawText(hps, -1, szBuffer, (PRECTL)&rcl,
SYSCLR_WINDOWTEXT, SYSCLR_WINDOW, DT_CENTER | DT_VCENTER);
WinEndPaint(hps);
}
int cdecl main(VOID)
{
static CHAR szClass[] = "Big";
HMQ hmq;
HWND hwndFrame;
QMSG qmsg;
ULONG ulCreate;
TID idThread;
vhab = WinInitialize(0);
hmq = WinCreateMsgQueue(vhab, 0);
WinRegisterClass(vhab, szClass, WndProc,
CS_SYNCPAINT | CS_SIZEREDRAW, NULL);
ulCreate = FCF_TITLEBAR | FCF_SYSMENU | FCF_MINMAX |
FCF_SIZEBORDER | FCF_MENU;
hwndFrame = WinCreateStdWindow(HWND_DESKTOP,
WS_VISIBLE,
(PVOID)&ulCreate,
szClass, (PSZ)"Big Object Window",
0L, NULL, ID_RESOURCE,
(HWND FAR *)&vhwndClient);
vhwndMenu = WinWindowFromID(hwndFrame, FID_MENU);
WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_START, TRUE),
MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED));
if (DosCreateThread(SecondThread, &idThread,
vcThreadStack + sizeof vcThreadStack))
WinAlarm(HWND_DESKTOP, WA_ERROR);
while (WinGetMsg(vhab, &qmsg, NULL, 0, 0))
WinDispatchMsg(vhab, &qmsg);
WinDestroyWindow(hwndFrame);
WinDestroyMsgQueue(hmq);
WinTerminate(vhab);
return 0;
}
MRESULT FAR PASCAL WndProc(HWND hwnd,
USHORT msg,
MPARAM mp1,
MPARAM mp2)
{
static SHORT iCalcRep, iCurrentRep = IDM_10;
static SHORT iStatus = STATUS_READY;
static ULONG lElapsedTime;
switch (msg) {
case WM_OBJECT_CREATED:
WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_START, TRUE),
MPFROM2SHORT(MIA_DISABLED, 0));
break;
case WM_COMMAND:
switch (SHORT1FROMMP(mp1)) {
case IDM_10:
case IDM_100:
case IDM_1000:
case IDM_10000:
WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(iCurrentRep, TRUE),
MPFROM2SHORT(MIA_CHECKED, 0));
iCurrentRep = SHORT1FROMMP(mp1);
WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(iCurrentRep, TRUE),
MPFROM2SHORT(MIA_CHECKED, MIA_CHECKED));
break;
case IDM_START:
WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_START, TRUE),
MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED));
WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_ABORT, TRUE),
MPFROM2SHORT(MIA_DISABLED, 0));
iStatus = STATUS_WORKING;
WinInvalidateRect(hwnd, NULL, FALSE);
iCalcRep = iCurrentRep;
WinPostMsg(vhwndObject, WM_START_CALC, MPFROMLONG(iCalcRep), 0L);
break;
case IDM_ABORT:
WinPostMsg(vhwndObject, WM_ABORT_CALC, 0L, 0L);
WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_ABORT, TRUE),
MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED));
default:
break;
}
break;
case WM_CALC_DONE:
iStatus = STATUS_DONE;
lElapsedTime = LONGFROMMP(mp1);
WinInvalidateRect(hwnd, NULL, FALSE);
WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_START, TRUE),
MPFROM2SHORT(MIA_DISABLED, 0));
WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_ABORT, TRUE),
MPFROM2SHORT(MIA_DISABLED, MIA_DISABLED));
break;
case WM_CALC_ABORTED:
iStatus = STATUS_READY;
WinInvalidateRect(hwnd, NULL, FALSE);
WinSendMsg(vhwndMenu, MM_SETITEMATTR, MPFROM2SHORT(IDM_START, TRUE),
MPFROM2SHORT(MIA_DISABLED, 0));
break;
case WM_PAINT:
Paint(hwnd, iStatus, iCalcRep, lElapsedTime);
break;
case WM_CLOSE:
if (vhwndObject)
WinPostMsg(vhwndObject, WM_QUIT, 0L, 0L);
else
WinPostMsg(hwnd, WM_QUIT, 0L, 0L);
break;
case WM_OBJECT_DESTROYED:
WinPostMsg(hwnd, WM_QUIT, 0L, 0L);
break;
default:
return WinDefWindowProc(hwnd, msg, mp1, mp2);
}
return 0L;
}
VOID PASCAL FAR SecondThread(VOID)
{
static CHAR szObjectClass[] = "Big Object";
HMQ hmq;
QMSG qmsg;
hmq = WinCreateMsgQueue(vhab, 0);
WinRegisterClass(vhab, szObjectClass, ObjectWndProc, 0L, NULL);
vhwndObject = WinCreateWindow(HWND_OBJECT, szObjectClass, NULL, 0L,
0, 0, 0, 0, NULL, HWND_TOP, 0, NULL, NULL);
WinPostMsg(vhwndClient, WM_OBJECT_CREATED, 0L, 0L);
while (WinGetMsg(vhab, &qmsg, NULL, 0, 0))
WinDispatchMsg(vhab, &qmsg);
WinDestroyWindow(vhwndObject);
WinDestroyMsgQueue(hmq);
WinPostMsg(vhwndClient, WM_OBJECT_DESTROYED, 0L, 0L);
DosExit(0, 0);
}
MRESULT FAR PASCAL ObjectWndProc(HWND hwnd,
USHORT msg,
MPARAM mp1,
MPARAM mp2)
{
double A;
SHORT i, iCalcRep;
LONG lQueueStatus, lTime;
switch (msg) {
case WM_START_CALC:
iCalcRep = SHORT1FROMMP(mp1);
lTime = WinGetCurrentTime(vhab);
for (A = 1.0, i = 0; i < iCalcRep; i++) {
lQueueStatus = WinQueryQueueStatus(HWND_DESKTOP);
if (lQueueStatus & QS_POSTMSG)
break;
A = Savage(A);
}
if (lQueueStatus & QS_POSTMSG)
break;
lTime = WinGetCurrentTime(vhab) - lTime;
WinPostMsg(vhwndClient, WM_CALC_DONE, MPFROMLONG(lTime), 0L);
break;
case WM_ABORT_CALC:
WinPostMsg(vhwndClient, WM_CALC_ABORTED, 0L, 0L);
break;
default:
return WinDefWindowProc(hwnd, msg, mp1, mp2);
}
return 0L;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.