Page 1 sur 2

[Résolu]Auto-Resize ou redimensionnement fenetre

Publié : lun. 06/août/2012 10:26
par micam
Bonjour,
Je voudrai redimensionner automatiquement un gadget avec le redimensionnement de la fenêtre, mais le résultat n'est pas fluide.
Dans le code ci-joint on voit dans le debugger que les dimensions du webgadget augmentent et diminuent un coup sur deux.
Si quelqu'un a une idée?
Merci de votre aide.

Code : Tout sélectionner

;{- Enumerations / DataSections
;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
  #Web_0
EndEnumeration
;}
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
;}
Global window, gadget, gadget_X, gadget_Y, gadget_W, gadget_H



Procedure redimenssionne(window, gadget)
  window = SetActiveGadget(window)
  gadget_X = GadgetX(gadget)
  gadget_Y = GadgetY(gadget)
  gadget_w = WindowWidth(gadget)-GadgetWidth(gadget)
  gadget_H = WindowHeight(gadget)-GadgetHeight(gadget)
  ResizeGadget(gadget, gadget_X, gadget_Y, gadget_W, gadget_H)
EndProcedure


Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 450, 200, 400, 400, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    WebGadget(#Web_0, 20, 20, 200, 200, "about:WebGadget_0")
  EndIf
EndProcedure


OpenWindow_Window_0()

;{- Event loop
Repeat
  Event = WaitWindowEvent()
  Select Event
      ; ///////////////////
      
    Case #PB_Event_SizeWindow
      redimenssionne(#Window_0,#Web_0)
      Debug "Largeur =   " + Str(gadget_W) + "    Hauteur =   " + Str(gadget_H)
      
      
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #Web_0
      EndIf
      ; ////////////////////////
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
ForEver
;
;}

Re: Auto-Resize ou redimensionnement fenetre

Publié : lun. 06/août/2012 10:37
par jbernard13
Salut

tu as la libs de gnozal Pureresize qui facile a utiliser


http://gnozal.ucoz.com/

Re: Auto-Resize ou redimensionnement fenetre

Publié : lun. 06/août/2012 12:09
par Ar-S
faits une recherche du coté des callback, ça devrait aider. Sinon c'est vrai que la lib de Gnozal peut s'avérer utile.
N'as tu pas fait une erreur ici ?
gadget_w = WindowWidth(gadget)-GadgetWidth(gadget)
gadget_H = WindowHeight(gadget)-GadgetHeight(gadget

Re: Auto-Resize ou redimensionnement fenetre

Publié : lun. 06/août/2012 12:33
par falsam
Bonjour. Dans ta méthode, Je pense que tu dois tenir compte de la largeur entre le bord droit de ton webgadget et le bord droit de la fenêtre. Cette largeur étant toujours fixe. Cette remarque s'applique aussi entre le bord bas du webgadget et le bas de ta fenêtre.

Code : Tout sélectionner

;{- Enumerations / DataSections
;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
  #Web_0
EndEnumeration
;}
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
;}
Global window, gadget, gadget_X, gadget_Y, gadget_W, gadget_H, Delta_W, Delta_H



Procedure redimenssionne(window, gadget)
  ;window = SetActiveGadget(window)
  gadget_X = GadgetX(gadget) ;#Pb_Ignore c'est aussi bien
  gadget_Y = GadgetY(gadget) ;#Pb_Ignore c'est aussi bien
  gadget_w = WindowWidth(Window)-Delta_W
  gadget_H = WindowHeight(Window)-Delta_H
  
  ;Largeur et hauteur minimum
  If gadget_w < 60
    gadget_w=60
  EndIf

  If gadget_h < 60
    gadget_h=60
  EndIf
  
  ResizeGadget(gadget, gadget_X, gadget_Y, gadget_W, gadget_H)
  
EndProcedure


Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 450, 200, 400, 400, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    WebGadget(#Web_0, 20, 20, 200, 200, "about:WebGadget_0")
  EndIf
EndProcedure


OpenWindow_Window_0()
;Calcul du Delta entre le bord droit du Web Gadget et le bord droit de la fenetre
Delta_W=WindowWidth(#Window_0)-GadgetX(#Web_0)-GadgetWidth(#Web_0)
Delta_H=WindowHeight(#Window_0)-GadgetY(#Web_0)-GadgetHeight(#Web_0)

;{- Event loop
Repeat
  Event = WaitWindowEvent()
  EventWindow = EventWindow()
  EventGadget = EventGadget()
  EventType = EventType()

  Select Event
      ; ///////////////////
      
    Case #PB_Event_SizeWindow
      redimenssionne(#Window_0, #Web_0)
      Debug "Largeur =   " + Str(gadget_W) + "    Hauteur =   " + Str(gadget_H)
      
      
    Case #PB_Event_Gadget
      If EventGadget = #Web_0
      EndIf
      
      ; ////////////////////////
    Case #PB_Event_CloseWindow
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
ForEver
;
;}
On peut faire surement mieux :)

PS : J'ai tenu compte de la remarque d'Ar-s.

Re: Auto-Resize ou redimensionnement fenetre

Publié : lun. 06/août/2012 15:28
par micam
Bonjour Falsam,
ta solution marche très bien.
Une chose que je ne comprend pas :
Pourquoi as-tu mis le calcul du delta après OpenWindow() ?
OpenWindow_Window_0()
;Calcul du Delta entre le bord droit du Web Gadget et le bord droit de la fenetre
Delta_W=WindowWidth(#Window_0)-GadgetX(#Web_0)-GadgetWidth(#Web_0)
Delta_H=WindowHeight(#Window_0)-GadgetY(#Web_0)-GadgetHeight(#Web_0)
Merci.

Re: Auto-Resize ou redimensionnement fenetre

Publié : lun. 06/août/2012 15:35
par falsam
micam a écrit : Pourquoi as-tu mis le calcul du delta après OpenWindow() ?
OpenWindow_Window_0()
et pourquoi pas ? ...... Ce calcul peut très bien se faire au sein de ta procédure d'ouverture de la fenêtre.

Code : Tout sélectionner

Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 450, 200, 400, 400, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    WebGadget(#Web_0, 20, 20, 200, 200, "about:WebGadget_0")
  EndIf
  
  ;Calcul du Delta entre le bord droit du Web Gadget et le bord droit de la fenetre
  Delta_W=WindowWidth(#Window_0)-GadgetX(#Web_0)-GadgetWidth(#Web_0)
  Delta_H=WindowHeight(#Window_0)-GadgetY(#Web_0)-GadgetHeight(#Web_0)  
EndProcedure

Re: Auto-Resize ou redimensionnement fenetre

Publié : mar. 07/août/2012 7:06
par kernadec
bonjour
petit essai pour le fun :D

Cordialement

Code : Tout sélectionner

;{- Enumerations / DataSections
;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
  #Web_0
EndEnumeration
;}
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
;}

Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 450, 200, 400, 400, "Window_0", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    WebGadget(#Web_0, 20, 20,  WindowWidth(#Window_0)/2, WindowHeight(#Window_0)/2, "about:WebGadget_0")
  EndIf
EndProcedure


OpenWindow_Window_0()

;{- Event loop
Repeat
  Event = WaitWindowEvent()
  EventWindow = EventWindow()
  EventGadget = EventGadget()
  EventType = EventType()
  
  Select Event
      ; ///////////////////
      
    Case #PB_Event_SizeWindow
      ResizeGadget(#Web_0, #PB_Ignore, #PB_Ignore, WindowWidth(#Window_0)/2, WindowHeight(#Window_0)/2)
      
    Case #PB_Event_Gadget
      If EventGadget = #Web_0
      EndIf
      
      ; ////////////////////////
    Case #PB_Event_CloseWindow
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
ForEver
;
;}


Re: Auto-Resize ou redimensionnement fenetre

Publié : mar. 07/août/2012 7:15
par falsam
Bonjour Kernadec, tu as de la chance que #Web_0 soit le premier gadget:)

Re: Auto-Resize ou redimensionnement fenetre

Publié : mar. 07/août/2012 7:27
par kernadec
bonjour falsam bien vu :mrgreen:
Corrigé

Re: Auto-Resize ou redimensionnement fenetre

Publié : mar. 07/août/2012 7:36
par falsam

Code : Tout sélectionner

redimenssionne(window, gadget)
Je pense que Micam souhaitait une procédure pour redimensionner n'importe quel gadget et dans ce cas nos réponses ne sont pas tout à fait adéquates. (A part la solution de gnozal).

Re: Auto-Resize ou redimensionnement fenetre

Publié : mar. 07/août/2012 7:51
par kernadec
falsam
Je pense que Micam souhaitait une procédure pour redimensionner n'importe quel gadget et dans ce cas nos réponses ne sont pas tout à fait adéquates. (A part la solution de Gnozal).
C' est pas faux :D

pour ma part je n'utilise la lib de Gnozal que pour beaucoup de gadgets,
sinon pour moins de 10 je fais comme ça. :)

pour compléter :

Code : Tout sélectionner

ResizeGadget(#Web_0, WindowWidth(#Window_0)/20, WindowHeight(#Window_0)/20, WindowWidth(#Window_0)/2, WindowHeight(#Window_0)/2)
Cordialement

Re: Auto-Resize ou redimensionnement fenetre

Publié : mar. 07/août/2012 8:15
par Micoute
Je pense pour ma part, qu'il serait plus judicieux d'utiliser les layouts, il y a d'ailleurs un tuto à ce sujet.
Je crois qu'un avis de plus, ne peut pas faire de mal.

Re: Auto-Resize ou redimensionnement fenetre

Publié : jeu. 09/août/2012 22:20
par micam
Bonjour à tous, et merci pour vos commentaires.
Comme le disait justement jbernard13 plus haut, je pourrai utiliser la lib de gnozal, Pureresize.
Je n'essaie pas de réinventer la roue, mais comme tout débutant je fais quelques tests pour essayer de comprendre.
Comme l'a compris falsam "Je pense que Micam souhaitait une procédure pour redimensionner n'importe quel gadget"
c'est exactement ce que j'aimerai faire (redimenssionner un gadget ou repositionner, exemple un bouton, en bas à droite lors de l'agrandissement de la fenêtre).

Ma première question à falsam
"Pourquoi as-tu mis le calcul du delta après OpenWindow_Window_0()?" a été mal posée.
Je me demandai s'il est possible de mettre tous les paramètres dans la procédure "redimenssionne()" afin de n'utiliser qu'une ligne dans l'appel de "Case #PB_Event_SizeWindow" et rien de plus dans "Procedure OpenWindow_Window_0()".
Ci-dessous, ce que j'aimerai, mais qui ne marche pas :

Code : Tout sélectionner

Procedure redimenssionne(window, gadget)
  ;window = SetActiveGadget(window)
  gadget_X = GadgetX(gadget) ;#Pb_Ignore c'est aussi bien
  gadget_Y = GadgetY(gadget) ;#Pb_Ignore c'est aussi bien
  ;Calcul du Delta entre le bord droit du Web Gadget et le bord droit de la fenetre
  Delta_W=WindowWidth(#Window_0)-GadgetX(#Web_0)-GadgetWidth(#Web_0)
  Delta_H=WindowHeight(#Window_0)-GadgetY(#Web_0)-GadgetHeight(#Web_0)
  gadget_w = WindowWidth(Window)-Delta_W
  gadget_H = WindowHeight(Window)-Delta_H
  
  ;Largeur et hauteur minimum
  If gadget_w < 60
    gadget_w=60
  EndIf
  If gadget_h < 60
    gadget_h=60
  EndIf
  
  ResizeGadget(gadget, gadget_X, gadget_Y, gadget_W, gadget_H)
EndProcedure
J'espère avoir été un peu plus clair cette fois.
Merci encore de votre aide.

Re: Auto-Resize ou redimensionnement fenetre

Publié : jeu. 09/août/2012 23:43
par Ar-S
Y'a qu'a tester..

Code : Tout sélectionner

Procedure redimenssionne(window, gadget)
  ;Calcul du Delta entre le bord droit du Web Gadget et le bord droit de la fenetre 
	Delta_W=WindowWidth(#Window_0)-GadgetX(#Web_0)-GadgetWidth(#Web_0) 
	Delta_H=WindowHeight(#Window_0)-GadgetY(#Web_0)-GadgetHeight(#Web_0)   
  
	;window = SetActiveGadget(window)
	gadget_X = GadgetX(gadget) ;#Pb_Ignore c'est aussi bien
	gadget_Y = GadgetY(gadget) ;#Pb_Ignore c'est aussi bien
	;Calcul du Delta entre le bord droit du Web Gadget et le bord droit de la fenetre
	Delta_W=WindowWidth(#Window_0)-GadgetX(#Web_0)-GadgetWidth(#Web_0)
	Delta_H=WindowHeight(#Window_0)-GadgetY(#Web_0)-GadgetHeight(#Web_0)
	gadget_W = WindowWidth(window)-Delta_W
	gadget_H = WindowHeight(window)-Delta_H
	
	;Largeur et hauteur minimum
	If gadget_W < 60
		gadget_W=60
  EndIf
	If gadget_H < 60
		gadget_H=60
  EndIf
	
	ResizeGadget(gadget, gadget_X, gadget_Y, gadget_W, gadget_H)
EndProcedure


Re: Auto-Resize ou redimensionnement fenetre

Publié : ven. 10/août/2012 6:24
par micam
Bonjour,

Les valeurs de Delta_W et Delta_H doivent être une valeur fixe.
Si je les déclarent dans "Procedure OpenWindow_Window_0()" pas de problème.
Mais si je les déclarent dans ma procédure "Procedure redimenssionne(window, gadget)",
ça ne marche pas, et c'est normal, car la valeur change à chaque redimensionnement de la fenêtre.
L'idéal serai 2 constantes :
#Delta_W = WindowWidth(window)-GadgetX(gadget)-GadgetWidth(gadget)
et
#Delta_H = WindowHeight(window)-GadgetY(gadget)-GadgetHeight(gadget)
mais on ne peut pas créer une constante avec une valeur de variable.
La question reste posée.
Merci.