animiertes Gif anzeigen

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

animiertes Gif anzeigen

Beitrag von peternmb »

Hallo,

muß ich um eine kleine GIF-Animation anzuzeigen etwas anders machen als bei einem Bild?
Ich sehe zwar das GIF aber keine Animation (1.82)

Code: Alles auswählen

   wBmp := xbpBitmap():New():Create()
   wBmp:PresSpace(oPS)
   wBmp:LoadFile("uhr.gif")
   //
   wUhr := XbpStatic():new(wDlg:drawingArea,,{20,20},{ 60,60} )  
   wUhr:type    := XBPSTATIC_TYPE_BITMAP
   wUhr:caption := wBmp
   wUhr:create()
Irgendwo hatte ich mal ein Beispiel, ich glaube von Brent Dubbs, finde ich aber auf die Schnelle nicht mehr.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Peter,
wenn ein animiertes GIF nicht-animiert angezeigt wird (also nur das erste Bild der Sequenz), dann liegt das immer daran, dass der Betrachter nicht mit dem GIF-89a-Format klar kommt.
Hast Du mal versucht, statt das mit LoadFile zu laden, als Ressource (vom Typ USERDEF) in der ARC-Datei zu definieren und einzubinden?
Ich selber habe es nicht versucht - ist nur ein Vorschlag...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hallo Peter,

hierzu habe ich schon was geschrieben, das auch funktioniert.
Schau mal rein bei programmierung allgemein. Thema xbp-Bitmap (load)
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

klappt leider immer noch nicht

Beitrag von peternmb »

Tja, mir wäre es auch lieber die GIF in die ARC-Datei mit einzubinden, aber irgendwie bekomme ich das nicht hin.

Meine ARC-Datei sieht es jetzt so aus:

Code: Alles auswählen

ICON   100 = "app.ico"
BITMAP 201 = "test.bmp"

USERDEF GIF
123 = FILE "UHR.GIF"
Die Anzeige der Grafik soll z.B. so wie es Rolf gemacht hat auf einem Pushbuttom erscheinen

Code: Alles auswählen

wbmp:=xbpBitmap():new()
wbmp:load(NIL,123)
wbmp:create()

pbw:= XbpPushButton():New(wDlg,, {20,20},{60,60})
//pbw:Caption  := 201   // hiermit funktioniert es
pbw:Caption  := wbmp
pbw:Create()
Der Pushbuttom wird überhaupt nicht generiert. Wenn ich als Caption die 201 für die Bitmap nehme klappt es problemlos :?:
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Versuche es mal mit:

Code: Alles auswählen

pbw       := XbpPushButton():New(wDlg,, {20,20},{60,60}):create() 
xResource := LoadResource(123,,"GIF")
pbw:setBuffer( xResource, XBPBMP_FORMAT_GIF, 0 )
Hinweis: ::load() funktioniert nur in Verbindung mit Bitmaps aber nicht mit GIF-Dateien.


Gruß, Olaf
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hallo Peter,

folgendes: meine arc-Datei sieht so aus.

2001 BITMAP "sprinter.bmp"


Außerdem beim create vom Bitmap fehlt der Dialog.

bei mir ist dies so.- oBmp:create(oDlg)

und beim PushButton fehlt die Methode activate:

prüf und ändere dies nochmal ab, dann muß es funktionieren.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Beitrag von peternmb »

=> Olaf
funktioniert leider nicht, ich bekomme diese Fehlermeldung:
Object has no method with this name
Operation: SetBuffer
in der XPPERROR.LOG steht dann
...
oError:args :
-> VALTYPE: O CLASS: XbpPushButton
-> VALTYPE: C VALUE: GIF89a<
in der Dokumentation finde ich die Methode setBuffer auch nicht für XbpPushButton sondern nur für XbpBitmap

=> Rolf
die Anzeige von Bitmaps ist kein Problem, das funktioniert mit meinem Code ohne Probleme - mir geht es um eine animierte Gif.
Wenn die BMP in der ARC-Datei steht genügt es so:

Code: Alles auswählen

