Page 1 sur 1
image invisible
Publié : jeu. 22/déc./2005 22:18
par Le psychopathe
Voilà j'ai fais un programme web radio (très simple) mias j'ai un problème :
J'ai fais un systray pour qu'une icone se mette là quand on clique sur un boutton et en même temps je rend la fenêtre invisible. Mais lorsque je rend de nouveau la fenêtre visible alors l'image disparaît par contre tous les bouttons sont bien mis. L'objet image est le seul à faire de la résistance. J'ai essyé de le supprimer de le recréer mais rien fonctionne

alors help svp.
merci
Publié : jeu. 22/déc./2005 23:02
par Gratteur
Il faut que l'image chargée dans le ImageGadget reste chargée en mémoire. Tu n'aurais pas fait un FreeImage pour gagner de la place ? Sinon un petit SetGadgetState(imagegadgetD, UseImage(imageID)) devrait suffire
C'est tout ce que je peux dire sans voir le code ou un exemple de ce qui foire.
Publié : ven. 23/déc./2005 10:36
par Le psychopathe
non j'ai pas fais de free gadget mais j'ai essayé aussi pour tout recharger mais rien. J'ai supprimé mon code source mais je vais le refaire et je le posterai. merci

Publié : ven. 23/déc./2005 11:35
par Chris
Et en récupérant #PB_EventRepaint dans la boucle suivi d'un UpdateWindow(WindowId()), tu as essayé.
A tout hasard, un petit code que j'avais, et que j'ai modifié pour t'expliquer ce que je veux dire.
Change le chemin de l'icone à la ligne 26
Mais c'est vrai que c'est pas facile de comprendre ce que tu veux exactement sans un petit bout de code qui reproduit le problème.
Code : Tout sélectionner
;- Constantes fenêtres
Enumeration
#Win_Main
EndEnumeration
;-Constantes diverses
Enumeration
#Image
#ImageFond
#Button
#SysIcon
#Sytray
#PopUp
EndEnumeration
;- Création d'une image pour le fond de la fenêtre
If CreateImage(#ImageFond, 100, 100)
StartDrawing(ImageOutput())
Box(0, 0, 100, 100, RGB($0,$FF,$0))
Circle(50, 50, 50, RGB($0,$0,$FF))
StopDrawing()
EndIf
;- Chargement d'une icône pour la barre de tâches
hIconSysTray = LoadImage(#SysIcon, "D:\PureBasic\MesProgs\ClearScreen\ClearScreen.ico")
Procedure Minimize(Flag.b)
DisableMenuItem(1,Flag) ; Active/Désactive le menu 1
DisableMenuItem(2, Flag!1) ; Active/Désactive le menu 2
HideWindow(#Win_Main, Flag) ; Réduit la fenêtre
EndProcedure
;- Ouverture de la fenêtre, et création des menus et du SysTray
hwnd = OpenWindow(#Win_Main, 300, 300, 100, 100, #PB_Window_SystemMenu | #PB_Window_Invisible , "SysTray-Test")
If CreateGadgetList(hwnd)
ButtonGadget(#Button, 10, 10, 80, 20, "Bouton")
EndIf
AddSysTrayIcon(#Sytray,hwnd,hIconSysTray) ; Ajoute l'icône dans le SysTray
CreatePopupMenu(#PopUp) ; Crée un menu Pop-Up
MenuItem(1,"Mettre en icône...") ; Ajout des menus
MenuItem(2,"Afficher...")
MenuBar()
MenuItem(3,"Quitter")
DisableMenuItem(1,1) ; Menu inactif
DisableMenuItem(2,0) ; Menu actif
;- Début de la boucle
Repeat
Select WaitWindowEvent()
Case #PB_EventRepaint
StartDrawing(WindowOutput())
DrawImage(UseImage(#ImageFond), 0, 0)
StopDrawing()
UpdateWindow_(hwnd)
Case #PB_Event_SysTray
Select EventType()
Case #PB_EventType_RightClick ; Un click droit affiche le menu
DisplayPopupMenu(#PopUp, hwnd)
EndSelect
Case #PB_EventMenu
Select EventMenuID()
Case 1 : Minimize(1)
Case 2 : Minimize(0)
Case 3 : Quit = 1 : End
EndSelect
Case #PB_EventGadget
Select EventGadgetID()
EndSelect
Case #PB_EventCloseWindow : Minimize(1)
EndSelect
Until Quit = 1
End
Publié : ven. 23/déc./2005 12:46
par Chris
Ou avec une Callback, c'est encore plus simple.
Code : Tout sélectionner
;- Constantes fenêtres
Enumeration
#Win_Main
EndEnumeration
;-Constantes diverses
Enumeration
#Image
#ImageFond
#Button
#Str
#Txt
#SysIcon
#Sytray
#PopUp
EndEnumeration
;- Création d'une image pour le fond de la fenêtre
If CreateImage(#ImageFond, 200, 200)
StartDrawing(ImageOutput())
Box(0, 0, 200, 200, RGB($0,$FF,$0))
Circle(100, 100, 100, RGB($0,$0,$FF))
StopDrawing()
EndIf
;- Chargement d'une icône pour la barre de tâches
hIconSysTray = LoadImage(#SysIcon, "D:\PureBasic\MesProgs\ClearScreen\ClearScreen.ico")
;- Procedures
Procedure Minimize(Flag.b)
DisableMenuItem(1,Flag) ; Active/Désactive le menu 1
DisableMenuItem(2, Flag!1) ; Active/Désactive le menu 2
HideWindow(#Win_Main, Flag) ; Réduit la fenêtre
EndProcedure
Procedure CallBack(Hnd,msg,wParam,lParam)
Resultat = #PB_ProcessPureBasicEvents
Select msg
Case #WM_PAINT
;- Solution 1, avec la librairie 2D Drawing
If Hnd = WindowID(#Win_Main)
UseWindow(#Win_Main)
StartDrawing(WindowOutput())
DrawImage(UseImage(#ImageFond), 0, 0)
StopDrawing()
EndIf
;- Solution 2, avec un image gadget
;SetGadgetState(#Image, UseImage(#ImageFond))
EndSelect
ProcedureReturn Resultat
EndProcedure
;- Ouverture de la fenêtre, et création des menus et du SysTray
hwnd = OpenWindow(#Win_Main, 300, 300, 200, 200, #PB_Window_SystemMenu | #PB_Window_Invisible , "SysTray-Test")
If CreateGadgetList(hwnd)
ButtonGadget(#Button, 10, 10, 80, 20, "Bouton")
StringGadget(#Str, 10, 40, 180, 20, "")
TextGadget(#Txt, 10, 70, 180, 15, "Un petit texte pour la fenêtre")
;- Utiliser l'ImageGadget avec la solution 2
;ImageGadget(#Image, 0, 0, 200, 200, UseImage(#ImageFond))
EndIf
SetWindowCallback(@CallBack())
AddSysTrayIcon(#Sytray,hwnd,hIconSysTray) ; Ajoute l'icône dans le SysTray
CreatePopupMenu(#PopUp) ; Crée un menu Pop-Up
MenuItem(1,"Mettre en icône...") ; Ajout des menus
MenuItem(2,"Afficher...")
MenuBar()
MenuItem(3,"Quitter")
DisableMenuItem(1,1) ; Menu inactif
DisableMenuItem(2,0) ; Menu actif
;- Début de la boucle
Repeat
Select WaitWindowEvent()
Case #PB_Event_SysTray
Select EventType()
Case #PB_EventType_RightClick ; Un click droit affiche le menu
DisplayPopupMenu(#PopUp, hwnd)
EndSelect
Case #PB_EventMenu
Select EventMenuID()
Case 1 : Minimize(1)
Case 2 : Minimize(0)
Case 3 : Quit = 1 : End
EndSelect
Case #PB_EventGadget
Select EventGadgetID()
EndSelect
Case #PB_EventCloseWindow : Minimize(1)
EndSelect
Until Quit = 1
End
Publié : ven. 23/déc./2005 22:07
par Le psychopathe
Merci c'est ce qu'il me fallait.
J'ai retrouvé le code sans la partie hide window car j'ai dû tout supprimé.
Code : Tout sélectionner
; PureBasic Visual Designer v3.92 build 1460
;- Window Constants
;
Enumeration
#Window_0
EndEnumeration
;- Gadget Constants
;
Enumeration
#Button_0
#Button_1
#Combo_0
#Image_0
#Button_2
#Button_3
#Button_4
#Button_5
EndEnumeration
Message$="RaDiO WeB v1.1 par MFdev. "
;- Image Plugins
UseJPEGImageDecoder()
;- Image Globals
Global Image0
;- Catch Images
Image0 = CatchImage(0, ?Image0)
;- Images
DataSection
Image0:
IncludeBinary "C:\Documents and Settings\le psychopathe\Bureau\MFstudios.jpg"
EndDataSection
Procedure Open_Window_0()
If OpenWindow(#Window_0, 216, 0, 300, 110, #PB_Window_TitleBar | #PB_Window_MinimizeGadget , "RaDiO WeB v1.1 par MFstudios")
If CreateGadgetList(WindowID())
ButtonGadget(#Button_0, 0, 70, 50, 20, "play")
ButtonGadget(#Button_1, 50, 70, 50, 20, "stop")
ComboBoxGadget(#Combo_0, 180, 70, 120, 230)
ImageGadget(#Image_0, 0, 0, 300, 70, Image0)
ButtonGadget(#Button_2, 100, 70, 80, 20, "MFdev")
ButtonGadget(#Button_3, 10, 90, 50, 20, "Exit")
ButtonGadget(#Button_4, 60, 90, 50, 20, "info")
ButtonGadget(#Button_5, 110, 90, 70, 20, "A propos")
EndIf
EndIf
EndProcedure
open_window_0()
AddGadgetItem(#Combo_0, -1, "contact")
AddGadgetItem(#Combo_0, -1, "Europe 2")
AddGadgetItem(#Combo_0, -1, "lemouv'")
AddGadgetItem(#Combo_0, -1, "NRJ")
AddGadgetItem(#Combo_0, -1, "OUÏ FM")
AddGadgetItem(#Combo_0, -1, "Radio junior")
SetGadgetState(#Combo_0,0)
Repeat
Select WindowEvent()
Case #PB_Event_CloseWindow
End
Case #PB_Event_Gadget
Select EventGadgetID()
Case 0
Goto active
Case 1
FreeGadget(8)
Case 2
position = GetGadgetState(#Combo_0)
Case 4
RunProgram("http://mfdeveloppement.info")
Case 5
End
Case 6
MessageRequester("info", "V1.1 beta. Je travail sur une nouvelle version avec plus de radio.",#PB_MessageRequester_Ok )
Case 7
Resultat = MessageRequester("A propos", Message$,#PB_MessageRequester_Ok )
EndSelect
EndSelect
Returne:
Delay(10)
Until lol=5
active:
Result$ = GetGadgetItemText(#Combo_0,position,0)
If Result$="contact"
Result$="http://www.contactmusic.fr/Players/WmpPlayer.php5"
EndIf
If Result$="Europe 2"
Result$="http://www.europe2.fr/yacast/player.php#"
EndIf
If Result$="lemouv'"
Result$="http://cache.yacast.fr/V4/lemouv/mouv_live_V3.html#"
EndIf
If Result$="NRJ"
Result$="http://player.nrj.fr/V4/nrj/nrj_launch_V3.html"
EndIf
If Result$="OUÏ FM"
Result$="http://www.ouirock.com/player/#"
EndIf
If Result$="Radio junior"
Result$="http://www.radiojunior.com/"
EndIf
WebGadget(8, 180, 50, 1, 1, Result$)
Goto Returne
Si vous avez des commentaires... Je suis à votre écoute et en quête de savoir.
Publié : ven. 23/déc./2005 22:38
par Chris
Tel qu'il est là, ton prog a l'air de marcher, par contre, il faut mettre l'ImageGadget qui recouvre la fenêtre, à la fin de la GadgetList() parce que sinon, tout ce qui se trouve après n'est pas accessible à la souris.
Publié : ven. 23/déc./2005 23:10
par nico
Oui mais si tu réduis puis agrandis la fenêtre, les autres controles disparaissent derrière l'image et il faut cliquer dans leurs zones d'affichage pour qu'ils ré-apparaissent.
Publié : ven. 23/déc./2005 23:15
par Chris
nico a écrit :Oui mais si tu réduis puis agrandis la fenêtre, les autres controles disparaissent derrière l'image et il faut cliquer dans leurs zones d'affichage pour qu'ils ré-apparaissent.
C'est pour ça que j'ai dit un peu plus haut qu'il fallait utiliser une CallBack() avec #WM_Paint
Publié : ven. 23/déc./2005 23:46
par nico
Le code que tu as posté plus haut avec #WM_PAINT ne fonctionne pas chez moi, lorsque la fenêtre doit être mis à jour, tous les controles disparaissent, même problème.

Publié : sam. 24/déc./2005 0:33
par Chris
nico a écrit :Le code que tu as posté plus haut avec #WM_PAINT ne fonctionne pas chez moi, lorsque la fenêtre doit être mis à jour, tous les controles disparaissent, même problème.

Tu parles de celui avec la callback, le deuxième que j'ai mis?
Chez moi, il marche, et j'ai même ajouté le flag #PB_Window_MinimizeGadget pour voir si ça fonctionnait quand la fenêtre est minimisée au lieu d'être cachée, ça fonctionne pareil, et avec ou sans les themes XP
Publié : sam. 24/déc./2005 0:42
par nico
Passe une autre fenêtre par dessus ou glisse la en bas de l'écran et remonte la fenêtre, tu vas comprendre!
Publié : sam. 24/déc./2005 0:47
par Chris
Ah oui, j'avais pas pensé à ça. Effectivement.
Moi, j'avais pensé "caché" dans la barre de taches ou "caché" par la fonction HideWindow().
Ouais, ben on verra ça demain.
