4 * Copyright 1998 by Marcel Baur <mbaur@g26.ethz.ch>
6 * This file is based on rolex.c by Jim Peterson.
8 * I just managed to move the relevant parts into the Clock application
9 * and made it look like the original Windows one. You can find the original
10 * rolex.c in the wine /libtest directory.
12 * Original file header:
14 * > rolex.c: Windows clock application for WINE (by Jim Peterson)
16 * > This is a translation of a Turbo Pascal OWL application I made
17 * > once, so it's a little flaky (tons of globals, functions that
18 * > could have been in-lined, etc.). The source code should easily
19 * > compile with a standard Win32 C compiler.
21 * > To try it out, type 'make rolex'.
32 COLORREF FaceColor
= RGB(192,192,192);
33 COLORREF HandColor
= RGB(0,0,0);
34 COLORREF EtchColor
= RGB(0,0,0);
38 HandData OldSecond
,OldHour
,OldMinute
;
44 diff
= (Globals
.MaxX
-Globals
.MaxY
);
45 if (diff
>0) { X
= (X
-(diff
/2)); }
53 diff
= (Globals
.MaxX
-Globals
.MaxY
);
54 if (diff
<0) { Y
= Y
+(diff
/2); }
60 int MidX
, MidY
, t
, DiffX
, DiffY
;
64 DiffX
= (Globals
.MaxX
-MidX
*2)/2;
65 DiffY
= (Globals
.MaxY
-MidY
*2)/2;
67 SelectObject(dc
,CreateSolidBrush(FaceColor
));
68 SelectObject(dc
,CreatePen(PS_SOLID
,1,EtchColor
));
69 Ellipse(dc
,DiffX
,DiffY
,2*MidX
+DiffX
,2*MidY
+DiffY
);
73 MoveToEx(dc
,(MidX
+DiffX
)+sin(t
*Pi
/6)*0.9*MidX
,(MidY
+DiffY
)-cos(t
*Pi
/6)*0.9*MidY
,NULL
);
74 LineTo(dc
,(MidY
+DiffX
)+sin(t
*Pi
/6)*0.8*MidX
,(MidY
+DiffY
)-cos(t
*Pi
/6)*0.8*MidY
);
76 if(Globals
.MaxX
>64 && Globals
.MaxY
>64)
78 SetPixel(dc
,(MidX
+DiffX
)+sin(t
*Pi
/30)*0.9*MidX
,(MidY
+DiffY
)-cos(t
*Pi
/30)*0.9*MidY
80 DeleteObject(SelectObject(dc
,GetStockObject(NULL_BRUSH
)));
81 DeleteObject(SelectObject(dc
,GetStockObject(NULL_PEN
)));
82 memset(&OldSecond
,0,sizeof(OldSecond
));
83 memset(&OldMinute
,0,sizeof(OldMinute
));
84 memset(&OldHour
,0,sizeof(OldHour
));
87 void DrawHourHand(HDC dc
)
89 MoveToEx(dc
, OldHour
.StartX
, OldHour
.StartY
, NULL
);
90 LineTo(dc
, OldHour
.EndX
, OldHour
.EndY
);
93 void DrawMinuteHand(HDC dc
)
95 MoveToEx(dc
, OldMinute
.StartX
, OldMinute
.StartY
, NULL
);
96 LineTo(dc
, OldMinute
.EndX
, OldMinute
.EndY
);
99 void DrawSecondHand(HDC dc
)
101 MoveToEx(dc
, OldSecond
.StartX
, OldSecond
.StartY
, NULL
);
102 LineTo(dc
, OldSecond
.EndX
, OldSecond
.EndY
);
105 BOOL
UpdateHourHand(HDC dc
,int MidX
,int MidY
,int XExt
,int YExt
,WORD Pos
)
111 Sx
= MidX
; Sy
= MidY
;
112 Ex
= MidX
+sin(Pos
*Pi
/6000)*XExt
;
113 Ey
= MidY
-cos(Pos
*Pi
/6000)*YExt
;
114 rv
= ( Sx
!=OldHour
.StartX
|| Ex
!=OldHour
.EndX
||
115 Sy
!=OldHour
.StartY
|| Ey
!=OldHour
.EndY
);
116 if (Globals
.bAnalog
&& rv
)DrawHourHand(dc
);
117 OldHour
.StartX
= Sx
; OldHour
.EndX
= Ex
;
118 OldHour
.StartY
= Sy
; OldHour
.EndY
= Ey
;
122 BOOL
UpdateMinuteHand(HDC dc
,int MidX
,int MidY
,int XExt
,int YExt
,WORD Pos
)
128 Sx
= MidX
; Sy
= MidY
;
129 Ex
= MidX
+sin(Pos
*Pi
/30000)*XExt
;
130 Ey
= MidY
-cos(Pos
*Pi
/30000)*YExt
;
131 rv
= ( Sx
!=OldMinute
.StartX
|| Ex
!=OldMinute
.EndX
||
132 Sy
!=OldMinute
.StartY
|| Ey
!=OldMinute
.EndY
);
133 if (Globals
.bAnalog
&& rv
)DrawMinuteHand(dc
);
134 OldMinute
.StartX
= Sx
; OldMinute
.EndX
= Ex
;
135 OldMinute
.StartY
= Sy
; OldMinute
.EndY
= Ey
;
139 BOOL
UpdateSecondHand(HDC dc
,int MidX
,int MidY
,int XExt
,int YExt
,WORD Pos
)
146 if (Globals
.bSeconds
) {
147 Sx
= MidX
; Sy
= MidY
;
148 Ex
= MidX
+sin(Pos
*Pi
/3000)*XExt
;
149 Ey
= MidY
-cos(Pos
*Pi
/3000)*YExt
;
150 rv
= ( Sx
!=OldSecond
.StartX
|| Ex
!=OldSecond
.EndX
||
151 Sy
!=OldSecond
.StartY
|| Ey
!=OldSecond
.EndY
);
152 if (Globals
.bAnalog
&& rv
)DrawSecondHand(dc
);
153 OldSecond
.StartX
= Sx
; OldSecond
.EndX
= Ex
;
154 OldSecond
.StartY
= Sy
; OldSecond
.EndY
= Ey
;
164 int MidX
, MidY
, DiffX
, DiffY
;
171 dc
=GetDC(Globals
.hMainWnd
);
178 F
= st
.wMilliseconds
/ 10;
184 DiffX
= (Globals
.MaxX
-MidX
*2)/2;
185 DiffY
= (Globals
.MaxY
-MidY
*2)/2;
187 SelectObject(dc
,CreatePen(PS_SOLID
,1,FaceColor
));
189 if(UpdateHourHand(dc
,MidX
+DiffX
,MidY
+DiffY
,MidX
*0.5,MidY
*0.5,H
)) Redraw
= TRUE
;
190 if(UpdateMinuteHand(dc
,MidX
+DiffX
,MidY
+DiffY
,MidX
*0.65,MidY
*0.65,M
)) Redraw
= TRUE
;
191 if(UpdateSecondHand(dc
,MidX
+DiffX
,MidY
+DiffY
,MidX
*0.79,MidY
*0.79,F
)) Redraw
= TRUE
;
194 DeleteObject(SelectObject(dc
,CreatePen(PS_SOLID
,1,HandColor
)));
201 DeleteObject(SelectObject(dc
,GetStockObject(NULL_PEN
)));
203 if(!idc
) ReleaseDC(Globals
.hMainWnd
,dc
);
206 // class.hbrBackground = (HBRUSH)(COLOR_BACKGROUND + 1);