Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#17

AW: Animierte Image Button

  Alt 21. Aug 2012, 18:59
Habe das Verzeichnis mal von Hand erstellt.

Also die Icons drehen sich flüssig aber mit leichtem Flackern. Der Schatten wird immer gut angezeigt. Wenn man allerdings auf die Buttons klickt kommt die Animation etwas durcheinander. Vielleicht wäre es gut im OnMouseDown der Buttons die Animation zu pausieren...
Grüße jonas
Dafür ist das vorgesehen.
Zitat:
Was ich wohl noch machen muss ist ein ImageDn zu übergeben.
Das erste Frame im Filmstrip ist nicht dafür geeignet da es zur Animations sequenz gehört und schon erhaben ist.(Schatten)
Wenn du im Design Ordner schaust wirst du die Animationen als sogenannte Filmstrips vorfinden.
Die Schatten sind also im Bild selbst enthalten.
Zitat:
Die Form ist eine FM 3D Anwendung?
Nein reines API Fenster.
Rechter Mausklick oben im Caption anderes Design auswählen.

Zitat:
Ist die Animation auf fortlaufend eingestellt?
Nein Timer abhängig.

Die Funktionsweise ist so aufgebaut.

Anwendung:

Delphi-Quellcode:
    btnAnimVornHinten := CTRL_ImageButtonCreate(MainHandle, PWideChar(SKAERO_FOLDER +
      'AnimVH.png'), 16, 28, ID_BTN_ANIMVORNHINTEN, 30);
    SKAERO_SetAnchorMode(btnAnimVornHinten.Handle, HWND_BOTTOM);
    SKAERO_SetZorder(btnAnimVornHinten.Handle, HWND_TOP);
Delphi-Quellcode:
    WM_MOUSEMOVE:
    begin
      case wp of
        begin
          SKAERO_SetCTLText(lblToolTips.Handle, 'Vorne/Hinten Umschalten');
          Img := SKAERO_GetButImageBackProperty(btnAnimVornHinten.Handle);
          GDIP_GetImageSize(Img, imgW, imgH);
          ImgAnimW := imgW div 30; // 30 Bilder/Frames im FilmStrip
          AnimButton := 0;
          SetTimer(MainHandle, ANIM_TIMER, 50, nil);
        end;
      end;
    end;

    WM_TIMER:
    begin
      case wp of
        ANIM_TIMER:
        begin
          case AnimButton of
            0:
              btnAnimVornHinten.AnimateButton(btnAnimVornHinten.Handle, ImgAnimW);
          end;
        end;
      end;
    end;
DLL Seite:

Delphi-Quellcode:
procedure TSkinImageButton.AnimTimer(Sender: TObject);
var
  Img: Cardinal;
  graphics: Cardinal;
  imgW, imgH: cardinal;
  DC: HDC;
  rw : TRect;
  lp :TPoint;
  hDCBack: HDC;

begin

    Img := SkinEngine.GetButImageBackProperty(Handle);
    SkinEngine.GetImageSize(Img, ImgW, ImgH);

    if Value > integer(ImgW div FFRameWidth) then
      Value := FFRameWidth;

    if Value = 0 then
      Value := FFRameWidth;

    DC := GetDC(FOwner);
    hDCBack := CreateCompatibleDC(DC);

    GetClientRect(Handle, rc);

    GetWindowRect(Handle, rw);
    lp.x := rw.Left;
    lp.y := rw.Top;
    ScreenToClient(FOwner, lp);

    SelectObject(hDCBack, SkinEngine.GetBackBitmap(FOwner));
    BitBlt(DC, lp.x, lp.y, rc.Right, rc.Bottom, hDCBack, lp.x,
      lp.y, SRCCOPY);
    DeleteDC(hDCBack);

    if GdipCreateFromHDC(DC, graphics) = OK then
    begin
      GdipDrawImageRectRectI(Graphics, Img, lp.x, lp.Y, FFRameWidth, ImgH,
        Value, 0, FFRameWidth,
        ImgH, 2, nil, False, nil);
    end;

    ReleaseDC(FOwner, DC);
    GdipDeleteGraphics(Graphics);

    Value := Value + FFRameWidth;
    FAnimTimer.Enabled := False;

end;
Delphi-Quellcode:
procedure TSkinImageButton.AnimateButton(WinHandle: HWND; FRameWidth: Integer);
begin

  FFRameWidth := FRameWidth;
  FHImageButton := WinHandle;

  FAnimTimer.Free;

  FAnimTimer := TTimer.Create(nil);
  FAnimTimer.Interval := 25;
  FAnimTimer.OnTimer := AnimTimer;

end;
Falls hier wieder Typen wie Furtbichler rummeckern wollen.
Ja es gibt bestimmt besser ansätze das umzusetzen.
Habe auch nichts gegen verbesserungs vorschläge. (davon ausgenommen genannter ?Kollege?)
Dann verzichte ich doch lieber.

Neue TestVersion mit Initialisierungs, späteres ImageDown Image hochgeladen.
Als nächstes muss ich erstmal ne "transparente EDIT" programmieren.

gruss

Geändert von EWeiss (11. Jul 2019 um 15:41 Uhr)
  Mit Zitat antworten Zitat