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

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

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

Beitrag 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
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag 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.
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag 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
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Beitrag 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...
Antworten