Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Animierte Image Button (https://www.delphipraxis.net/169895-animierte-image-button.html)

EWeiss 20. Aug 2012 07:57


Animierte Image Button
 
Falls jemand lust hat kann er das mal testen.
Es geht mir Hauptsächlich darum ob diese auf euren System Flickerfrei laufen.

EDIT:
Anhang gelöscht..

gruss

Jonas Shinaniganz 20. Aug 2012 08:23

AW: Animierte Image Button
 
Beim Ausführen der Exe, Diese Meldung:

Zitat:

Exception Exception in Modul ProgBar.exe bei 0004C21F .
Cannot create C:\Users\Jonas\AppData\Roaming\BrewIdeas\ProgComma nd.
Habs auch mal als Admin gestartet. Win7 Pro 64Bit. Gleiches Ding.

EWeiss 20. Aug 2012 08:26

AW: Animierte Image Button
 
Zitat:

Zitat von Jonas Shinaniganz (Beitrag 1178834)
Beim Ausführen der Exe, Diese Meldung:

Zitat:

Exception Exception in Modul ProgBar.exe bei 0004C21F .
Cannot create C:\Users\Jonas\AppData\Roaming\BrewIdeas\ProgComma n.
Habs auch mal als Admin gestartet. Win7 Pro 64Bit. Gleiches Ding.

Der Pfad sollte sein
C:\Users\Jonas\AppData\Roaming\BrewIdeas\ProgComma nd\ProgBar
Ohne das leerzeichen zwischen dem "a" und "n" wird hier nicht richtig angezeigt warum auch immer.

Dort wird dann die INI gespeichert.
Seltsam wieder so ein ding das bei mir nicht auftritt.

Danke für die Info.

gruss

Bernhard Geyer 20. Aug 2012 08:29

AW: Animierte Image Button
 
Zitat:

Zitat von EWeiss (Beitrag 1178836)
Seltsam wieder so ein ding das bei mir nicht auftritt.

Lösch/Benenn mal das Verzeichnis um. Ich tipp darauf das du vergisst hier das Verzeichnis anzulegen und es nur klappt weil das Verzeichnis bei dir (aufgrund alter Version/Test) schon existiert.

EWeiss 20. Aug 2012 08:34

AW: Animierte Image Button
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1178837)
Zitat:

Zitat von EWeiss (Beitrag 1178836)
Seltsam wieder so ein ding das bei mir nicht auftritt.

Lösch/Benenn mal das Verzeichnis um. Ich tipp darauf das du vergisst hier das Verzeichnis anzulegen und es nur klappt weil das Verzeichnis bei dir (aufgrund alter Version/Test) schon existiert.

Du hast recht!
Durch die änderung in meiner LIB habe ich vergessen die erste DIR zu erstellen BrewIdeas daher geht es nicht.
Lade gleich ne fixed Version hoch.

Danke!

gruss

Sir Rufo 20. Aug 2012 08:37

AW: Animierte Image Button
 
Zitat:

Zitat von EWeiss (Beitrag 1178839)
Zitat:

Zitat von Bernhard Geyer (Beitrag 1178837)
Zitat:

Zitat von EWeiss (Beitrag 1178836)
Seltsam wieder so ein ding das bei mir nicht auftritt.

Lösch/Benenn mal das Verzeichnis um. Ich tipp darauf das du vergisst hier das Verzeichnis anzulegen und es nur klappt weil das Verzeichnis bei dir (aufgrund alter Version/Test) schon existiert.

Du hast recht!
Durch die änderung in meiner LIB habe ich vergessen die erste DIR zu erstellen BrewIdeas daher geht es nicht.
Lade gleich ne fixed Version hoch.

Danke!

gruss

Delphi-Referenz durchsuchenForceDirectories ;)

EWeiss 20. Aug 2012 08:42

AW: Animierte Image Button
 
Jo habe ich ja ;)
Delphi-Quellcode:
if not DirectoryExists ....

Nur das bringt mir nichts wenn ich den Pfad im Quelltext nicht erstelle. :duck:

Habe es korrigiert und dürfte jetzt laufen.

gruss

Sir Rufo 20. Aug 2012 08:55

AW: Animierte Image Button
 
Der Unterschied zwischen ForceDirectories und DirectoryExists ist allerdings folgender:

ForceDirectories prüft, ob es das Verzeichnis gibt (wie DirectoryExists) aber versucht auch gleichzeitig die ganzen Verzeichnisse anzulegen, wenn es diese noch nicht gibt. Und nur wenn das nicht funktioniert (warum auch immer) dann liefert es dir ein False zurück. :)

EWeiss 20. Aug 2012 08:58

AW: Animierte Image Button
 
Zitat:

Zitat von Sir Rufo (Beitrag 1178842)
Der Unterschied zwischen ForceDirectories und DirectoryExists ist allerdings folgender:

ForceDirectories prüft, ob es das Verzeichnis gibt (wie DirectoryExists) aber versucht auch gleichzeitig die ganzen Verzeichnisse anzulegen, wenn es diese noch nicht gibt. Und nur wenn das nicht funktioniert (warum auch immer) dann liefert es dir ein False zurück. :)

