Hoi mede programmeurs,
Deze procedure roep ik aan in een TIMER en dat werkt perfect. Let niet op de Function. Dat moet gewoon Procedure zijn.
Goed zover prima met gebruik TGPGraphics en Create handle. Werkt super.
Nu zou ik graag de TGPGraphics Create in Form.OnCreate willen en bij Form.OnDestroy. Logisch?
Probreem is dat de Clock maar eenmaal getekend wordt.
Is dit een denkfout en moet dit gewoon zo?
Zie vaak bij OnPaint ook bij voorbeelden die zo gaan.
Hoe kan ik dat anders schrijven, dus mis ik iets met de GdipApi?
Is daar een aanroep voor.
Bedankt alvast.
Code:
function TfrmClockAnalog.DrawGlyph(Handle: HWND; X, Y: Integer): Integer;
var
FGraphics: TGPGraphics;
procedure PaintElements;
var
Hour, Minute, Second, MSec: Word;
State: GraphicsState;
Dx, Dy, Ox, Oy: Single;
AngleS, AngleM, AngleH: Single;
begin
DecodeTime(Now, Hour, Minute, Second, MSec);
AngleS := Second * 6;
AngleM := Minute * 6 + AngleS / 60;
AngleH := Hour * 30 + AngleM / 12;
// 211 Width
Dx := ClockImage.Width / 2 - 1;
Dy := ClockImage.Height / 2 - 1;
Ox := -6; // -13 div 2
Oy := -79; // -159 div 2
with FGraphics do
begin
State := Save();
TranslateTransform(Dx, Dy);
RotateTransform(AngleH);
DrawImage(FHour, Ox, Oy, 13, 159);
RotateTransform(-AngleH);
RotateTransform(AngleM);
DrawImage(FMinute, Ox, Oy, 13, 159);
RotateTransform(-AngleM);
RotateTransform(AngleS);
DrawImage(FSecond, Ox, Oy, 13, 159);
RotateTransform(-AngleS);
DrawImage(FDot, Ox, Oy, 13, 159);
Restore(State);
end;
end;
// Je moet elke keer Create gebruiken anders werkt het niet. Clock wordt niet geupdated.
// Create voor Handle bij OnCreate werkt ook niet want er zijn schijnbaar geen Handles geldig.
begin
ClockImage.Canvas.Lock;
try
FGraphics := TGPGraphics.Create(Handle);
try
FGraphics.Clear($00000000);
FGraphics.SetSmoothingMode(SmoothingModeHighQuality);
FGraphics.DrawImage(FOverlay, X, Y, 211, 211);
FGraphics.DrawImage(FBackground, X, Y, 211, 211);
PaintElements;
finally
FGraphics.Free;
end;
finally
ClockImage.Canvas.Unlock;
ClockImage.Invalidate;
end;
end;
Bookmarks