/* * Clock (winclock.c) * * Copyright 1998 by Marcel Baur * * This file is based on rolex.c by Jim Peterson. * * I just managed to move the relevant parts into the Clock application * and made it look like the original Windows one. You can find the original * rolex.c in the wine /libtest directory. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include "winclock.h" #include "windows.h" #include "main.h" #include "winnls.h" COLORREF FaceColor = RGB(192,192,192); COLORREF HandColor = RGB(0,0,0); COLORREF EtchColor = RGB(0,0,0); float Pi=3.1415926; int nLastSecond = 60; HandData OldSecond,OldHour,OldMinute; int MiddleX(void) { int X, diff; X = (Globals.MaxX/2); diff = (Globals.MaxX-Globals.MaxY); if (diff>0) { X = (X-(diff/2)); } return X; } int MiddleY(void) { int Y, diff; Y = (Globals.MaxY/2); diff = (Globals.MaxX-Globals.MaxY); if (diff<0) { Y = Y+(diff/2); } return Y; } void DrawFace(HDC dc) { int MidX, MidY, t, DiffX, DiffY; MidX = MiddleX(); MidY = MiddleY(); DiffX = (Globals.MaxX-MidX*2)/2; DiffY = (Globals.MaxY-MidY*2)/2; SelectObject(dc,CreateSolidBrush(FaceColor)); SelectObject(dc,CreatePen(PS_SOLID,1,EtchColor)); Ellipse(dc,DiffX,DiffY,2*MidX+DiffX,2*MidY+DiffY); for(t=0; t<12; t++) { MoveToEx(dc,(MidX+DiffX)+sin(t*Pi/6)*0.9*MidX,(MidY+DiffY)-cos(t*Pi/6)*0.9*MidY,NULL); LineTo(dc,(MidY+DiffX)+sin(t*Pi/6)*0.8*MidX,(MidY+DiffY)-cos(t*Pi/6)*0.8*MidY); } if(Globals.MaxX>64 && Globals.MaxY>64) for(t=0; t<60; t++) SetPixel(dc,(MidX+DiffX)+sin(t*Pi/30)*0.9*MidX,(MidY+DiffY)-cos(t*Pi/30)*0.9*MidY ,EtchColor); DeleteObject(SelectObject(dc,GetStockObject(NULL_BRUSH))); DeleteObject(SelectObject(dc,GetStockObject(NULL_PEN))); memset(&OldSecond,0,sizeof(OldSecond)); memset(&OldMinute,0,sizeof(OldMinute)); memset(&OldHour,0,sizeof(OldHour)); } void DrawHourHand(HDC dc) { if (OldHour.DontRedraw) return; MoveToEx(dc, OldHour.StartX, OldHour.StartY, NULL); LineTo(dc, OldHour.EndX, OldHour.EndY); } void DrawMinuteHand(HDC dc) { if (OldMinute.DontRedraw) return; MoveToEx(dc, OldMinute.StartX, OldMinute.StartY, NULL); LineTo(dc, OldMinute.EndX, OldMinute.EndY); } void DrawSecondHand(HDC dc) { if (OldSecond.DontRedraw) return; MoveToEx(dc, OldSecond.StartX, OldSecond.StartY, NULL); LineTo(dc, OldSecond.EndX, OldSecond.EndY); } BOOL UpdateHourHand(HDC dc,int MidX,int MidY,int XExt,int YExt,WORD Pos) { int Sx, Sy, Ex, Ey; BOOL rv; rv = FALSE; Sx = MidX; Sy = MidY; Ex = MidX+sin(Pos*Pi/6000)*XExt; Ey = MidY-cos(Pos*Pi/6000)*YExt; rv = ( Sx!=OldHour.StartX || Ex!=OldHour.EndX || Sy!=OldHour.StartY || Ey!=OldHour.EndY ); if (Globals.bAnalog && rv)DrawHourHand(dc); OldHour.StartX = Sx; OldHour.EndX = Ex; OldHour.StartY = Sy; OldHour.EndY = Ey; OldHour.DontRedraw=FALSE; return rv; } BOOL UpdateMinuteHand(HDC dc,int MidX,int MidY,int XExt,int YExt,WORD Pos) { int Sx, Sy, Ex, Ey; BOOL rv; rv = FALSE; Sx = MidX; Sy = MidY; Ex = MidX+sin(Pos*Pi/30000)*XExt; Ey = MidY-cos(Pos*Pi/30000)*YExt; rv = ( Sx!=OldMinute.StartX || Ex!=OldMinute.EndX || Sy!=OldMinute.StartY || Ey!=OldMinute.EndY ); if (Globals.bAnalog && rv)DrawMinuteHand(dc); OldMinute.StartX = Sx; OldMinute.EndX = Ex; OldMinute.StartY = Sy; OldMinute.EndY = Ey; OldMinute.DontRedraw=FALSE; return rv; } BOOL UpdateSecondHand(HDC dc,int MidX,int MidY,int XExt,int YExt,WORD Pos) { int Sx, Sy, Ex, Ey; BOOL rv; rv = FALSE; if (Globals.bSeconds) { Sx = MidX; Sy = MidY; Ex = MidX+sin(Pos*Pi/3000)*XExt; Ey = MidY-cos(Pos*Pi/3000)*YExt; rv = ( Sx!=OldSecond.StartX || Ex!=OldSecond.EndX || Sy!=OldSecond.StartY || Ey!=OldSecond.EndY ); if (Globals.bAnalog && rv) DrawSecondHand(dc); OldSecond.StartX = Sx; OldSecond.EndX = Ex; OldSecond.StartY = Sy; OldSecond.EndY = Ey; OldSecond.DontRedraw=FALSE; } return rv; } void DigitalClock(HDC dc) { CHAR szTime[MAX_STRING_LEN]; LPSTR time = szTime; static short xChar, yChar; TEXTMETRIC tm; SYSTEMTIME st; LPSYSTEMTIME lpst = &st; GetLocalTime(&st); GetTimeFormat(LOCALE_USER_DEFAULT, LOCALE_STIMEFORMAT, lpst, NULL, time, MAX_STRING_LEN); SelectObject(dc,CreatePen(PS_SOLID,1,FaceColor)); xChar = tm.tmAveCharWidth; yChar = tm.tmHeight; xChar = 100; yChar = 100; TextOut (dc, xChar, yChar, szTime, strlen (szTime)); DeleteObject(SelectObject(dc,GetStockObject(NULL_PEN))); } void AnalogClock(HDC dc) { SYSTEMTIME st; WORD H, M, S, F; int MidX, MidY, DiffX, DiffY; BOOL Redraw; GetLocalTime(&st); S = st.wSecond; if (nLastSecond==S) { exit; } nLastSecond = S; H = st.wHour; M = st.wMinute; F = st.wMilliseconds / 10; F = F + S*100; M = M*1000+F/6; H = H*1000+M/60; MidX = MiddleX(); MidY = MiddleY(); DiffX = (Globals.MaxX-MidX*2)/2; DiffY = (Globals.MaxY-MidY*2)/2; SelectObject(dc,CreatePen(PS_SOLID,1,FaceColor)); Redraw = FALSE; if(UpdateHourHand(dc,MidX+DiffX,MidY+DiffY,MidX*0.5,MidY*0.5,H)) Redraw = TRUE; if(UpdateMinuteHand(dc,MidX+DiffX,MidY+DiffY,MidX*0.65,MidY*0.65,M)) Redraw = TRUE; if(UpdateSecondHand(dc,MidX+DiffX,MidY+DiffY,MidX*0.79,MidY*0.79,F)) Redraw = TRUE; DeleteObject(SelectObject(dc,CreatePen(PS_SOLID,1,HandColor))); if(Redraw) { DrawSecondHand(dc); DrawMinuteHand(dc); DrawHourHand(dc); } DeleteObject(SelectObject(dc,GetStockObject(NULL_PEN))); } void Idle(HDC idc) { HDC context; if(idc) context=idc; else context=GetDC(Globals.hMainWnd); if (!context) return; if (Globals.bAnalog) { AnalogClock(context); } else { DigitalClock(context); } if(!idc) ReleaseDC(Globals.hMainWnd, context); }