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 :cry: 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
:D

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. 8O

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. 8O
Tu parles de celui avec la callback, le deuxième que j'ai mis? 8O

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. :lol: