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