|
|
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.