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