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

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 :P
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é. :mrgreen:

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

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))