|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.