Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#8

AW: An Property zwei werte übergeben

  Alt 2. Jul 2012, 23:45
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

Geändert von EWeiss ( 2. Jul 2012 um 23:48 Uhr)
  Mit Zitat antworten Zitat