Gif animés ou gif transparent dans une fenetre

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
andrebernard
Messages : 58
Inscription : jeu. 22/déc./2005 11:23

Gif animés ou gif transparent dans une fenetre

Message par andrebernard »

Bonjour

Voila, je voudrais inclure sur une fenetre un gif animé à fond transparent.
A force de chercher, j'ai trouvé la méthode avec "movie", en creant une deuxieme fenetre qui se positionne sur la premiere

OpenWindow(#Form,150, 250, 140,150,#PB_Window_BorderLess,"")
LoadMovie(#Form, "photos\image.gif")
ResizeMovie(0, 0, 100, 150)
PlayMovie(#Form, WindowID())

Mais le probleme c'est que quand je deplace la fenetre sur laquelle est placé la fenetre "FORM" evidement cette derniere ne la suit pas.
Je suis donc obligé de rejoué le code ci-dessus en prenant comme coordonnées la nouvelle position de la fenetre generale

Ca marche mais il y a un ecran noir de 1/2 seconde le temps que le movie demarre je pense, et ceci a chaque déplacement.

En bref y aurait il un moyen simple d'inclure avec je ne sais quel gadget une image en GIF transparent dans une fenetre.

Merci de votre aide
Coolman
Messages : 432
Inscription : sam. 01/janv./2005 16:07

Message par Coolman »

J'ignore si ca repond a ta question, essaie ce code trouvé je ne sais plus ou :

Code : Tout sélectionner

;=================================================================================================
; Autor : Michael Holderried (mueckerich)
; Modul Name : AniGIFForm.pb
; Description : Displays an animated GIF directly on a Form, which can be also moved.
; BuildDate : 22.07.2005
;================================================================================================
;- Window Constants
;
#Window_0 = 0
#SizeWindowX = 400
#SizeWindowY = 200

#SS_CENTERIMAGE = $200
#WS_EX_TRANSPARENT = $20

sWin.s

hwnd = OpenWindow(#Window_0, 400, 200, #SizeWindowX , #SizeWindowY, #PB_Window_SystemMenu, "Container-Window")
If CreateGadgetList(hwnd)
ButtonGadget(0,250,80,80,40,"End")
EndIf

If OpenLibrary(0,"ATL.DLL")
If CallFunction(0,"AtlAxWinInit") ; Init has to be done to register the ATL Class "AtlAxWin"
sWin = "Nomfichier.gif" ; Thats an Example how to dispaly a lokal stored GIF Animation
; sWin = "http://www.Somwhere.de//MyGif.gif" ; This Example shows how you can get the GIF Animation from the WEB
; now we create the Window for our GIF, it might be possible to create this Window as Topmost Parent?
hAxW = CreateWindowEx_(#WS_EX_TRANSPARENT | #SS_CENTERIMAGE, "AtlAxWin", sWin, #WS_VISIBLE | #WS_POPUP , 0, 0, 200, 200, hwnd, 0, GetModuleHandle_(0), 0)
If hAxW
SetParent_(hAxW, hwnd) ; Set GIF-Window as Child Window from our Container. Otherwise
EndIf ; it will be a Window which can also be outside of our Container
EndIf ; Try it out! (comment out SetParent)
EndIf

QuitFrm = 0
Repeat
EventID = WaitWindowEvent()
Select EventID
Case #WM_LBUTTONDOWN
ReleaseCapture_()
;SendMessage_(hwnd, #WM_SYSCOMMAND, #SC_MOVE + #HTCAPTION, 0) ;To move (Drag) the Container Window
SendMessage_(hAxW, #WM_SYSCOMMAND, #SC_MOVE + #HTCAPTION, 0) ;To move (Drag) the GIF within the Container Window
Case #PB_Event_Gadget
Select EventGadgetID()
Case 0: QuitFrm = 1
EndSelect
Case #PB_EventCloseWindow
QuitFrm = 1
EndSelect
Until QuitFrm

DestroyWindow_(hAxW) ; We have to desroy the Windows, otherwise you'll get a exeption
End

andrebernard
Messages : 58
Inscription : jeu. 22/déc./2005 11:23

Message par andrebernard »

Bonjour

Je te remercie, c'est au premier abord ce que je recherchais.
Je vais essayer de l'adapter a mon programme

Encore merci de ton aide et de sa rapidité.

Vive les pc, vive purebasic, vive coolman.

Tu porte tres bien ton pseudo.
Coolman
Messages : 432
Inscription : sam. 01/janv./2005 16:07

Message par Coolman »

De rien :)

Une petite astuce pour tous, j'utilise un excellent programme freeware pour referencer cataloguer plusieurs codes sources basic, freebasic, purebasic, c, pascal... je fais des recherches tres rapide et je pioche dedans au besoin, le programme se nomme keynote, c'est par ici:

http://www.tranglos.com/free/keynote.html

vraiment tres efficace comme programme pour referencer les donnees de type texte moins efficace et pas recommandé pour les images...

Cela dit, l'auteur a malheureusement cessé de suporter le logiciel...
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Oui, mais pourquoi ne pas se servir astucieusement d'un tableur comme Open Office Calc :roll:
http://fr.openoffice.org/
C'est gratoche!

C'est la copie conforme D'excel
Et avec çà vous pouvez indexer n'importe quoi comme cela vous chante :D
Et y a bien sur la même chose en base de donnée :D
Open Office Base etc

Ah quelle époque !
:lol:
Est beau ce qui plaît sans concept :)
Speedy Galerie
Coolman
Messages : 432
Inscription : sam. 01/janv./2005 16:07

Message par Coolman »

Openoffice 8O

Essaie d'installer ca sur une cle usb :D

C'est un vrai mastodonte ce machin pas vraiment adapté a l'usage que j'ai decrit...

Mais bon, il faut de tout pour faire un monde :roll:
andrebernard
Messages : 58
Inscription : jeu. 22/déc./2005 11:23

Message par andrebernard »

Bonjour coolman

En fait le plus drole c'est que le prg que j'essaie de réaliser, est du style de keynote. Mais en gerant tous les style de media.Lien html, txt, image, video, prg, etc .....
Il suffira ( lorsqu'il marchera ) de lui poser une question sur n'importe quoi pour qu'il reponde instantanément (enfin presque) et te donne un liste correspondant a ta demande, quel que soit le format.

Fini les codes perdus, les adresses des copains, telephone, liens qu'on se rappelle pas, prg qu'on cherche, image de la mémé qui a perdu sa derniere dent et que l'on veut montrer a la famille et pas moyen de la retrouver .................

En fait un mega explorer perso avec code d'acces pour les infos sensibles et surtout des graphismes splendide qui remplacent le carré banal de chaque page d'explorer windows.

Purebasic etant transportable sur media USB et multiplateforme donc on est presque quasi certain de trouver ce que l'on cherche qd on le cherche.

Voila, mais avant que ce vaste projet se realise, je suis un debutant en purebasic et je dois utiliser les memos habituel pour realiser MON megamo.
Je te remerci qd meme de la combine, qui est geniale, la preuve je programme le meme style.

Je suis plutot VB au travail (obligé) car plus on fait du purebasic moins on aime microsoft, j'essaie aussi de les faire cohabiter, comme la chevre et le loup, par exemple avec des DLL mais je n'y suis pas encore arrivé.
Appeller une DLL faite en purebasic dans VB6.

Je vais déposer un post a ce sujet, des fois que quelqu'un connaisse comment faire.

Encore merci, je vais essayer ce Week end pour le GIF, j'espere que je pouraios rendre le fond transparent qui pour l'instant est blanc dans l'exemple que tu m'a envoyé

Passe une bonne journée.
Coolman
Messages : 432
Inscription : sam. 01/janv./2005 16:07

Message par Coolman »

Bonjour andrebernard

En effet, etonnante coincidence, quand j'ai acheté purebasic (c'est a dire il y'a quelques mois), j'avais l'intention

de realiser le meme projet que le tien, un programme du meme genre que keynote, je me suis cependant rendu compte que

la tache aurait necessité beaucoups de temps car il fallait gerer un treeview, creer des convertisseur de format du

genre html vers rtf et vice versa, gerer ca dans une base de donnéé (pas evident avec purebasic au passage), compresser

les donnees, colorier les textes (encore pas evident avec pureb). certaines de ces taches peuvent etre realisé avec des

librairies existante que j'ai trouvé mais j'aurais perdu la possibilite du multiplateforme (linux), mais surtout le

plus important, c'est que le programme devait pouvoir etre utilisé a partir d'une cle usb. Devant la tache et avant de

reinventer la roue, je me suis demandé s'il n'existait pas un programme deja fait, j'ai trouvé keynote, ce programme

est tout simplement ideal avec quelques limitations (import html defaillant, gestion images lourdes), mais en fin de

compte apres un usage intensif, j'ai trouvé que le programme correspondait a mes besoins, et depuis je l'utilise pour

tous, gestion de codes sources de divers languages, carnet d'adresse, bookmark de site, trucs et astuces de tous type,

la fonction de recherche est assez efficace. concretement, j'ai donc laisser tomber le projet...

Depuis, j'ai trouvé d'autres programmes du meme genre :


Softnote : www.softchris.com freeware tres prometteur, avantage utilise la base de donnee opensource firebird (connu et

reconnu pour sa fiabilité) d'ou la possibilite de gerer une grande masse de donnee avec une rapidite raisonnable...

TreeDBNotes : www.softviewer.com freeware et commercial

Treepad : http://www.treepad.com/ la version freeware est sans interet (trop limité), par contre la version commercial

vaut le coup si on accepte d'investir quelques dollars...

Pour le reste j'aimerais bien t'aider, mais je n'ai pas beaucoup de temps en ce moment, cependant concernant les dlls

avec pureb, j'ai une doc que j'avais referencé dans keynote, c'est en allemand mais le code est claire, sinon va voir

sur le site de l'auteur, peut etre qu'il y'a une version anglaise :


*** Debut ICI ***************************************************************

DLL-Tutorial

Auf Nachfrage ist dieses kleine Tutorial entstanden. Als Vorraussetzung nehme ich die Beschreibung zur DLL-Erstellung

in der PureBasic Hilfe. Ausserdem wird hier nicht die Erstellung sondern das Aufrufen der DLL’s an Hand von Beispielen

erklärt.

Wir übernehmen vorerst einmal das Beispiel aus der Hilfe und erweitern es noch ein bisschen:

Global ReturnString.s

ProcedureDLL.s MyFunction(var.s, Long.l)
ReturnString.s = var + " " + Str(Long)
ProcedureReturn ReturnString.s
EndProcedure
Dieses Beispiel kompilieren wir zu einer DLL namens „TestDLL.dll“. Dafür muss in den Compiler-Optionen das Executable

Format auf „Shared DLL“ eingestellt und das ganze ganz normal kompiliert werden (am besten in den Compilers\ - Ordner

vom PB-Verzeichnis, damit die DLL einfach verfügbar ist).


Nun kommen wir zum Aufruf der DLL:
Zuerst muss sie mit OpenLibrary() geöffnet werden:

If OpenLibrary(0, "TestDLL.dll")
Debug 1
EndIf
Nicht vergessen zu testen, ob sie wirklich geladen werden kann! Man könnte das ganze auch so machen (mit #PB_Any):

Lib.l = OpenLibrary(#PB_Any, "TestDLL.dll")
If IsLibrary(Lib)
Debug 1
EndIf
Dies kann bei grossen Projekten nützlich sein, jedoch werde ich hier die erste Variante wählen. Man kann es auch ganz

einfach umbauen. Einfach den Anfang wie oben nehmen und alle 0 (Nulls) bei Befehlen wie CallFunction(0,...) mit „Lib“

ersetzen (IsLibrary() wird später erklärt).

Nun ist die DLL im Speicher geladen und die folgenden Funktionen können benutzt werden:

CallCFunction
CallCFunctionFast
CallFunction
CallFunctionFast
CloseLibrary
CountLibraryFunctions
ExamineLibraryFunctions
IsFunction
IsFunctionEntry
IsLibrary
LibraryFunctionAddress
LibraryFunctionName
LibraryID
NextLibraryFunction
OpenLibrary

Die CallCFunctionX werde ich hier nicht beschreiben, da sie eigentlich nicht Windows Standard ist.

Nun werden wir mal als Übung ‚alle’ Funktionen der Library auslesen und ausgeben:

If OpenLibrary(0, "TestDLL.dll")
AnzahlFunktionen.l = CountLibraryFunctions(0)
Debug "Anzahl Funktionen: "+Str(AnzahlFunktionen)
If ExamineLibraryFunctions(0)
While NextLibraryFunction()
Debug "Name der Funktion: "+LibraryFunctionName()
Debug "Adresse der Funktion: "+Str(LibraryFunctionAddress())
Wend
EndIf
EndIf
CountLibraryFunctions(0) gibt einfach die Anzahl an Funktionen einer geladenen DLL zurück.
If ExamineLibraryFunctions(0) ladet die Funktionsinformationen der DLL um die einzelnen Funktionen nacheinander

durchzugehen.
While NextLibaryFunction(): Übersetzt: Während es eine nächste Funktion gibt. Diese Funktion schaut also, ob es eine

nächste Funktion gibt in dieser DLL und gibt 1 zurück wenn „ja“. Diese Funktion darf nur nach ExamineLibraryFunctions()

aufgerufen werden und geht die gefundenen Funktionen der Reihe nach durch.
LibraryFunctionName() gibt nun den Namen dieser Funktion zurück. Dieser Name kann für CallFunction() benutzt werden.
LibraryFunctionAddress() gibt die Speicheradresse dieser Funktion zurück. Diese Adresse kann für den Aufruf mit

CallFunctionFast() benutzt werden.

Nun wissen wir aber diese obigen Informationen schon und können die Funktion MyFunction() eigentlich direkt ansprechen:

If OpenLibrary(0, "TestDLL.dll")
Adresse.l = IsFunction(0, "MyFunction")
Debug PeekS(CallFunction(0, "MyFunction", "Das ist die Nummer", 42))
Debug PeekS(CallFunctionFast(Adresse, "Das ist die Nummer", 42))
EndIf
IsFunction() überprüft hier, ob die Funktion wirklich existiert und gibt dann ihre Speicheradresse zurück, die man bei

CallFunctionFast() benutzen kann.
CallFunction() ruft die Funktion mit ihrem Namen auf und ist langsamer als CallFunctionFast(). Die Parameter werden

dabei nach der LibraryID und dem Funktions-namen (achtung! auf Gross- und Kleinschreibung achten) mit Kommas abgetrennt

angegeben. Zuerst der String, dann die Zahl.
CallFunctionFast() funktioniert gleich, nur muss hier anstatt der Name und die LibraryID nur die Adresse der Funktion

angegeben werden.

Vielleicht wundern sie sich, warum man PeekS() verwenden muss um einen String als Resultat zu erhalten. Das liegt

daran, dass eine Funktion in einer DLL keinen Rückgabetyp angibt und PureBasic desshalb nicht weiss, von welchem Typ

der Rückgabewert ist. Zurückgegeben wird also einfach die Adresse des Strings, womit der String schnell mit PeekS()

abgerufen werden kann.

Aus diesem Grund schreibt man gerne eine kleine Wrapper-Prozedur, die wie folgt aussehen könnte:

Procedure.s MyFunction(var.s, Long.l)
ProcedureReturn PeekS(CallFunction(0, "MyFunction", var, Long))
EndProcedure
Diese Funktion ist natürlich langsamer, wegen dem Doppelfunktionsaufruf und dem benutzen von CallFunction anstelle von

CallFunctionFast. Letzteres kann leicht geändert werden, aber das überlasse ich ihnen.

Nun folgt noch eine kleine Beschreibung der Fehlenden Funktionen:
CloseLibrary
Diese Funktion ist v.a. nützlich, wenn sie mehrere DLLs laden. Da PB die Library automatisch beim Beenden des Programms

schliesst, ist sie nicht nötig, aber doch noch schön. Ausserdem sollte sie beim Auftreten eines Fehlers im Programm

aufgerufen werden (benutze OnError-Lib).
IsFunctionEntry
Dazu kann ich nicht mehr sagen als in der Hilfe steht, ich habe sie noch nie benutzt!
IsLibrary
Diese Funktion sollte nach dem Öffnen der Library zum Testen, ob die Library wirklich bereit ist, benutzt werden.
LibraryID
Gibt das Api – Handle zurück, welches für die Windows API verwendet werden kann.
Laden von Windows DLLs
Das Laden von Windows DLLs funktioniert ziemlich gleich wie oben, nur dass die Informationen dafür aus der Win32Help,

MSDN oder sonst wo entnommen werden müssen.
(http://msdn.com)

Das Laden am Beispiel der Api-Funktion timeGetTime() (die in PB zwar auch mit timeGetTime_() aufgerufen werden kann

(ist ja nur ein Beispiel)):
Im MSDN steht folgendes:

DWORD timeGetTime(VOID);

und

Requirements
Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Mmsystem.h; include Windows.h.
Library: Use Winmm.lib.
Die obere Linie beschreibt die Funktion, Rückgabewert DWORD (in PB = Long), Name und Parameterliste VOID (was soviel

heisst wie: keine Parameter).
Bei den Requirements verrät uns das Library, welche Library wir laden müssen, nur heisst die nicht Winmm.lib sondern

Winmm.dll .

Und nun zum Code:

If OpenLibrary(0, "Winmm.dll")
Debug CallFunction(0, "timeGetTime")
Debug timeGetTime_()
EndIf
Die Library kann also einfach mit dem Namen geladen werden (ohne Ordnerangabe und nichts) und die Funktion wie vorher

mit CallFunction() aufgerufen werden. Daneben der Vergleich zu der ‚integrierten’ Funktion von PB (timeGetTime_()).

Manchmal steht auch noch so was wie:
GetTempPathW is supported by the Microsoft Layer for Unicode.
Z.B. bei der WinAPI-Funktion GetTempPath(), das bedeutet, dass es zwei Versionen von ihr gibt. Nämlich eine normale und

eine Unicode-Variante. Die normale Variante ist markiert durch ein A und die Unicode-Variante durch ein W:

GetTempPathA() und GetTempPathW(), dabei wird in PureBasic nur die A Variante unterstütz!
Hier das Beispiel:

Procedure.s GetTempPath()
lib = OpenLibrary(#PB_Any, "Kernel32.dll")
If IsLibrary(lib)
A$ = Space(1024)
CallFunction(lib, "GetTempPathA", 1024,A$)
CloseLibrary(lib)
ProcedureReturn A$
Else
ProcedureReturn ""
EndIf
EndProcedure



So das war’s vorerst mal.
Danke fürs Zuhören und viel Spass noch!
euer Remi



© by Remi Meier Jan. 2005
E-Mail: remi_meier@gmx.ch
Website: http://www.remimeier.ch.vu

*** Fin ICI ***************************************************************
andrebernard
Messages : 58
Inscription : jeu. 22/déc./2005 11:23

Message par andrebernard »

Bonjour

Je te remercie a nouveau de la rapidité de ta réponse.

Je vais essayer d'apprendre l'allemand deja que j'avais du mal avec l'anglais (HUMOUR)

Merci de ton aide, cela peut peut etre me mettre sur la voie.

Passe une bonne journée

Et au plaisir de se reparler
Coolman
Messages : 432
Inscription : sam. 01/janv./2005 16:07

Message par Coolman »

andrebernard a écrit :Bonjour

Je te remercie a nouveau de la rapidité de ta réponse.

Je vais essayer d'apprendre l'allemand deja que j'avais du mal avec l'anglais (HUMOUR)

Merci de ton aide, cela peut peut etre me mettre sur la voie.

Passe une bonne journée

Et au plaisir de se reparler
Regarde seulement le code exemple, moi aussi je ne comprend pas l'allemand 8O, Desolé je n'ai pas d'autre tuto concernant la creation de dlls avec pure, peut etre d'autres pourront te repondre a ce sujet :)
Répondre