Page 1 sur 2
					
				scrollarea.. et image de fond
				Publié : mer. 11/nov./2009 10:45
				par Patix
				Bonjour,
Dans un scrollareagadget, j'ai une image de fond qui pose problème avec des boutons.
si j'installe l'image et les boutons ensuite, les boutons ne fonctionnent pas
si j'installe les boutons et l'image ensuite, les boutons disparaissent des que j'utilise la barre de scroll.
Une idée serait la bienvenue. 
 
Code : Tout sélectionner
Enumeration
#o_INuances
EndEnumeration
UsePNGImageDecoder()
INuances=CatchImage(#o_INuances, ?INuances)
    
If OpenWindow(0, 0, 0, 305, 140, "ScrollAreaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
    ScrollAreaGadget(0, 10, 10, 290,120, 375, 600, 30)
    ImageGadget(6,  10, 10, 300, 300, ImageID(#o_INuances))                      ; image gadget standard
      ButtonGadget  (1, 10, 10, 230, 30,"Bouton 1")
      ButtonGadget  (2, 50, 50, 230, 30,"Bouton 2")
      ButtonGadget  (3, 90, 90, 230, 30,"Bouton 3")
      TextGadget    (4,130,130, 230, 20,"Ceci est le contenu d'une zone de défilement !",#PB_Text_Right)
      CloseGadgetList() 
    Repeat 
      Select WaitWindowEvent() 
        Case  #PB_Event_CloseWindow 
          End 
        Case  #PB_Event_Gadget 
          Select EventGadget()
            Case 1
              MessageRequester("Info","Le bouton 1 a été appuyé !",#PB_MessageRequester_Ok)
            Case 2
              MessageRequester("Info","Le bouton 2 a été appuyé !",#PB_MessageRequester_Ok)
            Case 3
              MessageRequester("Info","Le bouton 3 a été appuyé !",#PB_MessageRequester_Ok)
          EndSelect
      EndSelect 
    ForEver 
  EndIf
DataSection
  Inuances:IncludeBinary ".\images\image.png"
EndDataSection
 
			 
			
					
				Re: scrollarea.. et image de fond
				Publié : mer. 11/nov./2009 10:59
				par Ar-S
				Salut, 
donnes-y donc l'image pour voir.
			 
			
					
				Re: scrollarea.. et image de fond
				Publié : mer. 11/nov./2009 11:20
				par Anonyme2
				Regardes la position en Y des boutons et du textgadget par rapport à la hauteur de l'image, il doit y avoir un problème
			 
			
					
				Re: scrollarea.. et image de fond
				Publié : mer. 11/nov./2009 12:29
				par venom
				c'est sympa ce code 
 
chez moi les boutons fonctionnent.
@++
 
			 
			
					
				Re: scrollarea.. et image de fond
				Publié : mer. 11/nov./2009 12:39
				par Le Soldat Inconnu
				il faut découper l'image autour des boutons pour que cela fonctionne, une superposition de gadget ne fonctionne jamais
en gros, tu prend GrabImage et tu découpes ton image de fond pour faire des trous pour les boutons.
			 
			
					
				Re: scrollarea.. et image de fond
				Publié : mer. 11/nov./2009 13:17
				par venom
				Le Soldat Inconnu a écrit :il faut découper l'image autour des boutons pour que cela fonctionne
tiens je ne savais pas sa. Et comment tu fait pour que PureBasic détecte les trous ? GrabImage n'est pas fait pour sa apparemment.
@++
 
			 
			
					
				Re: scrollarea.. et image de fond
				Publié : mer. 11/nov./2009 13:44
				par Le Soldat Inconnu
				il faut faire comme un puzzle, découper l'image de fond en plein de petit bout que l'on pose autour des boutons
Je n'arrive pas à retrouver mon exemple sur le forum  
retrouvé
Code : Tout sélectionner
    ; Auteur : Le Soldat Inconnu
    ; Version de PB : 4
    ;
    ; Explication du programme :
    ; Pour faire des programmes de test rapidement, il ne reste qu'a rajouter les gadgets et la gestion des évènements.
		
    Enumeration
      #Fond
      #Fond_Decoupe_H
      #Fond_Decoupe_B
      #Fond_Decoupe_D
      #Fond_Decoupe_G
      #Bouton
		EndEnumeration
		
    ; Création de la fenêtre et de la GadgetList
    If OpenWindow(0, 0, 0, 300, 300, "Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
      End
		EndIf
		
    ; le fond
    CreateImage(#Fond, 300, 300, 24)
    StartDrawing(ImageOutput(#Fond))
      For n = 0 To 299
        Line(0, n, 300, 1, RGB(170 + 80 * n / 300, 170 + 80 * n / 300, 170 + 80 * n / 300))
			Next
		StopDrawing()
		
    ; le bouton
    CreateImage(#Bouton, 100, 25, 24)
    StartDrawing(ImageOutput(#Bouton))
      Box(1, 1, 98, 23, $FFFFFF)
      DrawingMode(#PB_2DDrawing_Transparent)
      Texte.s = "Bonjour"
      DrawText((100 - TextWidth(Texte)) / 2, (25 - TextHeight(Texte)) / 2, Texte, $000000)
		StopDrawing()
		
    ; Affichage
    ; On découpe le fond pour faire un trou pour le bouton
    GrabImage(#Fond, #Fond_Decoupe_H, 0, 0, 300, 200)
    GrabImage(#Fond, #Fond_Decoupe_B, 0, 225, 300, 75)
    GrabImage(#Fond, #Fond_Decoupe_G, 0, 200, 100, 25)
    GrabImage(#Fond, #Fond_Decoupe_D, 200, 200, 100, 25)
		
    ; Fond
    ImageGadget(#Fond_Decoupe_H, 0, 0, 300, 200, ImageID(#Fond_Decoupe_H))
    ImageGadget(#Fond_Decoupe_B, 0, 225, 300, 75, ImageID(#Fond_Decoupe_B))
    ImageGadget(#Fond_Decoupe_G, 0, 200, 100, 25, ImageID(#Fond_Decoupe_G))
    ImageGadget(#Fond_Decoupe_D, 200, 200, 100, 25, ImageID(#Fond_Decoupe_D))
    ; Bouton
    ImageGadget(#Bouton, 100, 200, 100, 25, ImageID(#Bouton))
		
    Repeat
      Event = WaitWindowEvent()
			
      Select Event
				Case #PB_Event_Menu
          Select EventMenu() ; Menus
							
					EndSelect
					
				Case #PB_Event_Gadget
          Select EventGadget() ; Gadgets
						Case #Bouton
              Select EventType()
								Case #PB_EventType_LeftClick
                  Debug "Clic gauche sur le bouton"
							EndSelect
						Case #Fond_Decoupe_H, #Fond_Decoupe_B, #Fond_Decoupe_D, #Fond_Decoupe_G
              Select EventType()
								Case #PB_EventType_LeftClick
                  Debug "Clic gauche sur le fond"
								Case #PB_EventType_RightClick
                  Debug "Clic droit sur le fond"
							EndSelect
					EndSelect
			EndSelect
			
		Until Event = #PB_Event_CloseWindow
		
 
			 
			
					
				Re: scrollarea.. et image de fond
				Publié : mer. 11/nov./2009 16:42
				par Patix
				Re,
Découper chaque trou !!!!
Alors la c'est une galère. Parce que j'ai besoin d'au moins six boutons par ligne placés suivant des paramètres de localisation différents à chaque ligne et j'ai environ 1500 lignes (que je vais surement découper à l'affichage).
J'ai remarqué que les boutons fonctionnent si l'image est mise en dernier. Y a t'il une commande qui peut réinitialiser le scrollareagadget à chaque utilisation du scroll ?
ou autre question :
comment fait on pour joindre une action à chaque déplacement de la barre du scroll afin bien sur de réafficher le contenu du scrollareagadget avec des valeurs différentes ?
			 
			
					
				Re: scrollarea.. et image de fond
				Publié : mer. 11/nov./2009 16:49
				par Patix
				Re, 
Au fait merci pour vos réponses.
La réponse du Soldat Inconnu devrait me dépanner mais les questions de mon poste précédent restent d'actualité. 

 
			 
			
					
				Re: scrollarea.. et image de fond
				Publié : mer. 11/nov./2009 18:02
				par Le Soldat Inconnu
				la dernière solution, c'est de dessiner soit même le scrollareagadget avec de l'ownerdraw, ainsi tu peux dessiner réellement une image dessous
Je n'y arrive pas sur le scrollarea mais sur un container, donc j'ai un peu bidouillé
ça donne ça
Code : Tout sélectionner
Enumeration
	#o_INuances
EndEnumeration
UsePNGImageDecoder()
INuances=CreateImage(#o_INuances, 300, 300)
StartDrawing(ImageOutput(#o_INuances))
	For n = 0 To 299
		Line(0, n, 300, 1, RGB(255, 255, 255 - 255 * n / 300))
	Next
StopDrawing()
Global OldProc   ;// mémorise l'adresse de la procedure standart MS de traitement des événements de la fenêtre
Procedure WinCallback(hwnd, uMsg, wParam, lParam)
	
	If uMsg = #WM_PAINT
		hdc = BeginPaint_(hwnd, @ps.PAINTSTRUCT)
		If hdc
			brush = CreateSolidBrush_($FF00FF)
			If brush
				FillRect_(hdc, ps\rcPaint, brush)
				DeleteObject_(brush)
			EndIf
			DrawState_(hdc, 0, 0, ImageID(#o_INuances), 0, 0, 0, 0, 0, #DST_BITMAP | #DSS_NORMAL)
		EndIf
		EndPaint_(hwnd, ps)
		ProcedureReturn 0
	EndIf
	
	;// traitement par défaut
	ProcedureReturn CallWindowProc_(OldProc, hwnd, uMsg, wParam, lParam)
EndProcedure
If OpenWindow(0, 0, 0, 305, 140, "ScrollAreaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	
	ScrollAreaGadget(0, 10, 10, 290,120, 375, 600, 30)
		ContainerGadget(10, 0, 0, GetGadgetAttribute(0, #PB_ScrollArea_InnerWidth), GetGadgetAttribute(0, #PB_ScrollArea_InnerHeight))
			OldProc = SetWindowLongPtr_(GadgetID(10), #GWLP_WNDPROC, @WinCallback())
			
			ButtonGadget  (1, 10, 10, 230, 30,"Bouton 1")
			ButtonGadget  (2, 50, 50, 230, 30,"Bouton 2")
			ButtonGadget  (3, 90, 90, 230, 30,"Bouton 3")
			TextGadget    (4,130,130, 230, 20,"Ceci est le contenu d'une zone de défilement !",#PB_Text_Right)
		CloseGadgetList()
	CloseGadgetList()
	Repeat
		Select WaitWindowEvent()
			Case  #PB_Event_CloseWindow
				End
			Case  #PB_Event_Gadget
				Select EventGadget()
					Case 1
						MessageRequester("Info","Le bouton 1 a été appuyé !",#PB_MessageRequester_Ok)
					Case 2
						MessageRequester("Info","Le bouton 2 a été appuyé !",#PB_MessageRequester_Ok)
					Case 3
						MessageRequester("Info","Le bouton 3 a été appuyé !",#PB_MessageRequester_Ok)
				EndSelect
		EndSelect
	ForEver
EndIf
 
			 
			
					
				Re: scrollarea.. et image de fond
				Publié : mer. 11/nov./2009 20:00
				par Patix
				Faut que j'étudie cette solution.
Le problème de cette solution est qu'elle ne fonctionne que sous windows.
Une question me vient à l'esprit : Quelles sont les solutions pour effacer un gadget que l'on a affiché.
			 
			
					
				Re: scrollarea.. et image de fond
				Publié : mer. 11/nov./2009 20:37
				par Octavius
				Une solution avec RedrawWindow_() et UpdateWindow_(), à partir du premier code que tu as posté :
Code : Tout sélectionner
Enumeration
#o_INuances
EndEnumeration
UsePNGImageDecoder()
INuances=CatchImage(#o_INuances, ?INuances)
   
If OpenWindow(0, 0, 0, 305, 140, "ScrollAreaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ScrollAreaGadget(0, 10, 10, 290,120, 375, 600, 30)
    
      ButtonGadget  (1, 10, 10, 230, 30,"Bouton 1")
      ButtonGadget  (2, 50, 50, 230, 30,"Bouton 2")
      ButtonGadget  (3, 90, 90, 230, 30,"Bouton 3")
      TextGadget    (4,130,130, 230, 20,"Ceci est le contenu d'une zone de défilement !",#PB_Text_Right)
    ImageGadget(6,  10, 10, 300, 300, ImageID(#o_INuances))                      ; image gadget standard
      CloseGadgetList()
    Repeat
      Select WaitWindowEvent()
        Case  #PB_Event_CloseWindow
          End
        Case  #PB_Event_Gadget
          Select EventGadget()
            Case 1
              MessageRequester("Info","Le bouton 1 a été appuyé !",#PB_MessageRequester_Ok)
            Case 2
              MessageRequester("Info","Le bouton 2 a été appuyé !",#PB_MessageRequester_Ok)
            Case 3
              MessageRequester("Info","Le bouton 3 a été appuyé !",#PB_MessageRequester_Ok)
          EndSelect
      EndSelect
      For i=1 To 4
      RedrawWindow_(GadgetID(i),0,0,#RDW_INVALIDATE|#RDW_INTERNALPAINT|#RDW_ERASE)
      Next i
      UpdateWindow_(WindowID(0))
    ForEver
  EndIf
          
DataSection
  Inuances:IncludeBinary ".\images\image.png"
EndDataSection
Ca clignote très légèrement, mais ça marche bien.
Tu fais FreeGadget(#Gadget) pour détruire un gadget.
 
			 
			
					
				Re: scrollarea.. et image de fond
				Publié : mer. 11/nov./2009 21:59
				par nico
				Je n'y arrive pas sur le scrollarea mais sur un container, donc j'ai un peu bidouillé
ça donne ça
Il faut faire comme ça:
Code : Tout sélectionner
Handle=FindWindowEx_(GadgetID(0), #Null, "PureScrollAreaChild", "")
OldProc=SetWindowLongPtr_(Handle, #GWLP_WNDPROC, @WinCallback())
 
			 
			
					
				Re: scrollarea.. et image de fond
				Publié : mer. 11/nov./2009 22:27
				par Le Soldat Inconnu
				ah oki, faut chopé le fiston. pour ca que j'avais l'impression que mon image était dessous puis écrasé par autre chose, mici
			 
			
					
				Re: scrollarea.. et image de fond
				Publié : jeu. 12/nov./2009 22:46
				par Patix
				Merci pour toutes les réponses je n'ai plus qu'à faire mon choix. 
 
les deux commandes ci-dessous viennent d'ou ? pas vu dans la doc !
RedrawWindow_(GadgetID(i),0,0,#RDW_INVALIDATE|#RDW_INTERNALPAINT|#RDW_ERASE)
UpdateWindow_(WindowID(0))