scrollarea.. et image de fond

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Patix
Messages : 102
Inscription : ven. 19/nov./2004 14:17

scrollarea.. et image de fond

Message 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
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: scrollarea.. et image de fond

Message par Ar-S »

Salut,
donnes-y donc l'image pour voir.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: scrollarea.. et image de fond

Message 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
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: scrollarea.. et image de fond

Message par venom »

c'est sympa ce code :P
chez moi les boutons fonctionnent.







@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: scrollarea.. et image de fond

Message 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.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: scrollarea.. et image de fond

Message 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.






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: scrollarea.. et image de fond

Message 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
		
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Patix
Messages : 102
Inscription : ven. 19/nov./2004 14:17

Re: scrollarea.. et image de fond

Message 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 ?
Patix
Messages : 102
Inscription : ven. 19/nov./2004 14:17

Re: scrollarea.. et image de fond

Message 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:
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: scrollarea.. et image de fond

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Patix
Messages : 102
Inscription : ven. 19/nov./2004 14:17

Re: scrollarea.. et image de fond

Message 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é.
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Re: scrollarea.. et image de fond

Message 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.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: scrollarea.. et image de fond

Message 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())
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: scrollarea.. et image de fond

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Patix
Messages : 102
Inscription : ven. 19/nov./2004 14:17

Re: scrollarea.. et image de fond

Message 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))
Répondre