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