Page 1 sur 2

Canvas Redimensionement?

Publié : sam. 18/juin/2016 12:06
par Jeanmarc
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

Re: Canvas Redimensionement?

Publié : sam. 18/juin/2016 12:59
par Zorro
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
va afficher la sequence de 1 a 10

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

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?

Publié : sam. 18/juin/2016 13:04
par TazNormand
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 :

Code : Tout sélectionner

For i=1 to 10
	Debug i
Next i
; Epb
va afficher la sequence de 1 a 10

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

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.

Re: Canvas Redimensionement?

Publié : sam. 18/juin/2016 13:09
par Zorro
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

Re: Canvas Redimensionement?

Publié : sam. 18/juin/2016 13:41
par Zorro
bon je viens de Dowloader un emulateur ZX81
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
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 !! :roll:

Image

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

Re: Canvas Redimensionement?

Publié : sam. 18/juin/2016 13:56
par Jeanmarc
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

Re: Canvas Redimensionement?

Publié : sam. 18/juin/2016 13:59
par cage
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.

Code : Tout sélectionner

  For k = 10 To 1 Step -1
    Debug k
  Next

Re: Canvas Redimensionement?

Publié : sam. 18/juin/2016 14:00
par falsam
Jeanmarc a écrit :Mon problème c'est la possibilité de redimensionner Canvas avec ResizeGadget.
Ton canvas c'est un gadget personnalisé ?

@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à
:arrow: http://www.purebasic.fr/french/viewtopi ... =4&t=15997

Re: Canvas Redimensionement?

Publié : sam. 18/juin/2016 14:14
par Zorro
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
avec une reflexion du genre t'es pas loin de plonger dans mon tiroir ....
c'est quand meme toi qui en parle du Step ... a la base Image

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

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?

Publié : sam. 18/juin/2016 15:50
par Jeanmarc
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

Re: Canvas Redimensionement?

Publié : sam. 18/juin/2016 16:50
par Zorro
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
ton erreur proviens surement de là ;)
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?

Publié : sam. 18/juin/2016 17:14
par Jeanmarc
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

Re: Canvas Redimensionement?

Publié : sam. 18/juin/2016 17:59
par microdevweb
Bonjour Jean-marc,
  • 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
Exemple:

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


Re: Canvas Redimensionement?

Publié : sam. 18/juin/2016 18:58
par Jeanmarc
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

Re: Canvas Redimensionement?

Publié : lun. 20/juin/2016 11:07
par microdevweb
Bonjour jeanmarc,

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