pbw:= XbpPushButton():New(wDlg,, {20,20},{60,60}) 
pbw:Caption  := 2001
pbw:Create()
Ein PushButton sollte auch ohne activate dargestellt werden, hat dann halt keine Funktion.
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Sorry, wie komme ich auf "Pushbutton"?

So sollte es eigentlich funktionieren:

Code: Alles auswählen


oBmp      := XbpPushButton():New(wDlg,, {20,20},{60,60}):Create()
xResource := LoadResource(123,,"GIF") 
If empty( xResource ) )   
     oBmp:setBuffer( xResource, XBPBMP_FORMAT_GIF, 0 ) 
ELSE
     MSGBOX( "Resource not found!" )
ENDIF
....
oBmp:show()

Oder etwas universeller:

Code: Alles auswählen

oBmp      := XbpPushButton():New(wDlg,, {20,20},{60,60}):Create()
SetxbbImage( @oBmp, 123, "GIF" ) // GIF
SetxbbImage( @oBmp, 201 )           // BMP

Code: Alles auswählen

Func SetxbpImage(oBmp, xResourceId, cResType , xDLL )
Local nFormat
Local lOk := .F.

   cResType := IFF( cResType == NIL, "", cResType)

   IF Valtype( xResourceId ) == "C"  // Datei auf Festplatte
      IF !File(  xResourceId)
         Msgbox("Error: Imagedatei nicht gefunden:" + xResourceId )
         Return ( NIL )
      ENDIF
      If oBmp:Loadfile( xResourceId )
         DO CASE
            CASE At( ".BMP", xResourceId ) > 0
               nFormat := XBPBMP_FORMAT_WIN3X
            CASE At( ".PNG", xResourceId ) > 0
               nFormat := XBPBMP_FORMAT_PNG
            CASE At( ".JPG", xResourceId ) > 0
               nFormat := XBPBMP_FORMAT_JPG
            CASE At( ".GIF", xResourceId ) > 0
               nFormat := XBPBMP_FORMAT_GIF
            otherwise
               Msgbox("Error: nicht unterstützes Imageformat:" + xResourceId )
               Return ( NIL )
         endcase
      else
         Msgbox("Error: Imagedatei lonnte nicht geladen werden.")
         Return ( NIL )
      endif
      lOk := TRUE
   ELSE

      IF empty( cResType )
                                                                                   // Standard: BMP-Format
         lOK     := oBmp:load( xDll, xResourceId )
         nFormat := XBPBMP_FORMAT_WIN3X
      ELSE
                                                                                    // PNG, GIF, JPG/JPG
         xResource := LoadResource( xResourceId, xDll, cResType )
         IF ( lOK := ! empty( xResource ) )                   // tries Imagetype from imagedata Signature
            DO CASE
               CASE substr( xResource, 1, 3 ) == "GIF"
                  nFormat := XBPBMP_FORMAT_GIF
               CASE substr( xResource, 2, 3 ) == "PNG"
                  nFormat := XBPBMP_FORMAT_PNG
               CASE substr( xResource, 7, 4 ) == "JFIF" .or. ;
                  ( chr(0xFF) + chr(0xE0) + chr(0) + chr(0x10) + "JFIF" + chr(0)) $ left( xResource, 100 )
                  nFormat := XBPBMP_FORMAT_JPG
               OTHERWISE
                  // this is an other imagetyp
                  MsgBox(" falscher Bitmap-Typ?!")
                  lOK := FALSE
            ENDCASE
            IF lOK
               oBmp:setBuffer( xResource, nFormat, 0 )                              // no Compression
            ENDIF
         else
            Msgbox("Kann Resource nicht laden")
         ENDIF
      ENDIF
   ENDIF


   IF lOK
      oBmp:Cargo := nFormat                                        // store imagetyp-format to ::cargo
                                                                   // afterwards the type cannot be determined.

      IF ( nFormat == XBPBMP_FORMAT_PNG ) .OR. ( nFormat == XBPBMP_FORMAT_GIF )   // set Transparence-color
            oBmp:transparentClr := oBmp:getDefaultBGColor()

      ENDIF
   ENDIF
RETURN ( NIL )
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Beitrag von peternmb »

