property BlinkOnRW[WinHandle: HWND]: Boolean read GetBlinkOn write SetBlinkOn;
Ich denke mal das wäre die lösung gewesen
Ich habe es jetzt über das normale property geregelt mit etwas tricksen.
Dazu habe ich eifach das Sourcehandle und den Rect als privat in meine Classe verschoben.
Und so geht es dann!
Delphi-Quellcode:
procedure TSkinImageButton.ButtonBlink(WinHandle: HWND; OnBlink: Integer);
var
Img: Cardinal;
hDC: Cardinal;
graphics: Cardinal;
rw : TRect;
lp :TPoint;
ImgW, ImgH: Cardinal;
begin
if FBlinkOn then
SetBlinkOn(false);
FTimer.Free;
SetBlinkOn(true);
FTimer := TTimer.Create(nil);
FTimer.Interval := OnBlink;
FTimer.OnTimer := TimerTimer;
Img := SkinEngine.GetButImageBackProperty(WinHandle);
SkinEngine.GetImageSize(Img, ImgW, ImgH);
GetWindowRect(WinHandle, rw);
lp.x := rw.Left;
lp.y := rw.Top;
SrcHandle := GetParent(WinHandle);
ScreenToClient(SrcHandle, lp);
if UseState < 2 then
UseState := 2
else
UseState := 1;
if FBlinkOn then
UseState := 2;
hDC := GetDC(SrcHandle);
SetRect(rc, lp.x, lp.y, lp.x + rw.Right - rw.Left, lp.y + rw.Bottom - rw.Top);
if GdipCreateFromHDC(hDC, graphics) = OK then
begin
GdipDrawImageRectRectI(Graphics, Img,
lp.x, lp.Y, ImgW * cardinal(UseState) - ImgW, rw.Bottom - rw.Top,
rw.Right - rw.Left, 0, ImgW * cardinal(UseState) - ImgW, ImgH, 2,
nil, False, nil);
end;
ReleaseDC(SrcHandle, hDC);
GdipDeleteGraphics(Graphics);
end;
Delphi-Quellcode:
procedure TSkinImageButton.SetBlinkOn(const Value: boolean);
begin
if Value <> FBlinkOn then
begin
FBlinkOn := Value;
if Assigned(FOnOff) then
FOnOff(Self, FBlinkOn);
end;
InvalidateRect(SrcHandle, @rc, False);
UpdateWindow(SrcHandle);
end;
Man gibt jetzt von außen einfach nur noch das
Handle des gerade aktiven Control an
und die Zeit in der der Timer aktiv sein soll.
Delphi-Quellcode:
if (EventNo >= $80) and (EventNo <= $E0) then
fbtnBlinkLight[ChannelNo].ButtonBlink(fbtnBlinkLight[ChannelNo].Handle, 25);
gruss