|
|
1.1 ! root 1: /*------------------------- ! 2: CLOCK.C -- Analog Clock ! 3: -------------------------*/ ! 4: ! 5: #define INCL_WIN ! 6: #define INCL_GPI ! 7: ! 8: #include <os2.h> ! 9: #include <stddef.h> ! 10: #include <stdlib.h> ! 11: ! 12: #define ID_TIMER 1 ! 13: ! 14: typedef struct ! 15: { ! 16: SHORT cxClient ; ! 17: SHORT cyClient ; ! 18: SHORT cxPixelDiam ; ! 19: SHORT cyPixelDiam ; ! 20: } ! 21: WINDOWINFO ; ! 22: ! 23: typedef WINDOWINFO *PWINDOWINFO ; ! 24: ! 25: MRESULT EXPENTRY ClientWndProc (HWND, USHORT, MPARAM, MPARAM) ; ! 26: ! 27: int main (void) ! 28: { ! 29: static CHAR szClientClass[] = "Clock" ; ! 30: HAB hab ; ! 31: HMQ hmq ; ! 32: HWND hwndClient, hwndFrame ; ! 33: QMSG qmsg ; ! 34: ULONG flFrameFlags = FCF_STANDARD & ~FCF_MENU ; ! 35: ULONG flFrameStyle = WS_VISIBLE ; ! 36: ! 37: hab = WinInitialize (0) ; ! 38: hmq = WinCreateMsgQueue (hab, 0) ; ! 39: ! 40: WinRegisterClass (hab, szClientClass, ClientWndProc, ! 41: CS_SIZEREDRAW | CS_SYNCPAINT, 0) ; ! 42: ! 43: hwndFrame = WinCreateStdWindow (HWND_DESKTOP, flFrameStyle, ! 44: &flFrameFlags, szClientClass, ! 45: szClientClass, ! 46: 0L, NULL, 0, &hwndClient) ; ! 47: ! 48: if (WinStartTimer (hab, hwndClient, ID_TIMER, 1000)) ! 49: { ! 50: while (WinGetMsg (hab, &qmsg, NULL, 0, 0)) ! 51: WinDispatchMsg (hab, &qmsg) ; ! 52: ! 53: WinStopTimer (hab, hwndClient, ID_TIMER) ; ! 54: } ! 55: else ! 56: WinMessageBox (HWND_DESKTOP, hwndClient, ! 57: "Too many clocks or timers", ! 58: szClientClass, 0, MB_OK | MB_ICONEXCLAMATION) ; ! 59: ! 60: WinDestroyWindow (hwndFrame) ; ! 61: WinDestroyMsgQueue (hmq) ; ! 62: WinTerminate (hab) ; ! 63: ! 64: return 0 ; ! 65: } ! 66: ! 67: VOID RotatePoint (POINTL aptl[], SHORT sNum, SHORT sAngle) ! 68: { ! 69: static SHORT sSin [60] = ! 70: { ! 71: 0, 105, 208, 309, 407, 500, 588, 669, 743, 809, ! 72: 866, 914, 951, 978, 995, 1000, 995, 978, 951, 914, ! 73: 866, 809, 743, 669, 588, 500, 407, 309, 208, 105, ! 74: 0, -104, -207, -308, -406, -499, -587, -668, -742, -808, ! 75: -865, -913, -950, -977, -994, -999, -994, -977, -950, -913, ! 76: -865, -808, -742, -668, -587, -499, -406, -308, -207, -104 ! 77: } ; ! 78: POINTL ptlTemp ; ! 79: SHORT sIndex ; ! 80: ! 81: for (sIndex = 0 ; sIndex < sNum ; sIndex++) ! 82: { ! 83: ptlTemp.x = (aptl[sIndex].x * sSin [(sAngle + 15) % 60] + ! 84: aptl[sIndex].y * sSin [sAngle]) / 1000 ; ! 85: ! 86: ptlTemp.y = (aptl[sIndex].y * sSin [(sAngle + 15) % 60] - ! 87: aptl[sIndex].x * sSin [sAngle]) / 1000 ; ! 88: ! 89: aptl[sIndex] = ptlTemp ; ! 90: } ! 91: } ! 92: ! 93: VOID ScalePoint (POINTL aptl[], SHORT sNum, PWINDOWINFO pwi) ! 94: { ! 95: SHORT sIndex ; ! 96: ! 97: for (sIndex = 0 ; sIndex < sNum ; sIndex++) ! 98: { ! 99: aptl[sIndex].x = aptl[sIndex].x * pwi->cxPixelDiam / 200 ; ! 100: aptl[sIndex].y = aptl[sIndex].y * pwi->cyPixelDiam / 200 ; ! 101: } ! 102: } ! 103: ! 104: VOID TranslatePoint (POINTL aptl[], SHORT sNum, PWINDOWINFO pwi) ! 105: { ! 106: SHORT sIndex ; ! 107: ! 108: for (sIndex = 0 ; sIndex < sNum ; sIndex++) ! 109: { ! 110: aptl[sIndex].x += pwi->cxClient / 2 ; ! 111: aptl[sIndex].y += pwi->cyClient / 2 ; ! 112: } ! 113: } ! 114: ! 115: VOID DrawHand (HPS hps, POINTL aptlIn[], SHORT sNum, SHORT sAngle, ! 116: PWINDOWINFO pwi) ! 117: { ! 118: POINTL aptl [5] ; ! 119: SHORT sIndex ; ! 120: ! 121: for (sIndex = 0 ; sIndex < sNum ; sIndex++) ! 122: aptl [sIndex] = aptlIn [sIndex] ; ! 123: ! 124: RotatePoint (aptl, sNum, sAngle) ; ! 125: ScalePoint (aptl, sNum, pwi) ; ! 126: TranslatePoint (aptl, sNum, pwi) ; ! 127: ! 128: GpiMove (hps, aptl) ; ! 129: ! 130: GpiPolyLine (hps, sNum - 1L, aptl + 1) ; ! 131: } ! 132: ! 133: MRESULT EXPENTRY ClientWndProc (HWND hwnd, USHORT msg, MPARAM mp1, MPARAM mp2) ! 134: { ! 135: static DATETIME dtPrevious ; ! 136: static HDC hdc ; ! 137: static LONG xPixelsPerMeter, yPixelsPerMeter ; ! 138: static POINTL aptlHour [5] = { 0,-15, 10,0, 0,60, -10,0, 0,-15 }, ! 139: aptlMinute [5] = { 0,-20, 5,0, 0,80, -5,0, 0,-20 }, ! 140: aptlSecond [2] = { 0, 0, 0,80 } ; ! 141: static WINDOWINFO wi ; ! 142: DATETIME dt ; ! 143: HPS hps ; ! 144: POINTL aptl [3] ; ! 145: SHORT sDiamMM, sAngle ; ! 146: ! 147: switch (msg) ! 148: { ! 149: case WM_CREATE: ! 150: hdc = WinOpenWindowDC (hwnd) ; ! 151: ! 152: DevQueryCaps (hdc, CAPS_VERTICAL_RESOLUTION, ! 153: 1L, &yPixelsPerMeter) ; ! 154: DevQueryCaps (hdc, CAPS_HORIZONTAL_RESOLUTION, ! 155: 1L, &xPixelsPerMeter) ; ! 156: ! 157: DosGetDateTime (&dtPrevious) ; ! 158: dtPrevious.hours = (dtPrevious.hours * 5) % 60 + ! 159: dtPrevious.minutes / 12 ; ! 160: return 0 ; ! 161: ! 162: case WM_SIZE: ! 163: wi.cxClient = SHORT1FROMMP (mp2) ; ! 164: wi.cyClient = SHORT2FROMMP (mp2) ; ! 165: ! 166: sDiamMM = (SHORT) min (wi.cxClient * 1000L / xPixelsPerMeter, ! 167: wi.cyClient * 1000L / yPixelsPerMeter) ; ! 168: ! 169: wi.cxPixelDiam = (SHORT) (xPixelsPerMeter * sDiamMM / 1000) ; ! 170: wi.cyPixelDiam = (SHORT) (yPixelsPerMeter * sDiamMM / 1000) ; ! 171: return 0 ; ! 172: ! 173: case WM_TIMER: ! 174: if (0L == WinQuerySysValue (HWND_DESKTOP, SV_TRACKRECTLEVEL)) ! 175: break ; ! 176: ! 177: DosGetDateTime (&dt) ; ! 178: dt.hours = (dt.hours * 5) % 60 + dt.minutes / 12 ; ! 179: ! 180: hps = WinGetPS (hwnd) ; ! 181: ! 182: GpiSetColor (hps, CLR_BACKGROUND) ; ! 183: DrawHand (hps, aptlSecond, 2, dtPrevious.seconds, &wi) ; ! 184: ! 185: if (dt.hours != dtPrevious.hours || ! 186: dt.minutes != dtPrevious.minutes) ! 187: { ! 188: DrawHand (hps, aptlHour, 5, dtPrevious.hours, &wi) ; ! 189: DrawHand (hps, aptlMinute, 5, dtPrevious.minutes, &wi) ; ! 190: } ! 191: ! 192: GpiSetColor (hps, CLR_NEUTRAL) ; ! 193: DrawHand (hps, aptlHour, 5, dt.hours, &wi) ; ! 194: DrawHand (hps, aptlMinute, 5, dt.minutes, &wi) ; ! 195: DrawHand (hps, aptlSecond, 2, dt.seconds, &wi) ; ! 196: ! 197: WinReleasePS (hps) ; ! 198: dtPrevious = dt ; ! 199: return 0 ; ! 200: ! 201: case WM_PAINT: ! 202: hps = WinBeginPaint (hwnd, NULL, NULL) ; ! 203: GpiErase (hps) ; ! 204: ! 205: for (sAngle = 0 ; sAngle < 60 ; sAngle++) ! 206: { ! 207: aptl[0].x = 0 ; ! 208: aptl[0].y = 90 ; ! 209: ! 210: RotatePoint (aptl, 1, sAngle) ; ! 211: ScalePoint (aptl, 1, &wi) ; ! 212: TranslatePoint (aptl, 1, &wi) ; ! 213: ! 214: aptl[2].x = aptl[2].y = sAngle % 5 ? 2 : 10 ; ! 215: ! 216: ScalePoint (aptl + 2, 1, &wi) ; ! 217: ! 218: aptl[0].x -= aptl[2].x / 2 ; ! 219: aptl[0].y -= aptl[2].y / 2 ; ! 220: ! 221: aptl[1].x = aptl[0].x + aptl[2].x ; ! 222: aptl[1].y = aptl[0].y + aptl[2].y ; ! 223: ! 224: GpiMove (hps, aptl) ; ! 225: GpiBox (hps, DRO_OUTLINEFILL, aptl + 1, ! 226: aptl[2].x, aptl[2].y) ; ! 227: ! 228: } ! 229: DrawHand (hps, aptlHour, 5, dtPrevious.hours, &wi) ; ! 230: DrawHand (hps, aptlMinute, 5, dtPrevious.minutes, &wi) ; ! 231: DrawHand (hps, aptlSecond, 2, dtPrevious.seconds, &wi) ; ! 232: ! 233: WinEndPaint (hps) ; ! 234: return 0 ; ! 235: } ! 236: return WinDefWindowProc (hwnd, msg, mp1, mp2) ; ! 237: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.