mir würde das einfache Beispiel absolut genügen, wenn ich zum Laufen bringen würde.
Leider ist die Fehlermeldung immer noch die gleiche :?
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Ach jetzt sehe ich erst, wo Dein Problem liegt. Du willst ein GIF im Static-Object anzeigen.

Hier ein Beispiel:

Code: Alles auswählen

Procedure Main
   Local nEvent := NIL
   Local mp1   := NIL
   Local mp2   := NIL
   Local oxbp  := NIL

   nEvent := 0
   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp )
      oXbp:handleEvent( nEvent, mp1, mp2 )
   ENDDO

RETURN



PROCEDURE APPSYS()
   Local oDlg
   Local oIm
   Local aSize := {640,480}
   Local aPos
   Local oPs
   Local oBmp

   aPos  := CenterPos( aSize, AppDesktop():currentSize() )

   oDlg := XbpDialog():New( AppDesktop(),, aPos, aSize)
   oDlg:taskList := .T.
   oDlg:title := "Test"
   oDlg:create()
   oDlg:show()
   oIM    := xbpStatic():new( oDlg:drawingArea, , {200,200}, {140,140} )
   oIm:caption := ""
   oIm:paint := {|| Showbitmap( oIm, oDlg) }
   oIM:clipSiblings := .T.
   oIm:create()
   oIm:Show()
   SetAppWindow( oDlg )
   SetAppFocus ( oDlg )
Return



PROCEDURE APPSYS()
   Local oDlg
   Local oIm
   Local aSize := {640,480}
   Local aPos

   aPos  := CenterPos( aSize, AppDesktop():currentSize() )

   oDlg := XbpDialog():New( AppDesktop(),, aPos, aSize)
   oDlg:taskList := .T.
   oDlg:title := "Test"
   oDlg:create()
   oDlg:show()
   oIM    := xbpStatic():new( oDlg:drawingArea, , {200,200}, {140,140} )
   oIm:caption := ""
   oIm:paint := {|| Showbitmap( oIm, oDlg, {128,128})
   oIM:clipSiblings := .T.
   oIm:create()
   oIm:Show()
   SetAppWindow( oDlg )
   SetAppFocus ( oDlg )
Return



Func ShowBitmap( oIm, oDlg, aSize )
   Local oPs
   Local oBmP
   Local cFile := "smiley.gif"

   if oIm == NIL     // Create status
      Return NIL
   endif

   oPs := oIM:LockPs()
   oBmp := XbpBitmap():New():Create( oPs )
/------------- Wenn gif auf Festplatte ----------------
   If ! oBmp:Loadfile( cFile )
      msgbox("Error")
      oIm:Unlock(oPs)
      Return NIL
   endif
// oder 
/---------- oder wenn GIF in der Resource-Datei
xResource := LoadResource( 123, NIL, "GIF" )
If ! empty( xResource ) )
   DO CASE
      CASE substr( xResource, 1, 3 ) == "GIF"
         nFormat := XBPBMP_FORMAT_GIF
      CASE substr( xResource, 2, 3 ) == "PNG"
         nFormat := XBPBMP_FORMAT_PNG
      CASE substr( xResource, 7, 4 ) == "JFIF" .or. ;
         ( chr(0xFF) + chr(0xE0) + chr(0) + chr(0x10) + "JFIF" + chr(0)) $ left( xResource, 100 )
         nFormat := XBPBMP_FORMAT_JPG
      OTHERWISE
         // this is an other imagetyp
         MsgBox(" false Bitmaptype?!")
         lOK := FALSE
   ENDCASE

   oBmp:setBuffer( xResource, nFormat, 0 )
endif
/-------------------------------------------------------------------------

   oBmp:transparentClr := oBmp:getDefaultBGColor()
   oBMP:draw( oPS, {0, 0,aSize[1],aSize[2]}, GRA_BLT_ROP_SRCCOPY, GRA_BLT_BBO_IGNORE)
   oIm:UnlockPS( oPs )
   oIm:Show()
  Return NIL
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Ich benutze für animierte GIFs ein Control namens PLAYGIFO.OCX, das ich irgendwann mal irgendwo gekauft habe. :wink:
Herzlich,
Tom
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Beitrag von peternmb »