Sollte ich wohl noch implementieren.
Könnte mir da im nachhinein einiges an Schreibkram sparen.

Frage mich nur warum ich da nicht selbst drauf gekommen bin :)

Danke.

gruss

EWeiss 20. Aug 2012 19:29

AW: Animierte Image Button
 
Schade! Dachte eigentlich jemand könnte mir sagen ob die Animationen
flüssig laufen, keine CPU auslasten und die resourcen freigegeben werden. (zumindest was im Taskmanager so sichtbar ist.)

Da keine Negativen aussagen gepostet wurden gehe ich davon aus das es in Ordnung zu sein scheint.
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)


gruss

lbccaleb 20. Aug 2012 20:07

AW: Animierte Image Button
 
Also die Animation läuft flüssig, flimmert bei mir allerdings ein wenig.
Scheint auch komplett alles freigegeben zu sein.

Win7 x64

EWeiss 20. Aug 2012 20:13

AW: Animierte Image Button
 
Zitat:

Zitat von lbccaleb (Beitrag 1178944)
Also die Animation läuft flüssig, flimmert bei mir allerdings ein wenig.
Scheint auch komplett alles freigegeben zu sein.

Win7 x64

Danke für dein Feedback..

Glaube das von dir wahrgenommene Flimmern liegt am Filmstrip selbst.
Das letzte Frame ist übergangsmäßig nicht synchron genug das erweckt den anschein das es Flimmert.

gruss

lbccaleb 20. Aug 2012 20:25

AW: Animierte Image Button
 
Nee, bei mir ist ein kleines weißes aufblitzen zwischen den einzelnen Bildern zu sehen.
Also nicht nur beim Übergang vom letzten zum ersten Bild.

EWeiss 20. Aug 2012 20:43

AW: Animierte Image Button
 
Zitat:

Zitat von lbccaleb (Beitrag 1178948)
Nee, bei mir ist ein kleines weißes aufblitzen zwischen den einzelnen Bildern zu sehen.
Also nicht nur beim Übergang vom letzten zum ersten Bild.

Das ist schlecht dann muss ich wohl noch was dran arbeiten.

gruss

s.h.a.r.k 20. Aug 2012 20:47

AW: Animierte Image Button
 
Zitat:

Zitat von EWeiss (Beitrag 1178955)
Das ist schlecht dann muss ich wohl noch was dran arbeiten.

gruss

DAher gibts gerade keinen Download? :stupid:

Jonas Shinaniganz 21. Aug 2012 07:53

AW: Animierte Image Button
 
:-D 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...

Verwendest du eigene Styles?
Die Form ist eine FM 3D Anwendung?
Ist die Animation auf fortlaufend eingestellt?

Grüße jonas

EWeiss 21. Aug 2012 18:59

AW: Animierte Image Button
 
Zitat:

Zitat von Jonas Shinaniganz (Beitrag 1178983)
:-D 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

s.h.a.r.k 21. Aug 2012 20:52

AW: Animierte Image Button
 
Die Animationen starten irgendwie nicht an der korrekten Position. Da ist ein leichtes Springen drin, wenn ich mit der Maus über ein Toolbar-Icon fahre. Ansonsten schauts doch ganz gut aus :thumb:

EWeiss 21. Aug 2012 20:54

AW: Animierte Image Button
 
Wer sehen will was das teil später mal tut kann sich ja meine Hilfe Datei anschauen.
Das Programm habe ich mal in VB geschrieben (1999) und setze es jetzt nach Delphi um.

Leider hat die *.chm kleine Skriptfehler so das man nicht mehr alles lesen kann.
Wenn man also unter Programm/ProgBar im linken Reiter klickt anschließend auf das Image auf der aktualisierten seite
funtioniert dann auf der darauf folgenden Seite nur der Eintrag 6. Konfigurieren der Knöpfe.

Anhang gelöscht..

gruss

EWeiss 21. Aug 2012 21:01

AW: Animierte Image Button
 
Zitat:

Zitat von s.h.a.r.k (Beitrag 1179140)
Die Animationen starten irgendwie nicht an der korrekten Position. Da ist ein leichtes Springen drin, wenn ich mit der Maus über ein Toolbar-Icon fahre. Ansonsten schauts doch ganz gut aus :thumb:

Das erste Bild was man beim start sieht gehört nicht zur Animation liegt also Flach auf der Form
Nach einen MouseMove wird dieses Visible False geschaltet.
Die Animation die dann sichtbar geschaltet wird bekommt dann automatisch den Focus da die Maus sich ja noch an der gleichen position befindet.
Das erste Frame im Strip hat dann einen Schatten so das es aussieht als wenn das Image angehoben würde.
Ist es das was du meinst?

Eigentlich sollte schon immer zuerst dieses sichtbar werden.
Beim letzten Bild im Strip habe ich ein synchronisierungs problem vom letzten zum ersten
das verursacht eine kleine Unregelmäßigkeit.

