Annotation of pmsdk/samples/calc/calc.c, revision 1.1.1.1

1.1       root        1: /****************************** Module Header ******************************\
                      2: * Module Name:  calc.c - Calc application
                      3: *
                      4: * OS/2 Presentation Manager version of Calc, ported from Windows version
                      5: *
                      6: * Created by Microsoft Corporation, 1987
                      7: *
                      8: \***************************************************************************/
                      9: 
                     10: #define INCL_WIN
                     11: #define INCL_GPI
                     12: #define INCL_DEV
                     13: #define INCL_ERRORS
                     14: #define INCL_DOSPROCESS
                     15: #define INCL_DOSSEMAPHORES
                     16: #define INCL_DOSNLS
                     17: #include <os2.h>
                     18: #include <string.h>
                     19: #include <stdlib.h>
                     20: #include <stdio.h>
                     21: #include "calc.h"
                     22: 
                     23: /************* GLOBAL VARIABLES         */
                     24: 
                     25: char lastkey, currkey;
                     26: char szCalcClass[] = "Calculator";
                     27: char szTitle[30];
                     28: char szreg1[20], szreg2[20], szmem[20], szregx[20];
                     29: /* hope 20 is enough for kanji error string */
                     30: char szErrorString[20], szPlusMinus[2];
                     31: short charwidth, charheight;
                     32: int aspectx, aspecty, nchszstr;
                     33: extern BOOL fError;
                     34: BOOL fValueInMemory = FALSE;
                     35: BOOL fMDown = FALSE;
                     36: UCHAR mScan = 0;
                     37: 
                     38: #define TOLOWER(x)   ( (((x) >= 'A') && ((x) <= 'Z')) ? (x)|0x20 : (x))
                     39: #define WIDTHCONST  28
                     40: #define CXCHARS     37
                     41: #define CYCHARS     13
                     42: 
                     43: HAB hab;
                     44: HDC hdcLocal;                      /* Local used for button bitmap */
                     45: HPS hpsLocal;
                     46: HDC hdcSqr;                        /* Sqr used for square-root bitmap */
                     47: HPS hpsSqr;
                     48: HBITMAP hbmLocal, hbmSqr;
                     49: HMQ  hmqCalc;
                     50: HWND hwndCalc, hwndMenu;
                     51: HWND hwndCalcFrame;
                     52: HPOINTER hptrFinger;
                     53: 
                     54: DEVOPENSTRUC dop =                 /* used by DevOpenDC */
                     55: {
                     56:     NULL, "DISPLAY", NULL, NULL, NULL, NULL, NULL, NULL, NULL
                     57: };
                     58: 
                     59: static char keys[25] =             /* keyboard keys */
                     60: {
                     61:     '\271', '0', '.', '\261', '+', '=',
                     62:     '\272', '1', '2', '3', '-', 'c',
                     63:     '\273', '4', '5', '6', '*', '%',
                     64:     '\274', '7', '8', '9', '/', 'q',
                     65:     NULL
                     66: };
                     67: 
                     68: static char dkeys[25] =    /* 4th key is plusminus */
                     69: {
                     70:     ' ', '0', '.', '+', '+', '=',
                     71:     ' ', '1', '2', '3', '-', 'C',
                     72:     ' ', '4', '5', '6', '*', '%',
                     73:     ' ', '7', '8', '9', '/', ' ',
                     74:     NULL
                     75: };
                     76: 
                     77: /************* PROCEDURE DECLARATIONS   */
                     78: 
                     79: MPARAM EXPENTRY AboutDlgProc(HWND, USHORT, MPARAM, MPARAM);
                     80: BOOL CalcInit(VOID);
                     81: VOID CalcPaint( HWND, HPS);
                     82: extern BOOL CalcTextOut( HPS, INT, INT, PCH, INT);
                     83: MRESULT EXPENTRY CalcWndProc(HWND, USHORT, MPARAM, MPARAM);
                     84: VOID cdecl main(VOID);
                     85: VOID DataXCopy( VOID);
                     86: VOID DataXPaste( VOID);
                     87: VOID DrawNumbers( HPS);
                     88: VOID Evaluate(BYTE);
                     89: BOOL FlashSqr( HPS, NPWPOINT);
                     90: VOID FlipKey(HPS, int, int);
                     91: VOID FrameKey( HPS, INT, INT);
                     92: VOID InitCalc( VOID);
                     93: BOOL InterpretChar( CHAR);
                     94: VOID ProcessKey(HWND, WPOINT *);
                     95: BOOL PSInit( VOID);
                     96: char Translate(WPOINT *);
                     97: VOID UpdateDisplay( VOID);
                     98: 
                     99: 
                    100: 
                    101: /********************************************************************
                    102:    Write the appropriate number or error string to the display area
                    103:    and mark memory-in-use if appropriate.
                    104:  */
                    105: 
                    106: VOID UpdateDisplay()
                    107: {
                    108:     int len, size;
                    109:     HPS hps;
                    110:     RECTL rcl;
                    111: 
                    112:     len = strlen(szreg1);
                    113:     size = ((szreg1[0] == '-') ? 10 : 9);   /* check for leading minus sign */
                    114:     if (strchr(szreg1, '.'))
                    115:         size++;
                    116:     hps = WinGetPS(hwndCalc);
                    117: 
                    118:     rcl.xLeft = (6 * charwidth);
                    119:     rcl.yBottom = 1050 * charheight / 100;
                    120:     rcl.xRight = rcl.xLeft + (12 * charwidth);
                    121:     rcl.yTop = rcl.yBottom + charheight;
                    122:     WinFillRect(hps, &rcl, CLR_WHITE);     /* paint display area white */
                    123: 
                    124:     if (fError)                            /* display error or number  */
                    125:     {
                    126:             CalcTextOut( hps, 17 * charwidth - charwidth * 5,
                    127:                           1050 * charheight / 100,
                    128:                           (PSZ)"Error", 5);
                    129:     }
                    130:     else
                    131:     {
                    132:          CalcTextOut(hps, 18 * charwidth - (charwidth * min(len,size)),
                    133:                     1050 * charheight / 100, (PCH)szreg1, min(len, size));
                    134:     }
                    135: 
                    136:     if (fValueInMemory)                /* little black square shows mem use */
                    137:     {
                    138:        rcl.xLeft = (6 * charwidth);
                    139:        rcl.yBottom = 1050 * charheight / 100;
                    140:        rcl.xRight = rcl.xLeft + (charwidth / 2);
                    141:        rcl.yTop = rcl.yBottom + (charheight / 2);
                    142:        WinFillRect(hps, &rcl, CLR_BLACK);
                    143:     }
                    144:     WinReleasePS(hps);
                    145: }
                    146: 
                    147: 
                    148: /**********************************************************************
                    149:     Display helpful info
                    150:  */
                    151: 
                    152: MPARAM EXPENTRY AboutDlgProc(hwnd, msg, mp1, mp2)
                    153: HWND hwnd;
                    154: USHORT msg;
                    155: MPARAM mp1;
                    156: MPARAM mp2;
                    157: {
                    158:     if (msg == WM_COMMAND)
                    159:     {
                    160:         WinDismissDlg(hwnd, TRUE);
                    161:        return(MPFROMSHORT(TRUE));
                    162:     }
                    163:     else return(WinDefDlgProc(hwnd, msg, mp1, mp2));
                    164: }
                    165: 
                    166: 
                    167: /**********************************************************************
                    168:     General initialization
                    169:  */
                    170: 
                    171: BOOL CalcInit()
                    172: {
                    173:     hab = WinInitialize(0);
                    174: 
                    175:     hmqCalc = WinCreateMsgQueue( hab, 0);
                    176: 
                    177:     if (!WinRegisterClass( hab, szCalcClass, CalcWndProc, CS_SIZEREDRAW, 0))
                    178:         return(FALSE);
                    179: 
                    180:     hptrFinger = WinLoadPointer(HWND_DESKTOP, (HMODULE)NULL, IDP_FINGER);
                    181: 
                    182:     WinLoadString(NULL, NULL, 1, 30, (PSZ)szTitle);
                    183:     WinLoadString(NULL, NULL, 2, 20, (PSZ)szErrorString);
                    184:     WinLoadString(NULL, NULL, 3, 2, (PSZ)szPlusMinus);
                    185: 
                    186:     InitCalc();                        /* arithmetic initialization */
                    187: 
                    188:     return(TRUE);
                    189: }
                    190: 
                    191: /**********************************************************************
                    192:     main procedure
                    193:  */
                    194: 
                    195: VOID cdecl main()
                    196: {
                    197:     QMSG qmsg;
                    198:     ULONG ctlData;
                    199: 
                    200:     if (!CalcInit()) {                     /* general initialization */
                    201:         WinAlarm(HWND_DESKTOP, 0xffff);
                    202:         goto exit;
                    203:     }
                    204: 
                    205:     if (!PSInit()) {                       /* presentation spaces & bitmaps */
                    206:         WinAlarm(HWND_DESKTOP, 0xffff);
                    207:         goto exit;
                    208:     }
                    209: 
                    210:     ctlData = FCF_TITLEBAR | FCF_MINBUTTON | FCF_SYSMENU | FCF_MENU;
                    211:     hwndCalcFrame = WinCreateStdWindow(HWND_DESKTOP,
                    212:                                       FS_ACCELTABLE | FS_BORDER | FS_ICON,
                    213:                                       &ctlData, szCalcClass, szTitle, 0L,
                    214:                                        (HMODULE)NULL, IDR_CALC,
                    215:                                        (HWND FAR *)&hwndCalc);
                    216: 
                    217:     WinSetWindowPos(hwndCalcFrame, (HWND)NULL, 2, 2, CXCHARS * charwidth,
                    218:                     CYCHARS * charheight +
                    219:                     (SHORT)WinQuerySysValue(HWND_DESKTOP, SV_CYTITLEBAR) +
                    220:                     (SHORT)WinQuerySysValue(HWND_DESKTOP, SV_CYMENU),
                    221:                     SWP_MOVE | SWP_SIZE);
                    222:     WinShowWindow(hwndCalcFrame, TRUE);
                    223:     WinSetFocus(HWND_DESKTOP, hwndCalc);
                    224: 
                    225:     while (WinGetMsg( hab, (PQMSG)&qmsg, NULL, 0, 0))
                    226:        WinDispatchMsg( hab, (PQMSG)&qmsg);
                    227: 
                    228: exit:                                      /* clean up */
                    229:     if (hdcSqr)                            /* square-root bitmap */
                    230:     {
                    231:        GpiDestroyPS( hpsSqr);
                    232:        if (hbmSqr)
                    233:            GpiDeleteBitmap( hbmSqr);
                    234:     }
                    235: 
                    236:     if (hdcLocal)                          /* keypad button */
                    237:     {
                    238:        GpiDestroyPS( hpsLocal);
                    239:        if (hbmLocal)
                    240:            GpiDeleteBitmap( hbmLocal);
                    241:     }
                    242: 
                    243:     WinDestroyWindow(hwndCalcFrame);
                    244: 
                    245:     WinDestroyMsgQueue(hmqCalc);
                    246:     WinTerminate(hab);
                    247: 
                    248:     DosExit(EXIT_PROCESS, 0);              /* exit without error */
                    249: }
                    250: 
                    251: 
                    252: /*************************************************************************
                    253:    Calc Window Procedure
                    254:  */
                    255: 
                    256: MRESULT EXPENTRY CalcWndProc(hwnd, msg, mp1, mp2)
                    257: HWND hwnd;
                    258: USHORT msg;
                    259: MPARAM mp1;
                    260: MPARAM mp2;
                    261: {
                    262:     HPS hps;
                    263:     RECTL rclPaint;
                    264:     WPOINT pt;
                    265:     BOOL fClip;
                    266:     USHORT fi;
                    267: 
                    268:     switch (msg)
                    269:     {
                    270:     case WM_CREATE:
                    271:         /* Set up this global first thing in case we need it elsewhere */
                    272:         hwndCalc = hwnd;
                    273:         break;
                    274: 
                    275:     case WM_DESTROY:
                    276:         WinDestroyPointer(hptrFinger);
                    277:        GpiDestroyPS( hpsSqr);
                    278:        GpiDeleteBitmap( hbmSqr);
                    279:        GpiDestroyPS( hpsLocal);
                    280:        GpiDeleteBitmap( hbmLocal);
                    281:         break;
                    282: 
                    283:     case WM_INITMENU:
                    284:         fClip = FALSE;
                    285:         if (WinOpenClipbrd(NULL))
                    286:         {
                    287:             fClip = WinQueryClipbrdFmtInfo(NULL, CF_TEXT, (USHORT FAR *)&fi);
                    288:             WinCloseClipbrd(NULL);
                    289:         }
                    290:        WinSendMsg((HWND)mp2, MM_SETITEMATTR,
                    291:                   (MPARAM) MAKELONG(CMD_PASTE, TRUE),
                    292:                   (MPARAM) MAKELONG(MIA_DISABLED, fClip ? 0 : MIA_DISABLED));
                    293:         break;
                    294: 
                    295:     case WM_PAINT:
                    296:        hps = WinBeginPaint(hwnd, NULL, &rclPaint);
                    297:        CalcPaint( hwnd, hps);                      /* re-draw calculator */
                    298:         WinEndPaint(hps);
                    299:         break;
                    300: 
                    301:     case WM_COMMAND:
                    302:        if (fError)
                    303:             break;
                    304:         switch(LOUSHORT(mp1))
                    305:         {
                    306:         case CMD_COPY:
                    307:            DataXCopy();                    /* copy to clipboard */
                    308:             break;
                    309:         case CMD_PASTE:
                    310:            DataXPaste();                   /* paste from clipboard */
                    311:             break;
                    312:         case CMD_EXIT:
                    313:             WinPostMsg(hwndCalcFrame, WM_QUIT, 0L, 0L);
                    314:             break;
                    315:         case CMD_ABOUT:
                    316:             WinDlgBox(HWND_DESKTOP, hwndCalcFrame, (PFNWP)AboutDlgProc, NULL,
                    317:                       1, (PSZ)NULL);
                    318:             break;
                    319:         }
                    320:         break;
                    321: 
                    322:     case WM_MOUSEMOVE:
                    323:         WinSetPointer(HWND_DESKTOP, hptrFinger);
                    324:         break;
                    325: 
                    326:     case WM_BUTTON1DOWN:
                    327:         pt.x = LOUSHORT(mp1);
                    328:         pt.y = HIUSHORT(mp1);
                    329:        ProcessKey(hwndCalc, &pt);
                    330:         goto dwp;
                    331:         break;
                    332: 
                    333:     case WM_CHAR:
                    334:        if (SHORT1FROMMP(mp1) & KC_KEYUP)
                    335:        {
                    336:            if (CHAR4FROMMP(mp1) == mScan)
                    337:                fMDown = FALSE;                 /* 'm' key went up */
                    338:        }
                    339:        else if (SHORT1FROMMP(mp1) & KC_CHAR)
                    340:         {
                    341:            if (InterpretChar(CHAR1FROMMP(mp2)))
                    342:                UpdateDisplay();
                    343:            else if ((CHAR1FROMMP(mp2)=='m') || (CHAR1FROMMP(mp2)=='M'))
                    344:            {
                    345:                mScan = CHAR4FROMMP(mp1);       /* save 'm' key scan code */
                    346:                fMDown = TRUE;                  /* 'm' key went down */
                    347:            }
                    348:         }
                    349:         break;
                    350: 
                    351:     case WM_ACTIVATE:
                    352:         if (HIUSHORT(mp1))
                    353:             WinSetFocus(HWND_DESKTOP, hwndCalc);
                    354:        break;
                    355: 
                    356:     case WM_SETFOCUS:
                    357:        if ((HWNDFROMMP(mp1)==hwndCalc) && !mp2);
                    358:            fMDown = FALSE;                     /* since we are losing focus */
                    359:        break;
                    360: 
                    361: dwp:
                    362:     default:
                    363:         return(WinDefWindowProc(hwnd, msg, mp1, mp2));
                    364:         break;
                    365:     }
                    366:     return(0L);
                    367: }
                    368: 
                    369: 
                    370: /*************************************************************************
                    371:     translate & interpret keys (ie. locate in logical keyboard)
                    372:  */
                    373: 
                    374: BOOL InterpretChar(ch)
                    375: register CHAR ch;
                    376: {
                    377:     BOOL fDone;
                    378:     CHAR *chstep;
                    379:     register int n;
                    380:     HPS hps;
                    381: 
                    382:     fDone = FALSE;
                    383:     chstep = keys;
                    384:     switch (ch)
                    385:     {
                    386:     case 'n':
                    387:        ch = szPlusMinus[0];
                    388:         break;
                    389:     case 27:                        /* xlate Escape into 'c' */
                    390:         ch = 'c';
                    391:         break;
                    392:     case '\r':                      /* xlate Enter into '=' */
                    393:         ch = '=';
                    394:         break;
                    395:     }
                    396: 
                    397:     if (fMDown)                    /* Do memory keys */
                    398:     {
                    399:         switch (ch)
                    400:         {
                    401:         case 'c':
                    402:         case 'C':
                    403:             ch = '\274';
                    404:             break;
                    405:         case 'r':
                    406:         case 'R':
                    407:             ch = '\273';
                    408:             break;
                    409:         case '+':
                    410:             ch = '\272';
                    411:             break;
                    412:         case '-':
                    413:             ch = '\271';
                    414:             break;
                    415:         }
                    416:     }
                    417: 
                    418:     while (!fDone && *chstep)
                    419:     {
                    420:         if (*chstep++ == ch)
                    421:            fDone = TRUE;               /* char found in logical keyboard */
                    422:     }
                    423:     if (fDone)
                    424:     {
                    425:         lastkey = currkey;
                    426:         n = chstep - keys - 1;
                    427:         hps = WinGetPS(hwndCalc);
                    428:         FlipKey(hps, n/6, n%6);
                    429:         WinReleasePS(hps);
                    430:         Evaluate(keys[n]);
                    431:     }
                    432:     return (fDone);
                    433: }
                    434: 
                    435: 
                    436: /*************************************************************************
                    437:     briefly reverse the shading on one of the keys
                    438:  */
                    439: 
                    440: VOID FlipKey(hps, i, j)
                    441: HPS hps;
                    442: int i,j;
                    443: {
                    444:     RECTL rcl;
                    445: 
                    446:     rcl.xLeft = (j * 6 * charwidth) + (14 * charwidth / 10);
                    447:     rcl.yBottom = (165 * charheight / 100) + (2 * i * charheight);
                    448:     rcl.xRight = rcl.xLeft + (11 * charwidth / 3);
                    449:     rcl.yTop = rcl.yBottom + (7 * charheight / 4);
                    450:     WinInvertRect(hps, &rcl);
                    451:     DosSleep(50L);
                    452:     WinInvertRect(hps, &rcl);
                    453: }
                    454: 
                    455: 
                    456: /*************************************************************************
                    457:     compute whether a point is over a button and flash the button if so
                    458:  */
                    459: 
                    460: BOOL FlashSqr(hps, ppt)
                    461: HPS hps;
                    462: NPWPOINT ppt;
                    463: {
                    464:     register int i;
                    465:     register int j;
                    466:     BOOL fDone;
                    467: 
                    468:     /* find x range */
                    469:     fDone = FALSE;
                    470:     j = 0;
                    471:     i = 3;
                    472:     while (!fDone && j<6)
                    473:     {
                    474:         if (ppt->x < (j * 6 * charwidth) + (14 * charwidth / 10) +
                    475:                      (11*charwidth/3))
                    476:         {
                    477:             if (ppt->x > (j * 6 * charwidth) + (14 * charwidth / 10))
                    478:                 fDone = TRUE;
                    479:             else
                    480:                 return FALSE;
                    481:         }
                    482:         else
                    483:             j++;
                    484:     }
                    485:     if (!fDone)
                    486:         return FALSE;
                    487:     fDone = FALSE;
                    488:     while (!fDone && i >= 0)
                    489:     {
                    490:         if (ppt->y > ((165 * charheight / 100) + (2 * i * charheight)))
                    491:         {
                    492:             if (ppt->y < ((165 * charheight / 100) + (2 * i * charheight) +
                    493:                      (7 * charheight / 4)))
                    494:                 fDone = TRUE;
                    495:             else
                    496:                 return FALSE;
                    497:         }
                    498:         else
                    499:             i--;
                    500:     }
                    501:     if (!fDone)
                    502:         return FALSE;
                    503:     ppt->x = i;
                    504:     ppt->y = j;
                    505:     FlipKey(hps, i, j);
                    506:     return TRUE;
                    507: }
                    508: 
                    509: 
                    510: /*************************************************************************
                    511:     which key is point on?
                    512:  */
                    513: 
                    514: char Translate(ppt)
                    515: WPOINT *ppt;
                    516: {
                    517:     register int offset;
                    518:     register char result;
                    519: 
                    520:     offset = ppt->x * 6 + ppt->y;
                    521:     result = keys[offset];
                    522:     return result;
                    523: }
                    524: 
                    525: 
                    526: /*************************************************************************
                    527:     invoke flashing, point-to-key translation, and result-display update
                    528:  */
                    529: 
                    530: VOID ProcessKey(hwnd, ppt)
                    531: HWND hwnd;
                    532: WPOINT *ppt;
                    533: {
                    534:     HPS hps;
                    535:     register BOOL fFlashed;
                    536: 
                    537:     hps = WinGetPS(hwnd);
                    538:     lastkey = currkey;
                    539:     fFlashed = FlashSqr(hps, ppt);
                    540:     WinReleasePS(hps);
                    541: 
                    542:     if (fFlashed)
                    543:         Evaluate((BYTE)Translate(ppt));
                    544:     UpdateDisplay();
                    545: }
                    546: 
                    547: 
                    548: /*************************************************************************
                    549:     draw a blank key
                    550:  */
                    551: 
                    552: VOID FrameKey(hps, i, j)
                    553: HPS hps;
                    554: int i, j;
                    555: {
                    556:     POINTL aptl[3];
                    557: 
                    558:     aptl[0].x = (j * 6 * charwidth) + (14 * charwidth / 10);
                    559:     aptl[0].y = (165 * charheight / 100) + (2 * i * charheight);
                    560:     aptl[1].x = (11 * charwidth / 3) + (aptl[0].x);
                    561:     aptl[1].y = (7 * charheight / 4) + (aptl[0].y);
                    562:     aptl[2].x = 0;
                    563:     aptl[2].y = 0;
                    564:     GpiBitBlt( hps, hpsLocal, 3L, aptl, ROP_SRCCOPY, BBO_IGNORE);
                    565: }
                    566: 
                    567: 
                    568: /*************************************************************************
                    569:     draw the keys and fill in numbers
                    570:  */
                    571: 
                    572: VOID DrawNumbers(hps)
                    573: HPS hps;
                    574: {
                    575:     register int i,j;
                    576: 
                    577:     /* Draw the keys and fill in the numbers we can */
                    578:     for (i = 0; i < 4; i++)
                    579:     {
                    580:         for (j = 0; j < 6; j++)
                    581:         {
                    582:             FrameKey(hps, i, j);
                    583:             CalcTextOut(hps,
                    584:                         (j * 6 * charwidth) + (WIDTHCONST * charwidth / 10),
                    585:                         (charheight) + ( i * 2 * charheight) + (charheight),
                    586:                         (PSZ)((char *)dkeys + (i * 6) + j), 1);
                    587:         }
                    588:     }
                    589: }
                    590: 
                    591: 
                    592: /*************************************************************************
                    593:     redraw the whole calculator
                    594:  */
                    595: 
                    596: VOID CalcPaint( hwnd, hps)
                    597: HWND hwnd;
                    598: HPS hps;
                    599: {
                    600:     RECTL rclDst;
                    601:     CHARBUNDLE cbnd;
                    602:     register int x1, y1;
                    603: 
                    604:     WinQueryWindowRect( hwnd, &rclDst);
                    605:     WinFillRect( hps, &rclDst, CLR_GREEN);
                    606: 
                    607:     DrawNumbers(hps);
                    608:     CalcTextOut(hps, x1 = (11 * charwidth / 5) + 1, y1 = 2 * charheight,
                    609:                (PSZ)"M-", 2);
                    610:     CalcTextOut(hps, x1, y1 + 2 * charheight, (PSZ)"M+", 2);
                    611:     CalcTextOut(hps, x1, y1 + 4 * charheight, (PSZ)"MR", 2);
                    612:     CalcTextOut(hps, x1, y1 + 6 * charheight, (PSZ)"MC", 2);
                    613: 
                    614:     /* Draw the minus of the plus/minus button */
                    615:     cbnd.usBackMixMode = FM_LEAVEALONE;
                    616:     GpiSetAttrs( hps, PRIM_CHAR, CBB_BACK_MIX_MODE, 0L, &cbnd);
                    617:     x1 =  (3 * 6 * charwidth) + (WIDTHCONST * charwidth / 10);
                    618:     CalcTextOut( hps, x1, y1 - charheight / 3, (PSZ)"-", 1);
                    619: 
                    620:     /* Draw the square root bitmap */
                    621:     rclDst.xLeft = 160 * charwidth / 5;
                    622:     rclDst.yBottom = 31 * charheight / 4;
                    623:     rclDst.xRight = rclDst.xLeft + 2 * charwidth;
                    624:     rclDst.yTop = rclDst.yBottom + (3 * charheight / 2);
                    625:     WinDrawBitmap( hps, hbmSqr, NULL, (PPOINTL)&rclDst, CLR_WHITE, CLR_BLACK, DBM_STRETCH);
                    626: 
                    627:     UpdateDisplay();
                    628: }
                    629: 
                    630: 
                    631: /*************************************************************************
                    632:     initialize the bitmaps for a blank key and for the square-root sign
                    633:  */
                    634: BOOL PSInit()
                    635: {
                    636:     HPS hps;
                    637:     FONTMETRICS fntmet;
                    638:     POINTL ptl;
                    639:     SIZEL sizl;
                    640:     BITMAPINFOHEADER bmp;
                    641:     POINTL aptl[4];
                    642:     LONG alCaps[2];
                    643: 
                    644:     hps = WinGetPS( HWND_DESKTOP);
                    645:     GpiQueryFontMetrics( hps, (LONG)sizeof(FONTMETRICS), &fntmet);
                    646:     charheight = (SHORT)(fntmet.lEmHeight);
                    647:     charwidth  = (SHORT)(fntmet.lAveCharWidth);
                    648:     WinReleasePS( hps);
                    649: 
                    650:     hdcLocal = DevOpenDC( hab, OD_MEMORY, "*", 3L, (PDEVOPENDATA)&dop, NULL);
                    651:     if( !hdcLocal)
                    652:        return(FALSE);
                    653: 
                    654:     sizl.cx = sizl.cy = 0L;
                    655:     hpsLocal = GpiCreatePS( hab, hdcLocal, &sizl, PU_PELS | GPIT_MICRO
                    656:                                                  | GPIA_ASSOC);
                    657: 
                    658:     hdcSqr = DevOpenDC( hab, OD_MEMORY, "*", 3L, (PDEVOPENDATA)&dop, NULL);
                    659:     if( !hdcSqr)
                    660:        return(FALSE);
                    661: 
                    662:     sizl.cx = sizl.cy = 0L;
                    663:     hpsSqr = GpiCreatePS( hab, hdcSqr, &sizl, PU_PELS | GPIT_MICRO
                    664:                                              | GPIA_ASSOC);
                    665:     hbmSqr = GpiLoadBitmap( hpsSqr, NULL, IDB_SQR, 0L, 0L);
                    666: 
                    667:     bmp.cx = 11 * charwidth / 3;
                    668:     bmp.cy = charheight * 2;
                    669:     DevQueryCaps( hdcLocal, CAPS_COLOR_PLANES, 2L, alCaps);
                    670:     bmp.cPlanes = (USHORT)alCaps[0];
                    671:     bmp.cBitCount = (USHORT)alCaps[1];
                    672:     hbmLocal = GpiCreateBitmap( hpsLocal, &bmp, 0L, NULL, NULL);
                    673:     if( !hbmLocal )
                    674:        return(FALSE);
                    675:     GpiSetBitmap( hpsLocal, hbmLocal);
                    676: 
                    677:     /* Fill in the DC with CALC's background color */
                    678:     aptl[0].x = aptl[0].y = 0;
                    679:     aptl[1].x = 11 * charwidth / 3;
                    680:     aptl[1].y = 7 * charheight / 4;
                    681:     aptl[2].x = aptl[2].y = 0;
                    682:     aptl[3].x = aptl[1].x;
                    683:     aptl[3].y = aptl[1].y;
                    684:     GpiSetColor( hpsLocal, CLR_GREEN);
                    685:     GpiBitBlt( hpsLocal, NULL, 2L, aptl, ROP_PATCOPY, BBO_IGNORE);
                    686: 
                    687:     /* Draw the rounded rect in the local PS */
                    688:     ptl.x = 0;
                    689:     ptl.y = 0;
                    690:     GpiSetCurrentPosition( hpsLocal, &ptl);
                    691:     ptl.x = (11 * charwidth / 3) - 1;
                    692:     ptl.y = (7 * charheight / 4) - 1;
                    693:     GpiSetColor( hpsLocal, CLR_WHITE);
                    694:     GpiBox( hpsLocal, DRO_FILL, &ptl, (LONG)charwidth,
                    695:                                                (LONG)(charheight/2));
                    696:     ptl.x = 0;
                    697:     ptl.y = 0;
                    698:     GpiSetCurrentPosition( hpsLocal, &ptl);
                    699:     ptl.x = (11 * charwidth / 3) - 1;
                    700:     ptl.y = (7 * charheight / 4) - 1;
                    701:     GpiSetColor( hpsLocal, CLR_BLACK);
                    702:     GpiBox( hpsLocal, DRO_OUTLINE, &ptl, (LONG)charwidth,
                    703:                                                (LONG)(charheight/2));
                    704:     return( TRUE);
                    705: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.