PureBasic

Forums PureBasic
Nous sommes le Jeu 09/Juil/2020 18:18

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 18 messages ]  Aller à la page Précédente  1, 2
Auteur Message
 Sujet du message: Re: Redimensionnement automatique des gadgets
MessagePosté: Lun 03/Juin/2019 12:45 
Hors ligne

Inscription: Mer 04/Nov/2015 17:39
Messages: 1134
Très bon se truc, merci !
Je t'encourage à l’améliorer, plus de gadget et se qu'on dit les copain, très bon !

_________________
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Redimensionnement automatique des gadgets
MessagePosté: Lun 25/Mai/2020 16:49 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 10/Mar/2013 22:22
Messages: 150
Localisation: France
Coucou ! (Et un petit déterrage pour bien commencer la semaine)

J'ai apporté quelques modifications au code du premier message :
- mise sous forme de module
- changement du nom de certaines variable pour rendre le tout (je l'espère) plus compréhensible
- modification de la logique de fonctionnement pour avoir plus de possibilités (comme garder un élément centré)
- modification de l'exemple pour montrer un apperçu des nouvelles possibilités.
- modification de l'exemple pour montrer que WindowBounds() fonctionne correctement.

Fichier "GadgetR.pbi" :
Code:
EnableExplicit

;############################################################################################################################
;                  Redimensionnement automatique des gadgets - pf shadoko - 2016
;                   Mise sous forme de module et améliorations - Naheulf - 2020

;  Code original :
;      https://www.purebasic.fr/french/viewtopic.php?f=6&t=16201

;  Fonctionnement:
;      Les instructions OpenWindow, ButtonGadget, TextGadget, ..., CloseGadgetList
;      doivent etre utilisées avec le suffixe 'R'
;
;      Les 4 paramètres suplémentaires indiquent le ratio d'adaptation aux variation de taille du parent:
;        - rdx : 0 -> Pas de déplacement horizontal ; 1 -> Reste collé au bord droit
;        - rdw : 0 -> Largeur fixe                  ; 1 -> S'étire à volonté
;        - rdy : 0 -> Pas de déplacement vertical   ; 1 -> Reste collé au bord bas
;        - rdh : 0 -> Hauteur fixe                  ; 1 -> S'étire à volonté
;      Note :

;  Équivalence avec les paramètres de la version originale :
;      rx,ry = 0 -> rdx,rdy = 0 ; rdw,rdh = 0
;      rx,ry = 1 -> rdx,rdy = 1 ; rdw,rdh = 0
;      rx,ry = 2 -> rdx,rdy = 0 ; rdw,rdh = 1
;      rx,ry = 3 -> rdx,rdy = position/tailleDuParent ; rdw,rdh = taille/tailleDuParent
;      rx,ry = 4 -> rdx,rdy = 0 ; rdw,rdh = (position+taille)/tailleDuParent
;      rx,ry = 5 -> rdx,rdy = position/tailleDuParent ; rdw,rdh = 1 - (position/tailleDuParent)
;
;  Signification des 2 paramètres suplémentaires utilisés dans la version originale.
;      rx et ry correspondent au type de redimensionnement:
;      rx/ry = 0 : pas de modification
;      rx/ry = 1 : modification de la position x/y
;      rx/ry = 2 : modification de la largeur/hauteur
;      rx/ry = 3 : positionnement proportionnel
;      rx/ry = 4 : positionnement proportionnel coté droit
;      rx/ry = 5 : positionnement proportionnel coté gauche
;
;############################################################################################################################


DeclareModule GadgetR
   
   ;--------------------------------- gadgets
   Declare ButtonGadgetR     (Gadget,X,Y,Width,Height,Text$,  Flags=#False,rdx.f=0,rdw.f=0,rdy.f=0,rdh.f=0)
   Declare TextGadgetR       (Gadget,X,Y,Width,Height,Text$,  Flags=#False,rdx.f=0,rdw.f=0,rdy.f=0,rdh.f=0)
   Declare CheckBoxGadgetR   (Gadget,X,Y,Width,Height,Text$,  Flags=#False,rdx.f=0,rdw.f=0,rdy.f=0,rdh.f=0)
   Declare StringGadgetR     (Gadget,X,Y,Width,Height,Text$,  Flags=#False,rdx.f=0,rdw.f=0,rdy.f=0,rdh.f=0)
   Declare EditorGadgetR     (Gadget,X,Y,Width,Height,        Flags=#False,rdx.f=0,rdw.f=0,rdy.f=0,rdh.f=0)
   Declare ButtonImageGadgetR(Gadget,X,Y,Width,Height,imageID,Flags=#False,rdx.f=0,rdw.f=0,rdy.f=0,rdh.f=0)
   
   ;--------------------------------- containers
   Declare ContainerGadgetR  (Gadget,X,Y,Width,Height,        Flags=#False,rdx.f=0,rdw.f=0,rdy.f=0,rdh.f=0)
   Declare PanelGadgetR      (Gadget,X,Y,Width,Height,                     rdx.f=0,rdw.f=0,rdy.f=0,rdh.f=0)
   Declare ScrollAreaGadgetR (Gadget,X,Y,Width,Height,
                              scrolldx,scrolldy,scrollstep,   Flags=#False,rdx.f=0,rdw.f=0,rdy.f=0,rdh.f=0)
   
   ;--------------------------------- window
   Declare OpenWindowR(n,x,y,dx,dy,txt.s,f=#PB_Window_SystemMenu,pid=0)
   
   ;---------------------------------
   Declare CloseGadgetListR()
EndDeclareModule ; GadgetR

Module GadgetR
   EnableExplicit
   
   Structure GadgetInfo
      id.i          ; gadgetID
      Map Glist.s() ; liste des gadgets contenus (pour les containers)
      x.w : y.w     ; position d'origine
      w.w : h.w     ; dimensions d'origine
      rdx.f : rdy.f ; contributions des positions lors des redimmentionnements
      rdw.f : rdh.f ; contributions dimentions lors des redimmentionnements
   EndStructure
   
   Global Dim GadgetCont.s(256), GadgetConti
   Global NewMap GadgetList.GadgetInfo()
   
   Procedure Redimensioner(c, nx.w, ny.w, ndw.w, ndh.w, type$="G")
      Protected.GadgetInfo gi, o
      Protected.w dw,dh, nw, nh
      If type$="G":ResizeGadget(c,nx, ny, ndw, ndh):EndIf
      gi=GadgetList(type$+Str(c))
      dw = ndw-gi\w
      dh = ndh-gi\h
      ForEach gi\Glist() : o=GadgetList(gi\Glist())
         If (o\rdx Or o\rdw Or o\rdy Or o\rdh)
            nx = o\x + o\rdx * dw
            nw = o\w + o\rdw * dw
            ny = o\y + o\rdy * dh
            nh = o\h + o\rdh * dh
            Redimensioner (o\id, nx, ny, nw, nh)
         EndIf
      Next
      
   EndProcedure
   
   Procedure _GadgetInfo(na, id, x.w,y.w,w.w,h.w, rdx.f,rdw.f,rdy.f,rdh.f, iscontainer=0)
      Protected gadget.GadgetInfo, tg$
      
      If id=#PB_Any : gadget\id=na : Else : gadget\id=id : EndIf
      gadget\x=x     : gadget\y=y
      gadget\w=w     : gadget\h=h
      gadget\rdx=rdx : gadget\rdy=rdy
      gadget\rdw=rdw : gadget\rdh=rdh
      
      If iscontainer=-1
         tg$="W"+Str(gadget\id)
         GadgetConti=0
      Else
         tg$="G"+Str(gadget\id)
         GadgetList(GadgetCont(GadgetConti))\Glist(tg$)=tg$
      EndIf
      GadgetList(tg$)=gadget
      If iscontainer
         GadgetConti+1
         GadgetCont(GadgetConti)=tg$
      EndIf
      ProcedureReturn gadget\id
   EndProcedure
   
   
   ;--------------------------------- gadgets
   Procedure ButtonGadgetR(Gadget,X,Y,Width,Height,Text$,Flags=#False,rdx.f=0,rdw.f=0,rdy.f=0,rdh.f=0)
      Protected na=ButtonGadget(Gadget,X,Y,Width,Height,Text$,Flags)
      ProcedureReturn _GadgetInfo(na,Gadget,X,Y,Width,Height,rdx,rdw,rdy,rdh)
   EndProcedure
   
   Procedure TextGadgetR(Gadget,X,Y,Width,Height,Text$,Flags=#False,rdx.f=0,rdw.f=0,rdy.f=0,rdh.f=0)
      Protected na=TextGadget(Gadget,X,Y,Width,Height,Text$,Flags)
      ProcedureReturn _GadgetInfo(na,Gadget,X,Y,Width,Height,rdx,rdw,rdy,rdh)
   EndProcedure
   
   Procedure CheckBoxGadgetR(Gadget,X,Y,Width,Height,Text$,Flags=#False,rdx.f=0,rdw.f=0,rdy.f=0,rdh.f=0)
      Protected na=CheckBoxGadget(Gadget,X,Y,Width,Height,Text$,Flags)
      ProcedureReturn _GadgetInfo(na,Gadget,X,Y,Width,Height,rdx,rdw,rdy,rdh)
   EndProcedure
   
   Procedure StringGadgetR(Gadget,X,Y,Width,Height,Text$,Flags=#False,rdx.f=0,rdw.f=0,rdy.f=0,rdh.f=0)
      Protected na=StringGadget(Gadget,X,Y,Width,Height,Text$,Flags)
      ProcedureReturn _GadgetInfo(na,Gadget,X,Y,Width,Height,rdx,rdw,rdy,rdh)
   EndProcedure
   
   Procedure EditorGadgetR(Gadget,X,Y,Width,Height,Flags=#False,rdx.f=0,rdw.f=0,rdy.f=0,rdh.f=0)
      Protected na=EditorGadget(Gadget,X,Y,Width,Height,Flags)
      ProcedureReturn _GadgetInfo(na,Gadget,X,Y,Width,Height,rdx,rdw,rdy,rdh)
   EndProcedure
   
   Procedure ButtonImageGadgetR(Gadget,X,Y,Width,Height,imageID,Flags=#False,rdx.f=0,rdw.f=0,rdy.f=0,rdh.f=0)
      Protected na=ButtonImageGadget(Gadget,X,Y,Width,Height,imageID,Flags)
      ProcedureReturn _GadgetInfo(na,Gadget,X,Y,Width,Height,rdx,rdw,rdy,rdh)
   EndProcedure
   
   ;--------------------------------- containers
   Procedure ContainerGadgetR(Gadget,X,Y,Width,Height,Flags=#False,rdx.f=0,rdw.f=0,rdy.f=0,rdh.f=0)
      Protected na=ContainerGadget(Gadget,X,Y,Width,Height,Flags)
      ProcedureReturn _GadgetInfo(na,Gadget,X,Y,Width,Height,rdx,rdw,rdy,rdh, 1)
   EndProcedure
   
   Procedure PanelGadgetR(Gadget,X,Y,Width,Height,rdx.f=0,rdw.f=0,rdy.f=0,rdh.f=0)
      Protected na=PanelGadget(Gadget,X,Y,Width,Height)
      ProcedureReturn _GadgetInfo(na,Gadget,X,Y,Width,Height,rdx,rdw,rdy,rdh, 1)
   EndProcedure
   
   Procedure ScrollAreaGadgetR(Gadget,X,Y,Width,Height,scrolldx,scrolldy,scrollstep,Flags=#False,rdx.f=0,rdw.f=0,rdy.f=0,rdh.f=0)
      Protected na=ScrollAreaGadget(Gadget,X,Y,Width,Height,scrolldx,scrolldy,scrollstep,Flags)
      ProcedureReturn _GadgetInfo(na,Gadget,X,Y,Width,Height,rdx,rdw,rdy,rdh, 1)
   EndProcedure
   
   ;--------------------------------- window
   Procedure _WindowResizeEvent()
      Protected n=EventWindow()
      Redimensioner(n,0,0,WindowWidth(n), WindowHeight(n),"W")
   EndProcedure
   
   Procedure OpenWindowR(Window,X,Y,Width,Height,Title$,Flags=#PB_Window_SystemMenu,ParentID=0)
      Protected na=OpenWindow(Window,X,Y,Width,Height,Title$,Flags,ParentID)
      Protected nw=_GadgetInfo(na,Window,X,Y,Width,Height,0,1,0,1, -1)
      BindEvent(#PB_Event_SizeWindow,@_WindowResizeEvent(), nw)
      ProcedureReturn nw
   EndProcedure
   
   ;---------------------------------
   Procedure CloseGadgetListR()
      CloseGadgetList()
      GadgetConti-1
   EndProcedure
   
EndModule ; GadgetR


Exemple légèrement modifié pour s'adapter au nouveau fonctionnement et montrer un apercu des nouvelles possibilités :
Code:
XIncludeFile "GadgetR.pbi"

;############################################################################################################################
;                                                 Exemple
;############################################################################################################################

UseModule GadgetR

CreateImage(0,200,60):StartDrawing(ImageOutput(0)):Define i:For i=0 To 200:Circle(100,30,200-i,(i+50)*$010101):Next:StopDrawing()

;OpenWindowr(0, 0, 0,512, 200, "Resize gadget", #PB_Window_Background)
OpenWindowR(0, 10, 20, 512, 200, "Resize gadget",#PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget)
;OpenWindowr(0, 0, 0, 512, 200, "Resize gadget", #PB_Window_Maximize | #PB_Window_SizeGadget| #PB_Window_MaximizeGadget)


TextGadgetR(1, 10,  10, 200, 50, "Redimentionnez la fenetre, les gadgets seront automatiquement redimentionnés",#PB_Text_Center)
ButtonImageGadgetR(3, 10, 70, 200, 60, ImageID(0),0,0,0)
EditorGadgetR(2, 10,140, 200,20, 0, 0,0, 0,1):SetGadgetText(2,"Editor")
ButtonGadgetR(4, 110, 170, 290, 20, "Button / toggle", #PB_Button_Toggle,1/2,0,1,0)
TextGadgetr(5,220,10,190,20,"Text",#PB_Text_Center,0,1,0,0):SetGadgetColor(5, #PB_Gadget_BackColor, $00FFFF)
ContainerGadgetR(6, 220, 30, 190, 100,#PB_Container_Single,0,1,0,1):SetGadgetColor(6, #PB_Gadget_BackColor, $cccccc)
   EditorGadgetR(7, 10,  10, 170, 20, 0,0,1,0,1):SetGadgetText(7,"Editor")
   ButtonGadgetR(8, 10, 70, 80, 20, "Button",0,0,(10+80)/190,1,0)
   ButtonGadgetR(9, 100, 70, 80, 20, "Button",0,100/190,1-100/190,1,0)
   ButtonGadgetR(81, 10, 40, 80, 20, "Button",0,0,1/2,1,0)
   ButtonGadgetR(91, 100, 40, 80, 20, "Button",0,1/2,1/2,1,0)
CloseGadgetListR()
StringGadgetR(10, 220,  140, 190, 20, "String ",0,0,1,1,0)
ButtonGadgetR(11, 420,  10, 80, 80, "Bouton",0,1,0,0,1)
CheckBoxGadgetR(12, 420,  90, 200, 20, "CheckBox",0,1,0,1,0)
CheckBoxGadgetR(13, 420,  110, 200, 20, "CheckBox",0,1,0,1,0)
CheckBoxGadgetR(14, 420,  130, 200, 20, "CheckBox",0,1,0,1,0)
CheckBoxGadgetR(15, 420,  150, 200, 20, "CheckBox",0,1,0,1,0)

ResizeWindow(0, #PB_Ignore , #PB_Ignore ,512,400):
WindowBounds(0, 312, 200, #PB_Ignore, #PB_Ignore)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Redimensionnement automatique des gadgets
MessagePosté: Lun 25/Mai/2020 16:54 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 10/Mar/2013 22:22
Messages: 150
Localisation: France
Tant que j'y suis, voici un code qui permet d'afficher un message d'avertissement via le débogueur lorsque l'on utilise la fonction OpenWindow() native par erreur :

Code:
; Si vous utilisez ce code, vous devez IMPÉRATIVEMENT le mettre APRÈS le corps du module GadgetR.

CompilerIf #PB_Compiler_Debugger
   DisableDebugger
   Procedure OpenWindowDebug(Windows, x, y, InnerWidth, InnerHeight, Title$, Flags, ParendID, poubelle)
      ProcedureReturn OpenWindow(Windows, x, y, InnerWidth, InnerHeight, Title$, Flags, ParendID)
   EndProcedure
   EnableDebugger
   
   ; L'utilisation d'une macro permet de mettre le warning sur la ligne où l'on utilise openwindow()
   Macro OpenWindow(Win,x,y,W,H,T,F = #PB_Window_SystemMenu, P = #Null)
      OpenWindowDebug(Win,x,y,W,H,T,F,P,
                      Bool(DebuggerWarning("Pour profiter du redimentionnement automatique vous devez utiliser la procédure GadgetR::OpenWindowR()")))
   EndMacro
CompilerEndIf

CompilerIf #PB_Compiler_IsMainFile
   
   ; Ce code doit ouvrir une fenêtre en mettant un warning sur cette ligne
   OpenWindow(0, -1, -1, 800, 600, "Exemple")
CompilerEndIf


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 18 messages ]  Aller à la page Précédente  1, 2

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 4 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  
cron

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye