|
|
1.1 root 1: /*-----------------------------
2: DIGCLOCK.C -- Digital Clock
3: -----------------------------*/
4:
5: #define INCL_WIN
6: #define INCL_GPI
7: #define INCL_DOS
8: #include <os2.h>
9: #include <stdio.h>
10:
11: #define ID_TIMER 1
12:
13: MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ;
14: VOID SizeTheWindow (HWND) ;
15:
16: int main (void)
17: {
18: static CHAR szClientClass[] = "DigClock" ;
19: static ULONG flFrameFlags = FCF_TITLEBAR | FCF_SYSMENU |
20: FCF_BORDER | FCF_TASKLIST ;
21: HAB hab ;
22: HMQ hmq ;
23: HWND hwndFrame, hwndClient ;
24: QMSG qmsg ;
25:
26: hab = WinInitialize (0) ;
27: hmq = WinCreateMsgQueue (hab, 0) ;
28:
29: WinRegisterClass (hab, szClientClass, ClientWndProc, 0L, 0) ;
30:
31: hwndFrame = WinCreateStdWindow (HWND_DESKTOP, WS_VISIBLE,
32: &flFrameFlags, szClientClass, NULL,
33: 0L, NULL, 0, &hwndClient) ;
34: SizeTheWindow (hwndFrame) ;
35:
36: if (WinStartTimer (hab, hwndClient, ID_TIMER, 1000))
37: {
38: while (WinGetMsg (hab, &qmsg, NULL, 0, 0))
39: WinDispatchMsg (hab, &qmsg) ;
40:
41: WinStopTimer (hab, hwndClient, ID_TIMER) ;
42: }
43: else
44: WinMessageBox (HWND_DESKTOP, hwndClient,
45: "Too many clocks or timers",
46: szClientClass, 0, MB_OK | MB_ICONEXCLAMATION) ;
47:
48: WinDestroyWindow (hwndFrame) ;
49: WinDestroyMsgQueue (hmq) ;
50: WinTerminate (hab) ;
51: return 0 ;
52: }
53:
54: VOID SizeTheWindow (HWND hwndFrame)
55: {
56: FONTMETRICS fm ;
57: HPS hps ;
58: RECTL rcl ;
59:
60: hps = WinGetPS (hwndFrame) ;
61: GpiQueryFontMetrics (hps, (LONG) sizeof fm, &fm) ;
62: WinReleasePS (hps) ;
63:
64: rcl.yBottom = 0 ;
65: rcl.yTop = 11 * fm.lMaxBaselineExt / 4 ;
66: rcl.xRight = WinQuerySysValue (HWND_DESKTOP, SV_CXSCREEN) ;
67: rcl.xLeft = rcl.xRight - 16 * fm.lEmInc ;
68:
69: WinCalcFrameRect (hwndFrame, &rcl, FALSE) ;
70:
71: WinSetWindowPos (hwndFrame, NULL, (SHORT) rcl.xLeft, (SHORT) rcl.yBottom,
72: (SHORT) (rcl.xRight - rcl.xLeft),
73: (SHORT) (rcl.yTop - rcl.yBottom), SWP_SIZE | SWP_MOVE) ;
74: }
75:
76: VOID UpdateTime (HWND hwnd, HPS hps)
77: {
78: static BOOL fHaveCtryInfo = FALSE ;
79: static CHAR *szDayName [] = { "Sun", "Mon", "Tue", "Wed",
80: "Thu", "Fri", "Sat" } ;
81: static CHAR szDateFormat [] = " %s %d%s%02d%s%02d " ;
82: static COUNTRYCODE ctryc = { 0, 0 } ;
83: static COUNTRYINFO ctryi ;
84: CHAR szBuffer [20] ;
85: DATETIME dt ;
86: RECTL rcl ;
87: USHORT usDataLength ;
88:
89: /*----------------------------------------
90: Get Country Information, Date and Time
91: ----------------------------------------*/
92:
93: if (!fHaveCtryInfo)
94: {
95: DosGetCtryInfo (sizeof ctryi, &ctryc, &ctryi, &usDataLength) ;
96: fHaveCtryInfo = TRUE ;
97: }
98: DosGetDateTime (&dt) ;
99: dt.year %= 100 ;
100:
101: /*-------------
102: Format Date
103: -------------*/
104: /*-----------------
105: mm/dd/yy format
106: -----------------*/
107: if (ctryi.fsDateFmt == 0)
108:
109: sprintf (szBuffer, szDateFormat, szDayName [dt.weekday],
110: dt.month, ctryi.szDateSeparator,
111: dt.day, ctryi.szDateSeparator, dt.year) ;
112:
113: /*-----------------
114: dd/mm/yy format
115: -----------------*/
116: else if (ctryi.fsDateFmt == 1)
117:
118: sprintf (szBuffer, szDateFormat, szDayName [dt.weekday],
119: dt.day, ctryi.szDateSeparator,
120: dt.month, ctryi.szDateSeparator, dt.year) ;
121:
122: /*-----------------
123: yy/mm/dd format
124: -----------------*/
125: else
126: sprintf (szBuffer, szDateFormat, szDayName [dt.weekday],
127: dt.year, ctryi.szDateSeparator,
128: dt.month, ctryi.szDateSeparator, dt.day) ;
129:
130: /*--------------
131: Display Date
132: --------------*/
133:
134: WinQueryWindowRect (hwnd, &rcl) ;
135: rcl.yBottom += 5 * rcl.yTop / 11 ;
136: WinDrawText (hps, -1, szBuffer, &rcl, CLR_NEUTRAL, CLR_BACKGROUND,
137: DT_CENTER | DT_VCENTER) ;
138:
139: /*-------------
140: Format Time
141: -------------*/
142: /*----------------
143: 12-hour format
144: ----------------*/
145: if ((ctryi.fsTimeFmt & 1) == 0)
146:
147: sprintf (szBuffer, " %d%s%02d%s%02d %cm ",
148: (dt.hours + 11) % 12 + 1, ctryi.szTimeSeparator,
149: dt.minutes, ctryi.szTimeSeparator,
150: dt.seconds, dt.hours / 12 ? 'p' : 'a') ;
151:
152: /*----------------
153: 24-hour format
154: ----------------*/
155: else
156: sprintf (szBuffer, " %02d%s%02d%s%02d ",
157: dt.hours, ctryi.szTimeSeparator,
158: dt.minutes, ctryi.szTimeSeparator, dt.seconds) ;
159:
160: /*--------------
161: Display Time
162: --------------*/
163:
164: WinQueryWindowRect (hwnd, &rcl) ;
165: rcl.yTop -= 5 * rcl.yTop / 11 ;
166: WinDrawText (hps, -1, szBuffer, &rcl, CLR_NEUTRAL, CLR_BACKGROUND,
167: DT_CENTER | DT_VCENTER) ;
168: }
169:
170: MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2)
171: {
172: HPS hps;
173:
174: switch (msg)
175: {
176: case WM_TIMER:
177: hps = WinGetPS (hwnd) ;
178: GpiSetBackMix (hps, BM_OVERPAINT) ;
179:
180: UpdateTime (hwnd, hps) ;
181:
182: WinReleasePS (hps) ;
183: return 0 ;
184:
185: case WM_PAINT:
186: hps = WinBeginPaint (hwnd, NULL, NULL) ;
187: GpiErase (hps) ;
188:
189: UpdateTime (hwnd, hps) ;
190:
191: WinEndPaint (hps) ;
192: return 0 ;
193: }
194: return WinDefWindowProc (hwnd, msg, mp1, mp2) ;
195: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.