Seite 1 von 1

Mausklick auf animiertes GIF im Webgadget, suche Gifgröße

Verfasst: 09.12.2008 22:47
von hjbremer
das abfangen habe ich ganz simpel über ein darunter gelegtes leeres Imagegadget gelöst. Das Webgadget ist anscheinend irgendwie durchsichtig. Gibt sicher bessere Lösungen, die ich aber nicht kenne. Für diesen speziellen Zweck funktioniert es aber. Sollte jemand eine bessere Lösung haben zum erkennen eines Mausklicks im Webgadget, nur her damit.

mein Problem: wie finde ich die Größe des GIF Bildes heraus, um das GIF automatisch in die Mitte zu bekommen.

das GIF sollte eigentlich jeder haben, gehört zu PB. Ist auch nur zur Demo

Code: Alles auswählen

gif$ = #PB_Compiler_Home + "Examples\PureOCXHelper\animatedgif\computer16.gif"


OpenWindow(1,0,0,800,600,"") 
CreateGadgetList(WindowID(1)) 
HideWindow(1, 1) 

br = 150: hh = 150
ImageGadget(2, 10, 40, br, hh, 0) 
  WebGadget(3, 10, 40, br, hh, "",1) 

  leftmargin = 10
  topmargin = 10
  
  htm$ = "<HTML>" 
  htm$ + "<BODY bgcolor = green" ;oder bgcolor=threedface
  htm$ +      " scroll = no"
  htm$ +      " leftmargin = " + Str(leftmargin)
  htm$ +      " topmargin = " + Str(topmargin)
  htm$ + ">" 
  htm$ + "<img src = " + gif$ + ">" 
  htm$ + "</BODY></HTML>"
      
  SetGadgetItemText(3, #PB_Web_HtmlCode , htm$ )
        
  
HideWindow(1, 0) 

Repeat 
  EventID=WaitWindowEvent() 
   If eventid = #PB_Event_Gadget
     
      welcherButton=EventGadget()          
      
      Select welcherButton      
                      
        Case 2: Debug "auf Bild geklickt" 
      
      EndSelect  

   EndIf 
Until EventID=#PB_Event_CloseWindow 

End

Verfasst: 10.12.2008 00:10
von Fluid Byte
PureOCXHelper sollte jeder haben? Wie kommst denn bitte darauf? Von Namen her ist das wohl eine Lib von Gonzal. Gehört auf jeden Fall nicht zu PB Standardinstallation.

Verfasst: 10.12.2008 11:19
von Shardik
Das Verzeichnis PureOCXHelper und die GIF-Datei Computer16.GIF sind Bestandteil der UserLib PureDispHelper und damit nicht automatisch in jeder PB-Installation vorhanden.

Die Größe eines GIF-Bildes läßt sich mit Hilfe von Microsofts GDIPlus-Bibliothek leicht ermitteln (getestet unter WinNT SP6 und WinXP SP2, für Windows 98 und NT läßt sich von Microsoft das "GDI+ Platform SDK Redistributable Paket" herunterladen und nachträglich installieren):

Code: Alles auswählen

; ACHTUNG! In den Compiler-Optionen muß "Unicode-Executable erstellen" aktiviert sein,
; da der Dateiname für die GDIPlus-Funktion GdipCreateBitmapFromFile() als Unicode-String
; übergeben werden muß!

#GIFFile = #PB_Compiler_Home + "Examples\PureOCXHelper\animatedgif\computer16.gif"
#GDIPLUS_OK = 0

Structure GdiplusStartupInput
  GdiPlusVersion.L
  *DebugEventCallback.DebugEventProc
  SuppressBackgroundThread.L
  SuppressExternalCodecs.L
EndStructure

If OpenLibrary(0, "GDIPlus.DLL") = #False
  MessageRequester("Fehler", "Die Windows-Bibliothek GDIPlus.DLL konnte nicht geöffnet werden!", #MB_ICONEXCLAMATION)
  End
EndIf

Input.GdiplusStartupInput
Input\GdiPlusVersion = 1

CallFunction(0, "GdiplusStartup", @Token, @Input, 0)

If Token = 0
  MessageRequester("Fehler", "Die Initialisierung der Windows-Bibliothek GDIPlus.DLL ist fehlgeschlagen!", #MB_ICONEXCLAMATION)
Else
  If CallFunction(0, "GdipCreateBitmapFromFile", #GIFFile, @GIFImage) = #GDIPLUS_OK
    CallFunction(0, "GdipGetImageWidth", GIFImage, @GIFWidth)
    CallFunction(0, "GdipGetImageHeight", GIFImage, @GIFHeight)
    CallFunction(0, "GdipDisposeImage", GIFImage)

    MessageRequester("GIF-Info", "Maße des GIF-Bildes = " + Str(GIFWidth) + " x " + Str(GIFHeight), #MB_ICONINFORMATION)
  Else
    MessageRequester("Fehler", "Das GIF-Bild konnte nicht geladen werden!", #MB_ICONEXCLAMATION)
  EndIf

  CallFunction(0, "GdiplusShutdown", Token)
EndIf

CloseLibrary(0)
Ein ausführlicheres Beispiel hat srod im englischen Forum gezeigt:
http://www.purebasic.fr/english/viewtop ... 21&start=1
Dieses benötigt aber einen Wrapper für die GDIPlus.DLL, der im englischen Forum bereits von mehreren Autoren vorgestellt wurde. Ich habe daher der Einfachheit halber mein Beispiel mit CallFunction() entsprechend umgeschrieben, sodaß es auch ohne Wrapper sofort lauffähig ist.

Verfasst: 10.12.2008 23:16
von hjbremer
vielen Dank für die ausführliche Info, hatte mir das aber doch einfacher vorgestellt und darum mir ein GIF File mit einem Hexeditor angesehen.

und siehe da, folgendes ist dabei herausgekommen

Code: Alles auswählen

Structure GifFormat
  gifTyp.s{6}
  gifWidth.w
  gifHeight.w
EndStructure


datname$ = GetCurrentDirectory() + "h022.gif"

dnr = ReadFile(#PB_Any, datname$)

ReadData(dnr, @gif.Gifformat, SizeOf(gifformat))

CloseFile(dnr)

Debug gif\giftyp
Debug gif\gifWidth
Debug gif\gifHeight

PS: zum Testen gibt es jede Menge animierte Smileys hier im Forum

Verfasst: 11.12.2008 10:32
von Shardik
Danke schön für das doch wesentlich einfachere Beispiel. Auf die Idee mit dem Hex-Editor hätte ich eigentlich auch selbst kommen können... :wink:
Man hätte übrigens auch in die Dokumentation des GIF-Formats schauen können:
http://www.w3.org/Graphics/GIF/spec-gif87.txt
http://www.w3.org/Graphics/GIF/spec-gif89a.txt

Mein Beispiel mit Einsatz der GDIPlus.DLL hat allerdings einen Vorteil, wenn man die Maße von Bildern in unterschiedlichen Formaten erfahren möchte, da sich leicht aus dem Beispiel eine Prozedur erstellen läßt, die neben dem GIF-Format auch die Formate JPEG, TIFF, BMP, PNG, WMF und ICO unterstützt...