|
|
1.1 ! root 1: /* Biorhythm - Utility to compute personal biorhythm charts. ! 2: * ! 3: * Created by Microsoft, IBM Corporation, 1990 ! 4: * ! 5: * DISCLAIMER OF WARRANTIES. The following [enclosed] code is ! 6: * sample code created by Microsoft Corporation and/or IBM ! 7: * Corporation. This sample code is not part of any standard ! 8: * Microsoft or IBM product and is provided to you solely for ! 9: * the purpose of assisting you in the development of your ! 10: * applications. The code is provided "AS IS", without ! 11: * warranty of any kind. Neither Microsoft nor IBM shall be ! 12: * liable for any damages arising out of your use of the sample ! 13: * code, even if they have been advised of the possibility of ! 14: * such damages. ! 15: * ! 16: * Purpose: ! 17: * Program entry point, initialization and GetMessage loop. ! 18: * ! 19: * Arguments: ! 20: * None ! 21: * ! 22: * Globals (modified): ! 23: * hAB - Handle to the Anchor Block ! 24: * hMsgQ - Handle to the application's message queue ! 25: * hwndAppFrame - Window handle of parent window's frame ! 26: * hwndKidFrame - Window handle of parent window's frame ! 27: * hwndApp - Window handle of parent window's client area ! 28: * hwndKid - Window handle of child window's client area ! 29: * szAppName[10] - RC file program name (Biorhythm). ! 30: * szKidName[10] - RC file child window name (Legend). ! 31: * ! 32: * Globals (referenced): ! 33: * tmFontInfo - Text Metric structure defined during WM_CREATE ! 34: * ! 35: * Description: ! 36: * The theory of biorhythms states that life consists of three cycles, ! 37: * physical, emotional and intellectual of 23, 28 and 33 days, ! 38: * respectively. The cycles each begin on the date of birth. ! 39: * ! 40: * Limits: ! 41: * The intended use of this program is for the 20th and 21st centuries. ! 42: * The calculations of biorhythms will not be accurate outside of this ! 43: * range due to formulae used to compute days between dates. ! 44: * ! 45: */ ! 46: ! 47: #define INCL_WIN ! 48: #include <os2.h> ! 49: ! 50: #include <stddef.h> ! 51: ! 52: #include "bio.h" ! 53: ! 54: /* Write-once global variables */ ! 55: HAB hAB; ! 56: HMQ hMsgQ; ! 57: HWND hwndApp, hwndKid; ! 58: HWND hwndAppFrame, hwndKidFrame; ! 59: char szAppName[10]; ! 60: char szKidName[10]; ! 61: ULONG AppCtlData = FCF_STANDARD | FCF_VERTSCROLL | FCF_NOBYTEALIGN & ~FCF_SHELLPOSITION; ! 62: ULONG KidCtlData = FCF_TITLEBAR; ! 63: PFNWP OldFrameWndProc; ! 64: ! 65: /* Read-only global variables */ ! 66: extern FONTMETRICS tmFontInfo; ! 67: extern SHORT cxLegendField; ! 68: extern SHORT cxDateField; ! 69: ! 70: BOOL cdecl main( VOID ) ! 71: { ! 72: QMSG qMsg; ! 73: SHORT dx, dy, x, y; ! 74: SHORT cxSizeBorder; ! 75: SHORT cySizeBorder; ! 76: SHORT cxBorder; ! 77: SHORT cyBorder; ! 78: ! 79: /* Standard initialization. Get anchor block and message queue. */ ! 80: hAB = WinInitialize(NULL); ! 81: hMsgQ = WinCreateMsgQueue( hAB, 0 ); ! 82: ! 83: /* Get string constants for parent and child window registration ! 84: and creation from resource string table. */ ! 85: WinLoadString( hAB, NULL, IDS_APPNAME, sizeof(szAppName), szAppName ); ! 86: WinLoadString( hAB, NULL, IDS_KIDNAME, sizeof(szKidName), szKidName ); ! 87: ! 88: /* Register parent window. Terminate if error. */ ! 89: if ( !WinRegisterClass( hAB, szAppName, (PFNWP)BioWndProc, ! 90: CS_CLIPCHILDREN | CS_SIZEREDRAW, NULL ) ) ! 91: return( FALSE ); ! 92: ! 93: /* Register child window. Terminate if error. */ ! 94: if ( !WinRegisterClass( hAB, szKidName, (PFNWP)KidWndProc, 0L, NULL ) ) ! 95: return( FALSE ); ! 96: ! 97: /* Create a parent window of class szAppName */ ! 98: hwndAppFrame = WinCreateStdWindow( ! 99: HWND_DESKTOP, ! 100: 0L, ! 101: &AppCtlData, ! 102: szAppName, ! 103: NULL, ! 104: 0L, ! 105: NULL, ! 106: ID_BIO, ! 107: (HWND FAR *)&hwndApp ! 108: ); ! 109: ! 110: /* Create a child window of class KidClass */ ! 111: hwndKidFrame = WinCreateStdWindow( ! 112: hwndApp, ! 113: FS_BORDER, ! 114: &KidCtlData, ! 115: szKidName, ! 116: szKidName, ! 117: 0L, ! 118: NULL, ! 119: 0, ! 120: (HWND FAR *)&hwndKid ! 121: ); ! 122: ! 123: /* Subclass frame so that minimum window size can be controled */ ! 124: OldFrameWndProc = WinSubclassWindow( hwndAppFrame, (PFNWP)FrameWndProc ); ! 125: ! 126: /* Get the size of the screen and border. Used to place and size window */ ! 127: cxSizeBorder = (SHORT)WinQuerySysValue( HWND_DESKTOP, SV_CXSIZEBORDER ); ! 128: cySizeBorder = (SHORT)WinQuerySysValue( HWND_DESKTOP, SV_CYSIZEBORDER ); ! 129: cxBorder = (SHORT)WinQuerySysValue( HWND_DESKTOP, SV_CXBORDER ); ! 130: cyBorder = (SHORT)WinQuerySysValue( HWND_DESKTOP, SV_CYBORDER ); ! 131: x = (SHORT)WinQuerySysValue( HWND_DESKTOP, SV_CXSCREEN ); ! 132: y = (SHORT)WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN ); ! 133: ! 134: /* Calculate width and height of child window. Must be able to ! 135: display three lines and wide enough for text and corresponding colored ! 136: line. Must take into account titlebar and border vertical sizes. */ ! 137: dx = cxLegendField * 2; ! 138: dy = (SHORT)(tmFontInfo.lMaxBaselineExt*3 + ! 139: WinQuerySysValue( HWND_DESKTOP, SV_CYTITLEBAR ) + ! 140: WinQuerySysValue( HWND_DESKTOP, SV_CYBORDER ) * 2); ! 141: ! 142: /* Place and size parent and child windows, then make them visible. ! 143: WinCreateStdWindow does not include position and size arguments. ! 144: Parent window is thin, but full screen high. Child window is placed ! 145: 10 pixels over and up from the parent window's lower left corner. */ ! 146: WinSetWindowPos( hwndAppFrame, NULL, ! 147: x-(3*cxDateField)+cxSizeBorder, ! 148: -cySizeBorder, ! 149: (3*cxDateField), ! 150: y+2*cySizeBorder, ! 151: SWP_MOVE | SWP_SIZE | SWP_ACTIVATE | SWP_SHOW ); ! 152: WinSetWindowPos( hwndKidFrame, NULL, 10, 10, dx, dy, ! 153: SWP_MOVE | SWP_SIZE | SWP_ACTIVATE | SWP_SHOW ); ! 154: ! 155: /* Get messages from application queue and dispatch them for processing */ ! 156: while( WinGetMsg( hAB, &qMsg, (HWND)NULL, 0, 0 ) ) ! 157: { ! 158: WinDispatchMsg( hAB, &qMsg ); ! 159: } ! 160: ! 161: /* Clean up. All child windows will be destoyed automatically */ ! 162: WinDestroyWindow( hwndAppFrame ); ! 163: WinDestroyMsgQueue( hMsgQ ); ! 164: WinTerminate( hAB ); ! 165: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.