tja, irgendwie scheine ich mich da zu blöd anzustellen, ich bringe es einfach nicht hin ](*,) - auch mit dem Beispiel von Olaf klappt`s nicht.

Gibt es da bei der Darstellung solch gravierende Unterschiede zwischen einem "normalen" GIF und einem animierten GIF?
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

peternmb hat geschrieben:Gibt es da bei der Darstellung solch gravierende Unterschiede zwischen einem "normalen" GIF und einem animierten GIF?
Schau mal hier.

Du wirst die Einzelbilder herausziehen (z.B. hiermit) und nacheinander verarbeiten müssen. Ich schätze, dass Controls wie das von Tom genannte letzten Endes auch nichts anderes tun.

Günter
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Beitrag von Rudolf »

Hallo,
das wäre ein Beispiel von Roger mit XBPOCX, vielleicht hilft es:

STATIC FUNCTION CreateGif( oParent )

LOCAL cClassID, oGif

cClassId := "{605FA8C6-995D-48DC-995E-EC3C06D6CA0F}" // class ID for PlayGif
oGif := XbpOCX():new( oParent, cClassID, {0,0}, oParent:currentSize() )
oGif:create()

oGif:loadGif('AnimSynchStatRed.gif')
oGif:play()

RETURN oGif
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Beitrag von peternmb »

vielen Dank für die Antworten und Tipps.

Die Anzeige eines animierten GIF scheint mit xbase nicht so einfach möglich zu sein.

Ich habe es deshalb dahingehend gelöst, daß in einem eigenen Thread die Bilder nacheinander gezeigt werden.
Ist zwar nicht so universell, genügt aber für den gewünschten Zweck.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Peter,
auf die Art habe ich bei mir auch einen animierten Mauszeiger realisiert :D

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Martin,

falls du Microsofts Resource-Compiler rc.exe im Zugriff hast, kannst du animierte Mauszeiger mit dessen Hilfe in Xbase++ - Anwendungen einbinden. Die Xbase++ - Runtime kommt mit animierten Mauszeigern prima klar, nur arc.exe nicht.

Viele Grüße,
Günter
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Günter,
danke für den Tipp - habe ich aber nicht.
Und ich vermute mal, das ging auch noch nicht mit Xbase++ 1.5, oder?
So lange mache ich das nämlich schon...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Martin,

doch, das ging schon bei 1.5 :)

Visual C++ Express, inklusive rc.exe natürlich, kannst du übrigens kostenlos bei Microsoft herunterladen. (Warnung, fast 400 MB!)

Viele Grüße,
Günter
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

ich meine bei Xbase++ für OS/2 hat man auch eine RC.EXE verwendet.

Ist den die Syntax gleich von RC und ARC und wie bindet man dann die RC Datei in PBuild ein ?
Gruß
Hubert
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Hubert,

In der Projektdatei muß man lediglich den Eintrag RC_COMPILE sowie den Namen der Ressourcen-Definitionsdatei von .arc auf .rc ändern.

RC_COMPILE = rc

Die Syntax für rc-Dateien ist ein wenig anders. Beispiel:

Code: Alles auswählen

arc-Syntax:

BITMAP

BITMAP_CLOSE      = "bmps\close.bmp"

POINTER

POINTER_HOURGLASS = "bmps\hourglas.cur"

rc-Syntax:

BITMAP_CLOSE      BITMAP "bmps\\close.bmp"
POINTER_HOURGLASS CURSOR "bmps\\hourglas.ani"
Beachte bei Pfadangaben den verdoppelten Backslash.

Die komplette Syntaxbeschreibung steht hier.


Viele Grüße
Günter
Zuletzt geändert von Günter Beyes am Mo, 05. Mär 2007 14:57, insgesamt 1-mal geändert.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

von meinem Basic Compiler liegt eine RC.EXE von MS 4.00 - Build 1367
auf dem Rechner. Mal sehen ob ich auch mal animierte Mauszeiger verwende ...
Gruß
Hubert
Antworten