Annotation of pmsdk/samples/bio/wndproc.c, revision 1.1.1.1

1.1       root        1: /*  BioWndProc() - Parent WndProc message processing routine.
                      2: *
                      3: *   Created by Microsoft Corp., 1988
                      4: *
                      5: *   Purpose:
                      6: *       WndProc callback function to handle all messages for parent window.
                      7: *
                      8: *   Arguments:
                      9: *       hWnd          - Handle of Window owning message
                     10: *       message       - Message itself
                     11: *       mp1           - Extra message-dependent info
                     12: *       mp2           - Extra message-dependent info
                     13: *
                     14: *   Globals (modified):
                     15: *       Born          - Bithdate in julian days.  Read from WIN.INI.
                     16: *       SelectDay     - Current day being tracked, day is highlighted.  Is
                     17: *                       in units of days from birth date.  Date of present
                     18: *                       day initially used in WM_CREATE.
                     19: *       daylight      - Defined by environment string TZ.  If no such string,
                     20: *       timezone        default TZ=PST8PDT used.  If daylight field is
                     21: *                       used, daylight time correction will occur.  See
                     22: *                       documentation of tzset() C run-time function.
                     23: *       Day           - Day number from date born which is top line being
                     24: *                       displayed.  Initially three days before SelectDay.
                     25: *       bKid          - Boolean indicating whether child window legend is visible.
                     26: *       bBorn         - Boolean indicating whether valid birtdate entered or
                     27: *                       defined in WIN.INI.  Nothing graphed until valid.
                     28: *       rectClient    - Size of client area defined by WM_SIZE message
                     29: *       LinesPerPage  - Number of system font lines on client area, defined
                     30: *                       by WM_SIZE message handling
                     31: *       Color[]       - Set of colored pens used to identify cycles.
                     32: *       tmFontInfo    - Text Metric structure defined during WM_CREATE 
                     33: *
                     34: *   Globals (referenced):
                     35: *       hAB           - Handle to the Anchor Block
                     36: *       hwndAppFrame  - Window handle of parent window's frame
                     37: *       hwndKidFrame  - Handle to child window used for showing/moving legend.
                     38: *       szAppName[]   - RC file program name (Biorhythm).
                     39: *
                     40: *   Description:
                     41: *       Handle all messages for the parent window.
                     42: *
                     43: *   Limits:
                     44: *       N/A
                     45: *
                     46: */
                     47: 
                     48: #define INCL_GPI
                     49: #define INCL_WIN
                     50: #include <os2.h>
                     51: 
                     52: #include "bio.h"
                     53: #include <time.h>
                     54: #include <stdio.h>
                     55: 
                     56: /* Read-only global variables */
                     57: extern HAB      hAB;
                     58: extern HWND     hwndApp;
                     59: extern HWND     hwndAppFrame, hwndKidFrame;
                     60: extern char     szAppName[];
                     61: 
                     62: /* Write-once Global variables */
                     63: LONG Color[] = {CLR_RED, CLR_GREEN, CLR_BLUE};
                     64: FONTMETRICS     tmFontInfo;
                     65: 
                     66: /* Read-Write global variables */
                     67: double          Born;
                     68: long            Day, SelectDay;
                     69: BOOL            bKid = TRUE;
                     70: BOOL            bBorn = TRUE;
                     71: RECTL           rectClient;
                     72: int             LinesPerPage;
                     73: 
                     74: 
                     75: MRESULT FAR PASCAL BioWndProc( hWnd, message, mp1, mp2 )
                     76: HWND   hWnd;
                     77: USHORT message;
                     78: MPARAM  mp1;
                     79: MPARAM  mp2;
                     80: {
                     81:     /* Procedures which make up the window class. */
                     82:     int         year, month, iDay, i;
                     83:     double      day;
                     84:     HPS         hPS;
                     85:     RECTL       rc;
                     86: 
                     87:     switch( message )
                     88:     {
                     89: 
                     90:     case WM_CREATE:
                     91:         /* Read in birth date from OS2.INI.  Error value is 12-31-1899,
                     92:            which is out of range for valid entries. */
                     93:         year = WinQueryProfileInt( hAB, szAppName, "Year", 1899 );
                     94:         month = WinQueryProfileInt( hAB, szAppName, "Month", 12 );
                     95:         day = (double)WinQueryProfileInt( hAB, szAppName, "Day", 31 );
                     96:         /* Compute date of birth in julian days */
                     97:         Born = julian( year, month, day );
                     98: 
                     99:         /* Get time zone environment information */
                    100:         tzset();
                    101:         /* System clock starts 1-1-1970.  Get julian date then and how many
                    102:            days have elapsed since, so that number of days since birth date
                    103:            can be determined */
                    104:         SelectDay  = (long)(julian( 1970, 1, 1.0 ) +
                    105:            (double)((time(NULL) - timezone + (long)daylight*3600)/86400) -
                    106:            Born);
                    107: 
                    108:         /* If no valid OS2.INI info then automatically bring up dialog box */
                    109:         if (year < 1900) {
                    110:            bBorn = FALSE;
                    111:            WinPostMsg( hWnd, WM_COMMAND, (MPARAM)MAKEULONG(IDDATES, 0), 0L );
                    112:         }
                    113: 
                    114:         /* Put date of the day three lines down on display */
                    115:         Day = SelectDay - 3;
                    116:         /* Initially set elevator */
                    117:         iDay = (int)(Day/365);
                    118:        WinSendMsg( WinWindowFromID( WinQueryWindow(hWnd,QW_PARENT,FALSE),
                    119:                                     FID_VERTSCROLL),
                    120:                     SBM_SETPOS, (MPARAM)MAKEULONG(iDay, 0), 0L );
                    121: 
                    122:         /* Get System font text metrics */
                    123:         hPS = WinGetPS( hWnd );
                    124:         GpiQueryFontMetrics( hPS, (LONG)sizeof tmFontInfo, &tmFontInfo );
                    125:         WinReleasePS( hPS );
                    126:         break;
                    127: 
                    128:     case WM_CLOSE:
                    129:         WinPostMsg( hWnd, WM_QUIT, 0L, 0L );
                    130:         break;
                    131: 
                    132:     case WM_COMMAND:
                    133:         switch (LOUSHORT(mp1)) {
                    134:             case IDDATES:
                    135:                 if (WinDlgBox( HWND_DESKTOP, hWnd, (PFNWP)BioDlg, NULL, IDD_DATE, NULL )) {
                    136:                    WinInvalidateRect( hWnd, NULL, FALSE );
                    137:                    iDay = (int)(Day/365);
                    138:                    WinSendMsg( WinWindowFromID( hwndAppFrame, FID_VERTSCROLL),
                    139:                                SBM_SETPOS, (MPARAM)MAKEULONG(iDay, 0), 0L );
                    140:                 }
                    141:                 break;
                    142: 
                    143:            case IDKID:
                    144:                 if (bKid = !bKid) {
                    145:                    WinSendMsg( WinWindowFromID( hwndAppFrame, FID_MENU),
                    146:                                MM_SETITEMATTR,
                    147:                               (MPARAM)MAKEULONG( IDKID, TRUE ),
                    148:                                (MPARAM)MAKEULONG( MIA_CHECKED, MIA_CHECKED) );
                    149:                    WinShowWindow( hwndKidFrame, TRUE );
                    150:                 } else {
                    151:                    WinSendMsg( WinWindowFromID( hwndAppFrame, FID_MENU),
                    152:                                MM_SETITEMATTR,
                    153:                               (MPARAM)MAKEULONG( IDKID, TRUE ),
                    154:                                (MPARAM)MAKEULONG( MIA_CHECKED, 0) );
                    155:                    WinShowWindow( hwndKidFrame, FALSE );
                    156:                 }
                    157:                 break;
                    158: 
                    159:             case IDCOPY:
                    160:                 WinMessageBox( HWND_DESKTOP, hWnd,
                    161:                                (NPCH)"Coming soon to a theatre near you",
                    162:                                (NPCH)"BitBlt to Clipboard", NULL,
                    163:                                MB_OK | MB_ICONEXCLAMATION );
                    164:                 break;
                    165: 
                    166:             case IDABOUT:
                    167:                 WinDlgBox( HWND_DESKTOP, hWnd, (PFNWP)About, NULL,
                    168:                            IDD_ABOUT, NULL );
                    169:                 break;
                    170: 
                    171:             default:
                    172:                 break;
                    173:             }
                    174:             break;
                    175: 
                    176:     case WM_SIZE:
                    177:         WinQueryWindowRect( hWnd, &rectClient );
                    178:         LinesPerPage = (int)(rectClient.yTop / tmFontInfo.lMaxBaselineExt);
                    179:         WinSetWindowPos( hwndKidFrame, NULL, 10, 10, 0, 0, SWP_MOVE );
                    180:         break;
                    181: 
                    182:     case WM_CHAR:
                    183:        /* Send keyboard characters to scroll bar to support scrolling,
                    184:           paging, etc. */
                    185:        return WinSendMsg( WinWindowFromID( hwndAppFrame, FID_VERTSCROLL),
                    186:                           message, mp1, mp2 );
                    187:         break;
                    188: 
                    189:     case WM_VSCROLL:
                    190:         /* Don't allow any processing until valid birth date entered */
                    191:         if (!bBorn) break;
                    192: 
                    193:         /* Setup for scroll window - full width of client area is scrolled */
                    194:         WinCopyRect( hAB, &rc, &rectClient );
                    195:         switch (HIUSHORT(mp2)) {
                    196:           case SB_LINEUP:
                    197:             /* Update top day of display */
                    198:             Day--;
                    199:             rc.yTop = rectClient.yTop - tmFontInfo.lMaxBaselineExt;
                    200:             rc.yBottom = rectClient.yTop - (LinesPerPage-1) * tmFontInfo.lMaxBaselineExt + 1;
                    201:             WinScrollWindow( hWnd, 0, (SHORT)-tmFontInfo.lMaxBaselineExt, &rc,
                    202:                              NULL, NULL, NULL, SW_INVALIDATERGN );
                    203:             break;
                    204:           case SB_LINEDOWN:
                    205:             /* Update top day of display */
                    206:             Day++;
                    207:             rc.yTop = rectClient.yTop - 2*tmFontInfo.lMaxBaselineExt;
                    208:             rc.yBottom = rectClient.yTop - (LinesPerPage) * tmFontInfo.lMaxBaselineExt + 1;
                    209:             WinScrollWindow( hWnd, 0, (SHORT)tmFontInfo.lMaxBaselineExt, &rc,
                    210:                              NULL, NULL, NULL, SW_INVALIDATERGN );
                    211:             break;
                    212:           case SB_PAGEUP:
                    213:             Day -= (LinesPerPage-1);
                    214:             break;
                    215:           case SB_PAGEDOWN:
                    216:             Day += (LinesPerPage-1);
                    217:             break;
                    218:           case SB_SLIDERPOSITION:
                    219:             /* Set to birthday of each year because 100 year scale maps to
                    220:                default 100 position scroll bar */
                    221:             Day = (long)(LOUSHORT(mp2) * 365.25);
                    222:             break;
                    223:         default:
                    224:             return 0L;
                    225:       }
                    226:       /* Update scroll bar elevator */
                    227:       iDay = (int)(Day/365);
                    228:       WinSendMsg( WinWindowFromID( hwndAppFrame, FID_VERTSCROLL),
                    229:                   SBM_SETPOS, (MPARAM)MAKEULONG(iDay, 0), 0L );
                    230:       /* All but LINEUP/DOWN need full repaint of client area */
                    231:       if ((HIUSHORT(mp2) != SB_LINEUP) && (HIUSHORT(mp2) != SB_LINEDOWN ))
                    232:          WinInvalidateRect( hWnd, NULL, FALSE );
                    233:       WinUpdateWindow( hWnd );
                    234:       break;
                    235: 
                    236:     case WM_PAINT:
                    237:        APPPaint( hWnd );
                    238:         break;
                    239: 
                    240:     case WM_BUTTON1DOWN:
                    241:         /* Don't allow any processing until valid birth date entered */
                    242:         if (!bBorn) break;
                    243: 
                    244:         /* Unhighlight previously selected line and highlight new line */
                    245:         WinCopyRect( hAB, &rc, &rectClient );
                    246:         hPS = WinGetPS( hWnd );
                    247:         for(i=0; i<2; i++) {
                    248:           /* Make sure line is visible before (un)highlighting */
                    249:           if ((SelectDay >= Day) && (SelectDay - Day < LinesPerPage-1)) {
                    250:              rc.yTop = rectClient.yTop - (int)(SelectDay - Day + 1) * tmFontInfo.lMaxBaselineExt;
                    251:              rc.yBottom = rc.yTop - tmFontInfo.lMaxBaselineExt + 1;
                    252:              WinInvertRect( hPS, &rc );
                    253:           }
                    254:           /* New line to highlight */
                    255:           SelectDay = Day + (rectClient.yTop - HIUSHORT(mp1)) / 
                    256:                       tmFontInfo.lMaxBaselineExt - 1;
                    257:         }
                    258:         WinReleasePS( hPS );
                    259:         break;
                    260: 
                    261:     /* Draw highlight on selected day */
                    262:     if ((SelectDay >= Day) && (SelectDay - Day < LinesPerPage - 1)) {
                    263:         rc.xRight = rectClient.xRight;
                    264:         rc.xLeft = rectClient.xLeft;
                    265:     }
                    266:     default:
                    267:         return WinDefWindowProc( hWnd, message, mp1, mp2 );
                    268:         break;
                    269:     }
                    270:     return( 0L );
                    271: }
                    272: 
                    273: /*  KidWndProc() - Child WndProc handling legend display.
                    274: *
                    275: *   Purpose:
                    276: *       WndProc callback function to handle all messages for legend child.
                    277: *
                    278: *   Arguments:
                    279: *       hWnd          - Handle of Window owning message
                    280: *       message       - Message itself
                    281: *       mp1           - Extra message-dependent info
                    282: *       mp2           - Extra message-dependent info
                    283: *
                    284: *   Globals (modified):
                    285: *       none
                    286: *
                    287: *   Globals (referenced):
                    288: *       hwndApp       - Window handle of parent window's client area
                    289: *       tmFontInfo    - Text Metric structure defined during WM_CREATE 
                    290: *       Color[]       - Set of colored pens used to identify cycles.
                    291: *
                    292: *   Description:
                    293: *       Display legend information relating graph line styles to each
                    294: *       cyle: physical, emotional and intellectual.  Notifies parent
                    295: *       to hide child if child window is instructed to close by user.
                    296: *
                    297: *   Limits:
                    298: *       N/A.
                    299: *
                    300: */
                    301: 
                    302: /* Read-only global variables */
                    303: extern HWND     hwndApp;
                    304: 
                    305: MRESULT FAR PASCAL KidWndProc( hWnd, message, mp1, mp2 )
                    306: HWND    hWnd;
                    307: USHORT  message;
                    308: MPARAM  mp1;
                    309: MPARAM  mp2;
                    310: {
                    311:     HPS         hPS;
                    312:     RECTL       rc;
                    313:     POINTL      ptl;
                    314:     int         i;
                    315: 
                    316:     switch( message )
                    317:     {
                    318:         case WM_PAINT:
                    319:             hPS = WinBeginPaint( hWnd, NULL, NULL );
                    320: 
                    321:            /* Erase client area */
                    322:             WinQueryWindowRect( hWnd, &rc );
                    323:            WinFillRect( hPS, &rc, CLR_PALEGRAY );
                    324: 
                    325:             ptl.x = 0;
                    326:             ptl.y = tmFontInfo.lMaxDescender;
                    327:             GpiCharStringAt( hPS, &ptl, 9L, (PCH)"Physical " );
                    328:             ptl.y += tmFontInfo.lMaxBaselineExt;
                    329:             GpiCharStringAt( hPS, &ptl, 9L, (PCH)"Emotional" );
                    330:             ptl.y += tmFontInfo.lMaxBaselineExt;
                    331:             GpiCharStringAt( hPS, &ptl, 9L, (PCH)"Intellect" );
                    332: 
                    333:             for (i=0; i<3; i++ ) {
                    334:                 GpiSetColor( hPS, Color[i] );
                    335:                 ptl.x = tmFontInfo.lAveCharWidth * 10;
                    336:                 ptl.y = i * tmFontInfo.lMaxBaselineExt +
                    337:                         tmFontInfo.lMaxBaselineExt/2;
                    338:                 GpiMove( hPS, &ptl );
                    339:                 ptl.x = tmFontInfo.lAveCharWidth * 20;
                    340:                 GpiLine( hPS, &ptl );
                    341:             }
                    342: 
                    343:             WinEndPaint( hPS );
                    344:             break;
                    345: 
                    346: 
                    347:         case WM_CLOSE:
                    348:            WinPostMsg( hwndApp, WM_COMMAND, (MPARAM)MAKEULONG(IDKID, 0), 0L );
                    349:             break;
                    350: 
                    351:         default:
                    352:             return WinDefWindowProc( hWnd, message, mp1, mp2 );
                    353:             break;
                    354:     }
                    355:     return( 0L );
                    356: }

unix.superglobalmegacorp.com

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