Ich glaube hier liegt wieder mal ein Timing problem vor.

Danke für deine Infos.

gruss

EWeiss 22. Aug 2012 01:30

AW: Animierte Image Button
 
Nochmal ein kleines Update..

Danke für das Testen
Müßte jetzt eigentlich in Ordnung sein.
Ein paar Skins addiert deshalb etwas größer.

gruss

DeddyH 22. Aug 2012 07:11

AW: Animierte Image Button
 
Das sieht ganz gut aus, allerdings fallen immer noch 2 Dinge auf:
- das Flackern beim "Zurückspulen" auf den ersten Frame ist immer noch vorhanden
- ein Bewegen der Maus hält die Animation an (das dürfte am Timer liegen)

Sofern das einmal etwas Größeres werden soll, könnte man evtl. einen Thread in Betracht ziehen, oder? Damit sollte zumindest der 2. Punkt keine Rolle mehr spielen.

EWeiss 22. Aug 2012 07:14

AW: Animierte Image Button
 
Zitat:

Sofern das einmal etwas Größeres werden soll, könnte man evtl. einen Thread in Betracht ziehen, oder? Damit sollte zumindest der 2. Punkt keine Rolle mehr spielen.
Dem stimme ich zu. ;)
Ist ja ein teil meiner SkinEngine "ImageButton" erweitert
von daher kann es immer mal wieder vorkommen das ich etwas in dieser art verwenden möchte.

Zitat:

das Flackern beim "Zurückspulen" auf den ersten Frame ist immer noch vorhanden
Ist ein part des Design müßte da also die Animation nur erweitern.

OK werde den Anhang wieder löschen..
Später geht es ja nicht mehr.

gruss

EWeiss 23. Aug 2012 00:39

AW: Animierte Image Button
 
Zitat:

- das Flackern beim "Zurückspulen" auf den ersten Frame ist immer noch vorhanden
- ein Bewegen der Maus hält die Animation an (das dürfte am Timer liegen)
Die gemeldeten Fehler sollten jetzt behoben sein.
Detlef .. aber ohne Thread :oops:

Die Tranparente Edit ist noch nicht fertig.

Da fehlen noch Messagen.
ContexMenu, Texteingabe usw.. Die Subclass verweigert mir den zugriff darauf.
Werde wohl alle diese Funktionen noch selbst implementieren müssen.

gruss

DeddyH 23. Aug 2012 07:33

AW: Animierte Image Button
 
Japp, das ist viel besser. Ob mit oder ohne Thread bleibt letztlich Dir überlassen, das war nur ein Vorschlag. Ich will ja niemandem vorschreiben, wie er was zu programmieren hat.

alphaflight83 23. Aug 2012 07:51

AW: Animierte Image Button
 
Gerade mal ausprobiert:
- Flackern ist ab und an noch zu sehen.
- Bei Klick-Halten auf einen der Buttons, Stopp der Animation.
(Ich denke mal der Strobo-Effekt beim Klick ist gewollt)
(Win7 32bit)

EWeiss 23. Aug 2012 08:20

AW: Animierte Image Button
 
Zitat:

Zitat von alphaflight83 (Beitrag 1179452)
Gerade mal ausprobiert:
- Flackern ist ab und an noch zu sehen.
- Bei Klick-Halten auf einen der Buttons, Stopp der Animation.
(Ich denke mal der Strobo-Effekt beim Klick ist gewollt)
(Win7 32bit)

Jo der ist ja abhängig vom image.

Die Animation selbst kann ja variabel programmiert werden.
Ich aktiviere die Animation bei WM_MOUSEMOVE
Alternativ könnte man auch so vorgehen das man im MouseMove Event das erste Frame im Strip anzeigt.
Und im MouseDown ereignis anschließend die Animation startet welche dann einmal das strip durchläuft

Es ging mir mal um die grundfunkionen wo ich sehen wollte ob die auch wo anders gut laufen.

Zitat:

Japp, das ist viel besser. Ob mit oder ohne Thread bleibt letztlich Dir überlassen, das war nur ein Vorschlag. Ich will ja niemandem vorschreiben, wie er was zu programmieren hat.
Das problem war das ich immer wieder den Timer im Move ereignis aufgerufen habe.
Das wird jetzt einfach durch ne Variable unterbunden.

Delphi-Quellcode:
        ID_BTN_ANIMNEWPROGBAR:
        begin
          if not (AnimButton = 1) then
          begin
            SKAERO_SetCTLText(lblToolTips.Handle, 'Neue ProgBar erstellen');
            Img := SKAERO_GetButImageBackProperty(btnAnimNewProgBar.Handle);
            GDIP_GetImageSize(Img, imgW, imgH);
            ImgAnimW := imgW div 31;
            AnimButton := 1;
            SetTimer(MainHandle, ANIM_TIMER, 50, nil);
          end;
        end;
TimerEvent war Ok..

Dann ist das erstmal so Ok..


gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz