Canvas Redimensionement?
Canvas Redimensionement?
Bonjour,
J'avance bien dans mon apprentissage de PB.
je viens de découvrir que l'on ne peut modifier le Step d'une boucle For Next. Bon.
J'ai trouver ici comment faire.
Est-il possible de faire ResizeGadget sur un Canvas. Il m'est signalé une erreur comme quoi le Gadget n'est pas initialisé alors que je dessine dessus et le déplace avec ScrollAreaGadget sans problème
Je voudrais modifier ses dimension et actualiser #PB_ScrollArea_InnerWidth/Height.
Comment cela est-il possible ?
JM
J'avance bien dans mon apprentissage de PB.
je viens de découvrir que l'on ne peut modifier le Step d'une boucle For Next. Bon.
J'ai trouver ici comment faire.
Est-il possible de faire ResizeGadget sur un Canvas. Il m'est signalé une erreur comme quoi le Gadget n'est pas initialisé alors que je dessine dessus et le déplace avec ScrollAreaGadget sans problème
Je voudrais modifier ses dimension et actualiser #PB_ScrollArea_InnerWidth/Height.
Comment cela est-il possible ?
JM
Re: Canvas Redimensionement?
Jeanmarc a écrit :Bonjour,
J'avance bien dans mon apprentissage de PB.
je viens de découvrir que l'on ne peut modifier le Step d'une boucle For Next. Bon.
J'ai trouver ici comment faire.
a Propos du Step
Purebasic a une particularité par rapport aux autres basic
le Step en réalité , ne sert a rien !
par exemple dans une boucle genre :
Code : Tout sélectionner
For i=1 to 10
Debug i
Next i
; Epb
mais ... Purebasic a ceci de particulier, qu'on peut agir sur la variable qui instruit la boucle (ici "i" ) ; <--- Grosse Erreur de ma part voir plus loin ....

exemple :
Code : Tout sélectionner
For i=1 to 10
Debug i
i=i+1 ;<------- ceci reviens a faire Step 2 on influence directement la variable de la boucle !! Étonnant non ?
Next i
; Epb
Dernière modification par Zorro le sam. 18/juin/2016 13:48, modifié 1 fois.
- TazNormand
- Messages : 1297
- Inscription : ven. 27/oct./2006 12:19
- Localisation : Calvados (14)
Re: Canvas Redimensionement?
Je vois pas en quoi c'est une particularité de PB, tous les langages, à ma connaissance, agissent de la même manière : si tu modifies la valeur de l'indice de boucle, forcément que tu fausses le fonctionnement de celle-ci.Zorro a écrit : a Propos du Step
Purebasic a une particularité par rapport aux autres basic
le Step en réalité , ne sert a rien !
par exemple dans une boucle genre :
va afficher la sequence de 1 a 10Code : Tout sélectionner
For i=1 to 10 Debug i Next i ; Epb
mais ... Purebasic a ceci de particulier, qu'on peut agir sur la variable qui instruit la boucle (ici "i" )
exemple :Code : Tout sélectionner
For i=1 to 10 Debug i i=i+1 ;<------- ceci reviens a faire Step 2 on influence directement la variable de la boucle !! Étonnant non ? Next i ; Epb
Re: Canvas Redimensionement?
non non !
en principe en Basic la variable de la boucle n'est pas modifiable !
elle est protégé par le language ... tu ne peux y acceder qu'en lecture (sauf avec Purebasic )
j'ai jamais vu qu'on pouvait modifier la variable de la boucle , d'ou la creation de la commande STEP !
qui n'aurai aucun interet sinon
en principe en Basic la variable de la boucle n'est pas modifiable !
elle est protégé par le language ... tu ne peux y acceder qu'en lecture (sauf avec Purebasic )
j'ai jamais vu qu'on pouvait modifier la variable de la boucle , d'ou la creation de la commande STEP !
qui n'aurai aucun interet sinon
Re: Canvas Redimensionement?
bon je viens de Dowloader un emulateur ZX81
http://www.emu-france.com/emulateurs/10 ... -zx81-win/
apres avoir testé ce prg :
et je constate avoir ecris une connerie !! (une de plus )
la variable de boucle est bien modifiée !! ça fait 35 ans que je suis persuadé du contraire !!

du coup je ne comprends pas l'interet du parametre Step ! ??
http://www.emu-france.com/emulateurs/10 ... -zx81-win/
apres avoir testé ce prg :
Code : Tout sélectionner
1 For i=1 to 255
2 Print i
3 Let i=i+1
4 Next i
la variable de boucle est bien modifiée !! ça fait 35 ans que je suis persuadé du contraire !!


du coup je ne comprends pas l'interet du parametre Step ! ??

Re: Canvas Redimensionement?
Bon c'est sympa tout ce discourt sur Step, mais c'est résolu avec Step 0.
Mon problème c'est la possibilité de redimensionner Canvas avec ResizeGadget.
A+
JM
Mon problème c'est la possibilité de redimensionner Canvas avec ResizeGadget.
A+
JM
Re: Canvas Redimensionement?
Bonjour,
Je vais peut-être dire une bêtise, mais il faut envisager le cas ou il faut décrémenter le compteur de boucle au lieu de l'incrémenter.
Je vais peut-être dire une bêtise, mais il faut envisager le cas ou il faut décrémenter le compteur de boucle au lieu de l'incrémenter.
Code : Tout sélectionner
For k = 10 To 1 Step -1
Debug k
Next
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Canvas Redimensionement?
Ton canvas c'est un gadget personnalisé ?Jeanmarc a écrit :Mon problème c'est la possibilité de redimensionner Canvas avec ResizeGadget.
@Cage, Zorro, etc ... il est vrai que vous pourriez créer un sujet relatif à vôtre débat sur For ... next ou continuer sur celui là

Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Canvas Redimensionement?
avec une reflexion du genre t'es pas loin de plonger dans mon tiroir ....Jeanmarc a écrit :Bon c'est sympa tout ce discourt sur Step, mais c'est résolu avec Step 0.
Mon problème c'est la possibilité de redimensionner Canvas avec ResizeGadget.
A+
JM
c'est quand meme toi qui en parle du Step ... a la base

ps: si tu met Step 0 autant ne pas le mettre


tiens voila ta reponse !
Code : Tout sélectionner
;***********************************************
;Titre :*Canvas et image
;Auteur : Zorro
;Date :18/06/2016
;Heure :15:12:59
;Version Purebasic : PureBasic 5.42 LTS (Windows - x86)
;Version de l'editeur :EPB V2.62
; Libairies necessaire : Aucune
;***********************************************
UsePNGImageDecoder()
UseJPEGImageDecoder()
Enumeration
#win
#image
#Canvas
#image_original
EndEnumeration
if LoadImage(#image,"D:\Dobro\photos\dobro.jpg") ; <------- mettre un chemin vers image valide
ResizeImage(#image,200,200)
Else
MessageRequester("erreur","pas pu charger l'image")
End
Endif
If OpenWindow(#win, 0, 0, 220, 220, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered|#PB_Window_SizeGadget )
CanvasGadget(#Canvas, 1, 1, 220, 220)
If StartDrawing(CanvasOutput(#Canvas))
DrawImage(ImageId(#image),0,0,220,220)
CopyImage(#image,#image_original)
StopDrawing()
Endif
Repeat
Event =WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
If EventGadget() =#canvas
If EventType() = #PB_EventType_LeftButtonDown Or (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(#Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
If StartDrawing(CanvasOutput(#Canvas))
x = GetGadgetAttribute(#canvas, #PB_Canvas_MouseX)
y = GetGadgetAttribute(#canvas, #PB_Canvas_MouseY)
StopDrawing()
EndIf
EndIf
Endif
Case #PB_Event_SizeWindow
CopyImage(#image_original,#image)
ResizeGadget(#canvas,#PB_Ignore,#PB_Ignore,WindowWidth(#win),WindowHeight(#win))
ResizeImage(#image,GadgetWidth(#canvas),GadgetHeight(#canvas))
If StartDrawing(CanvasOutput(#Canvas))
DrawImage(ImageId(#image),0,0)
StopDrawing()
Endif
Endselect
Until Event = #PB_Event_CloseWindow
EndIf
;
; Epb
Re: Canvas Redimensionement?
Ma réflexion sur Step, c'était juste pour vous faire part de mon étonnement de débutant.
Avant de poser une question, je parcourt les sujets existants et il y a des dizaines de réponse sur Step avec Step 0, avant de vous déranger.
Bon c'était histoire de discuter avant de poser ma question, milles excuses...
Le titre de mon sujet, c'est Canvas Redimensionnement.
Merci Zorro, ton code fonctionne avec un Canvas dans une fenêtre:
ResizeGadget(#canvas,#PB_Ignore,#PB_Ignore,WindowWidth(#win),WindowHeight(#win))
Je voudrais le redimensionner dans un ScrollAreaGadget.
Si je renseigne les dimensions du Canvas en dure, tout est parfait, les Scrollbars le défilent en horizontale et verticale avec ajustement impeccable.
Si je modifie les dimension du Canvas pour faire un Zoom, je reçoit le message d'erreur: Gadget non initialisé.
Je suis étonné car ce même Canvas fonctionne parfaitement outre mesures.
JM
Avant de poser une question, je parcourt les sujets existants et il y a des dizaines de réponse sur Step avec Step 0, avant de vous déranger.
Bon c'était histoire de discuter avant de poser ma question, milles excuses...
Le titre de mon sujet, c'est Canvas Redimensionnement.
Merci Zorro, ton code fonctionne avec un Canvas dans une fenêtre:
ResizeGadget(#canvas,#PB_Ignore,#PB_Ignore,WindowWidth(#win),WindowHeight(#win))
Je voudrais le redimensionner dans un ScrollAreaGadget.
Si je renseigne les dimensions du Canvas en dure, tout est parfait, les Scrollbars le défilent en horizontale et verticale avec ajustement impeccable.
Si je modifie les dimension du Canvas pour faire un Zoom, je reçoit le message d'erreur: Gadget non initialisé.
Je suis étonné car ce même Canvas fonctionne parfaitement outre mesures.
JM
Re: Canvas Redimensionement?
ton erreur proviens surement de làJeanmarc a écrit :
Si je modifie les dimension du Canvas pour faire un Zoom, je reçoit le message d'erreur: Gadget non initialisé.
Je suis étonné car ce même Canvas fonctionne parfaitement outre mesures.
JM

pour faire un zoom , on ne redimensionne pas l'ecran !
mais ce qu'il contient !
une image affichée dans un ecran ou un canvas ou un imageGadget , bref dans ce que tu veux
pour qu'elle soit zoomée, il faut agir sur l'image ! pas sur le contenant ...
lorsque tu fais avec windows un zoom des caracteres de ton navigateur (touche [Control] + [+] )
ce n'est pas la fenetre du navigateur qui augmente, c'est seulement la fonte a l'interieur de la page Html
bref , ne touche pas a la taille de ton Ecran/Canvas/fenetre , seulement a son contenu !
et du coup l'area Gadget va s'auto-adapter au nouveau contenu ...
mon exemple montre un zoom (redimensionnement ) de l'image lorsque tu agrandis la fenetre
bon pour le coup j'ai aussi agrandi le canvas , histoire de continuer a voir toute l'image
mais si c'est un zoom que tu veux, alors seul l'agrandissement de l'image suffit !
Re: Canvas Redimensionement?
Merci zoro,
Je suis bien d'accord avec ta réponse.
En fait j'ai trouvé, je surdimensionne le Canvas à 10000 pixels et c'est la valeur de #PB_ScrollArea_InnerWidth/Height qui détermine la surface du Canvas qui sera affichée et scrollée.
Les dimension du Canvas n'ont pas d'importances, si elles sont supérieures au dessin effectué
Je ne comprends pas l'erreur signalée, mais ce n'est pas grave, car je ne redimensionne plus Canvas.
Bon dimanche,
JM
Je suis bien d'accord avec ta réponse.
En fait j'ai trouvé, je surdimensionne le Canvas à 10000 pixels et c'est la valeur de #PB_ScrollArea_InnerWidth/Height qui détermine la surface du Canvas qui sera affichée et scrollée.
Les dimension du Canvas n'ont pas d'importances, si elles sont supérieures au dessin effectué
Je ne comprends pas l'erreur signalée, mais ce n'est pas grave, car je ne redimensionne plus Canvas.
Bon dimanche,
JM
- microdevweb
- Messages : 1802
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
Re: Canvas Redimensionement?
Bonjour Jean-marc,
Fenêtre avec un canvas redimensionnable et grille de placement, testes en maximisant et en réduisant la fenêtre
- Oui on peux redimensionné un canvas (mais en dehors de la procédure de dessin)
- Il vaut mieux redessiné le canvas après redimensionnement
- Le step (pas) n'accepte pas de variable, mais dans le code si dessous je te montre comment paré à ce problème
Fenêtre avec un canvas redimensionnable et grille de placement, testes en maximisant et en réduisant la fenêtre
Code : Tout sélectionner
Global GridSpae=10
Global GriColor=$247FFF
Global BgColor=$B5E4FF
#MainForm=0
#MainCanvas=0
Declare DrawGrid()
Procedure Exit()
End
EndProcedure
Procedure ResizeEvent()
ResizeGadget(#MainCanvas,#PB_Ignore,#PB_Ignore,WindowWidth(#MainForm)-20,WindowHeight(#MainForm)-20)
DrawGrid()
EndProcedure
Procedure DrawGrid()
Protected X,Y
StartDrawing(CanvasOutput(#MainCanvas))
; Couleur de fond
Box(0,0,GadgetWidth(#MainCanvas),GadgetHeight(#MainCanvas),BgColor)
; Ici step 0 Car step n'accepte pas de variable
For X=GridSpae To GadgetWidth(#MainCanvas)-GridSpae Step 0
For Y=GridSpae To GadgetHeight(#MainCanvas)-GridSpae Step 0
Plot(X,Y,GriColor)
Y+GridSpae ; Remplace le Step
Next
X+GridSpae ; Remplace le Step
Next
StopDrawing()
EndProcedure
Procedure OpenMainForm()
; Détermine le style de fenêtre
Protected Flag=#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget
Flag|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget
OpenWindow(#MainForm,0,0,800,600,"Teste",Flag)
CanvasGadget(#MainCanvas,10,10,WindowWidth(#MainForm)-20,WindowHeight(#MainForm)-20)
; Dessin de la grille
DrawGrid()
; Mise en place des callback
BindEvent(#PB_Event_CloseWindow,@Exit())
BindEvent(#PB_Event_SizeWindow,@ResizeEvent())
EndProcedure
OpenMainForm()
Repeat:WaitWindowEvent():ForEver
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège
Re: Canvas Redimensionement?
D'accord microdevweb,
Mais le Canvas à redimensionné n'était pas dans la phase dessin.
Je croyais que le Canvas devait avoir la taille de mon graphique d'où mon souhait de le redimensionner.
En fait c'est la taille du graphique qui détermine la zone interne de ScrollAreaGadget et non le Canvas que j'ai surdimensionné pour qu'il accepte toutes futures modifications.
Ton code m'apprend des choses sur BindEvent(), c'est très intéressant.
Bon, j'ai posté un nouveau sujet...
Bon dimanche,
JM
Mais le Canvas à redimensionné n'était pas dans la phase dessin.
Je croyais que le Canvas devait avoir la taille de mon graphique d'où mon souhait de le redimensionner.
En fait c'est la taille du graphique qui détermine la zone interne de ScrollAreaGadget et non le Canvas que j'ai surdimensionné pour qu'il accepte toutes futures modifications.
Ton code m'apprend des choses sur BindEvent(), c'est très intéressant.
Bon, j'ai posté un nouveau sujet...
Bon dimanche,
JM
- microdevweb
- Messages : 1802
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
Re: Canvas Redimensionement?
Bonjour jeanmarc,
Voici un exemple avec redimensionnement de canvas, bouges le carré rose
Voici un exemple avec redimensionnement de canvas, bouges le carré rose
Code : Tout sélectionner
Global GridSpae=10
Global GriColor=$247FFF
Global BgColor=$B5E4FF
Global gMouseX,gMouseY,OldX,OldY
Global HoverBox.b=#False
#MainForm=0
#MainArea=0
#MainCanvas=1
; Une structure pour la position de la boîte
Structure Pos
X.i
Y.i
W.i
H.i
EndStructure
; Une boîte
Global myBox.Pos,OldBox.Pos
#BoxColor=$7610CD
Declare DrawCanvas()
Procedure Exit()
End
EndProcedure
Procedure ResizeEvent()
ResizeGadget(#MainCanvas,#PB_Ignore,#PB_Ignore,WindowWidth(#MainForm)-20,WindowHeight(#MainForm)-20)
DrawCanvas()
EndProcedure
Procedure WhereIsMouse()
HoverBox=#False
; Regarde si on est sur la boite
With myBox
If (gMouseX>=\X And gMouseX<=(\X+\W)) And (gMouseY>\Y And gMouseY<=(\Y+\H))
SetGadgetAttribute(#MainCanvas,#PB_Canvas_Cursor,#PB_Cursor_Arrows)
HoverBox=#True
ProcedureReturn #True
EndIf
EndWith
ProcedureReturn #False
EndProcedure
Procedure CanvasEvent()
gMouseX=GetGadgetAttribute(#MainCanvas,#PB_Canvas_MouseX)
gMouseY=GetGadgetAttribute(#MainCanvas,#PB_Canvas_MouseY)
Protected DepX,DepY
Static ClicOn.b=#False
Select EventType()
Case #PB_EventType_MouseMove
If Not ClicOn
If WhereIsMouse()
ProcedureReturn
EndIf
Else
If HoverBox
DepX=gMouseX-OldX
DepY=gMouseY-OldY
myBox\X=OldBox\X+DepX
myBox\Y=OldBox\Y+DepY
DrawCanvas()
SetGadgetAttribute(#MainCanvas,#PB_Canvas_Cursor,#PB_Cursor_Arrows)
ProcedureReturn
EndIf
EndIf
Case #PB_EventType_LeftButtonDown
If HoverBox And Not ClicOn
; Copie de l'ancienne position si clique sur la boite
CopyStructure(@myBox,@OldBox,Pos)
; Copie la position de la souris
OldX=gMouseX
OldY=gMouseY
EndIf
ClicOn=#True
Case #PB_EventType_LeftButtonUp
ClicOn=#False
If HoverBox
; Redimentionne le canvas si nécessaire
If (myBox\X+myBox\W)>GadgetWidth(#MainCanvas)
ResizeGadget(#MainCanvas,#PB_Ignore,#PB_Ignore,(myBox\X+myBox\W)+20,#PB_Ignore)
Else
ResizeGadget(#MainCanvas,#PB_Ignore,#PB_Ignore,GadgetWidth(#MainArea),#PB_Ignore)
EndIf
SetGadgetAttribute(#MainArea,#PB_ScrollArea_InnerWidth,GadgetWidth(#MainCanvas))
If (myBox\Y+myBox\H)>GadgetHeight(#MainCanvas)
ResizeGadget(#MainCanvas,#PB_Ignore,#PB_Ignore,#PB_Ignore,(myBox\Y+myBox\H)+20)
Else
ResizeGadget(#MainCanvas,#PB_Ignore,#PB_Ignore,#PB_Ignore,GadgetHeight(#MainArea))
EndIf
SetGadgetAttribute(#MainArea,#PB_ScrollArea_InnerHeight,GadgetHeight(#MainCanvas)+20)
EndIf
DrawCanvas()
EndSelect
SetGadgetAttribute(#MainCanvas,#PB_Canvas_Cursor,#PB_Cursor_Default)
EndProcedure
Procedure DrawGrid()
Protected X,Y
; Couleur de fond
Box(0,0,GadgetWidth(#MainCanvas),GadgetHeight(#MainCanvas),BgColor)
; Ici step 0 Car step n'accepte pas de variable
For X=GridSpae To GadgetWidth(#MainCanvas)-GridSpae Step 0
For Y=GridSpae To GadgetHeight(#MainCanvas)-GridSpae Step 0
Plot(X,Y,GriColor)
Y+GridSpae ; Remplace le Step
Next
X+GridSpae ; Remplace le Step
Next
EndProcedure
Procedure DrawBox()
With myBox
Box(\X,\Y,\W,\H,#BoxColor)
EndWith
EndProcedure
Procedure DrawCanvas()
StartDrawing(CanvasOutput(#MainCanvas))
DrawGrid()
DrawBox()
StopDrawing()
EndProcedure
Procedure OpenMainForm()
; Détermine le style de fenêtre
Protected Flag=#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget
Flag|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget
OpenWindow(#MainForm,0,0,800,600,"Teste",Flag)
; Zone de dessin
ScrollAreaGadget(#MainArea,10,10,WindowWidth(#MainForm)-20,WindowHeight(#MainForm)-20,WindowWidth(#MainForm)-20,WindowHeight(#MainForm)-20)
CanvasGadget(#MainCanvas,0,0,GadgetWidth(#MainArea),GadgetHeight(#MainArea))
; Dimentionne la boite
With myBox
\X=50
\Y=50
\W=200
\H=200
EndWith
; Dessin du canvas
DrawCanvas()
CloseGadgetList()
; Mise en place des callback
BindEvent(#PB_Event_CloseWindow,@Exit())
BindEvent(#PB_Event_SizeWindow,@ResizeEvent())
BindGadgetEvent(#MainCanvas,@CanvasEvent())
EndProcedure
OpenMainForm()
Repeat:WaitWindowEvent():ForEver
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège