[Tuto] Layouts

Informations pour bien débuter en PureBasic
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

[Tuto] Layouts

Message par Mesa »

Les Layouts, késako ?

Si vous avez utilisé le C++ avec Qt ou VisualBasic par exemple,
vous avez probablement déjà utilisé les layouts. Ce sont des
gadgets-conteneurs qui permettent de positionner et de dimension-
-ner les gadgets de façon relative les uns par rapport aux autres.
Beaucoup de langages ont leurs layouts, pourquoi pas PureBasic.

Mais encore ? ...

Positionnement absolu et positionnement relatif :

Positionnement absolu
Purebasic ne connaît que le positionnement absolu. Lorsque vous
voulez placer un gadget sur une fenêtre, vous devez lui assigner
une position en X, en Y ainsi qu'une dimension en largeur et en
hauteur.

Par exemple :
StringGadget(#ok, X, Y, Largeur, Hauteur, "Test Text")
StringGadget(#ok, 10, 30, 100, 20, "Test Text")

Image

Que se passe-t-il quand nous redimensionnons la fenêtre ?

Les gadgets sont tronqués

Image

ou alors c'est moche...


Image

Vous aurez les mêmes problèmes si, en tant que programmeur, la
résolution de votre écran est différente de celle de la personne
qui utilise votre logiciel. Les boutons seront trop petits, les
gadgets ne seront plus alignés, etc.

(voir le post "Êtes-vous DPI aware ?"
http://www.purebasic.fr/french/viewtopi ... 1&t=12634)

Et, si en plus, vous changez la taille de la police de caractères,
tous les gadgets doivent être replacés et redimensionnés à la
main.

Pour éviter tous ces problèmes, il existe plusieurs solutions.
De la plus simple à la plus complexe :

La plus simple est de surdimensionner un peu les gadgets,
d'interdire le redimensionnement des fenêtres et de n'utiliser
qu'une seule police avec une seule taille.
Cela peut-être intéressant pour une boîte de dialogues par exemple
mais ce n'est pas toujours possible.

Une autre façon de faire est d'utiliser la librairie PureResize
de gnozal
(http://gnozal.ucoz.com/) qui est très intéressante mais, à ma
connaissance, elle utilise le callback de Windows toujours
délicat pour les débutants.
Il existe d'autres bibliothèques et codes de ce genre mais leur
utilisation se complique quand on veut mettre des gadgets dans
des gadgets comme des optiongadgets dans un frame3DGadget.

Et puis il existe le positionnement relatif: Les layouts.


Positionnement relatif.
Ici plus de X ni de Y ni de largeur (Width) ni de hauteur
(height), le layout s'occupe de tout.
Avant de me jeter dans la programmation des layouts, j'ai regardé
si quelqu'un avait eu la même idée avant moi et en effet un
allemand (cptdark) a créé un code en purebasic qui permet
d'utiliser des layouts.

Forum : http://forums.purebasic.com/german/view ... a&start=20
Download:http://angelzware.bplaced.net/media/gim ... -0_1_6.zip

Dans le zip, on trouve plusieurs outils, seul le fichier
awguilayout.pbi nous intéresse ainsi que les exemples,
guilayout_demo1(7).pb (demo1 à demo7).
Faites des essais.

Note: Essayer l'exemple gdgres_demo.pb pour voir...
(Rien à voir avec les layouts pourtant...)

Note 2: Cela fait quatre fois que le créateur change son code et
Quatre fois que je réécris une partie de ce tuto. Je m'en tiendrai
à la version 0.16 pour la suite de ce tuto.

J'ai créé un rar contenant tous les exemples du tuto.
http://frazier.wood.free.fr/Layouts/Layoutv16.rar

Je ne commenterai pas le code de cptdark qui utilise la program-
-mation orientée objet et les pointeurs. Comme l'utilisation des
pointeurs n'est pas dans l'esprit Basic et rebute les débutants
(moi y compris), j'ai ajouté des fonctions qui permettent de
s'en passer.

Avant de commencer le tutoriel, je vous conseille de créer un
répertoire "layout" contenant le fichier layout.pbi.

A suivre...

Mesa.
Dernière modification par Mesa le mar. 05/juin/2012 14:47, modifié 1 fois.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: [Tuto] Layouts

Message par Mesa »

Pour archive, une copie de Layout.pbi ci-dessous :

Code : Tout sélectionner

;    awguilayout.pbi
;    Version 0.7 [2012/05/09]
;    Copyright (C) 2012 Ronny Krueger
;
;    This file is part of AWPB-Tools.
;
;    AWPB-Tools is free software: you can redistribute it and/or modify
;    it under the terms of the GNU Lesser General Public License as published by
;    the Free Software Foundation, either version 3 of the License, or
;    (at your option) any later version.
;
;    AWPB-Tools is distributed in the hope that it will be useful,
;    but WITHOUT ANY WARRANTY; without even the implied warranty of
;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;    GNU Lesser General Public License for more details.
;
;    You should have received a copy of the GNU Lesser General Public License
;    along with AWPB-Tools.  If not, see <http://www.gnu.org/licenses/>.

;{ Fixes for Linux
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
  ImportC "-gtk"
    g_signal_connect_data(*widget,signal.p-utf8,*fn,*vdata,destroy)
  EndImport
  
  ProcedureC ____AWPB_GUILO_GtkWidgets_CB_SSR_TG(*label.GtkWidget, *allocation.GtkAllocation, *dummy)
    gtk_widget_set_size_request_(*label, *allocation\width - 2, -1)
  EndProcedure
  ProcedureC ____AWPB_GUILO_GtkWidgets_CB_SSR_FG(*label.GtkWidget, *allocation.GtkAllocation, *daten)
    gtk_widget_set_size_request_(gtk_frame_get_label_widget_(*label), *allocation\width - 2, -1)
  EndProcedure
  
  Procedure AWPB_GUILO_Fix_TextGadget_Resize(GadgetID.i, EnableWordWrap.b)
    gtk_label_set_line_wrap_(GadgetID(GadgetID), EnableWordWrap)
    g_signal_connect_data(GadgetID(GadgetID), "size-allocate", @____AWPB_GUILO_GtkWidgets_CB_SSR_TG(), #Null, 0)
  EndProcedure 
  Procedure AWPB_GUILO_Fix_Frame3DGadget_Resize(GadgetID.i)
    g_signal_connect_data(GadgetID(GadgetID), "size-allocate", @____AWPB_GUILO_GtkWidgets_CB_SSR_FG(), #Null, 0)
  EndProcedure  
CompilerEndIf
;}
;{ Flags; public and internal
#AWPB_GUILO_SIZER_GADGET						=	$00000001
#AWPB_GUILO_SIZER_SPACER						=	$00000002
#AWPB_GUILO_SIZER_SIZER							=	$00000004
#AWPB_GUILO_SIZER_FRAME							=	$00000008
#AWPB_GUILO_SIZER_FIX								=	$00000010
#AWPB_GUILO_SIZER_REL								=	$00000020
#AWPB_GUILO_SIZER_VBOX							=	$00000040
#AWPB_GUILO_SIZER_HBOX							=	$00000080
#AWPB_GUILO_SIZER_PARENT_WINDOW			=	$00000100
#AWPB_GUILO_SIZER_PARENT_CONTAINER	=	$00000200
#AWPB_GUILO_SIZER_PARENT_FRAME			=	$00000400
#AWPB_GUILO_SIZER_PARENT_PANEL			= $00000800
;}
;{ CallBack Prototypes
PrototypeC AWPB_GUILO_OnBeforeResize_Proto(GadgetID.i)
PrototypeC AWPB_GUILO_OnAfterResize_Proto(GadgetID.i, Left.i, Top.i, width.i, Height.i)
;}
;{ Support Procedures
Procedure.i ____AWPB_GetGadgetTextHeight(GadgetID.i)
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Linux
      Protected *Frame.GtkFrame, *widget.GtkWidget, h
      
      *Frame = GadgetID(GadgetID)
      If *Frame
        *widget = gtk_frame_get_label_widget_(*Frame)
        If *widget
          gtk_widget_get_size_request_(*widget, #Null, @h)
          h - 10
          ProcedureReturn h
        EndIf
      EndIf
    CompilerCase #PB_OS_Windows
      Protected *otm.OUTLINETEXTMETRIC, bsize.i, Font.i, hWnd.i, hdc.i, FontSize.i
      
      hWnd  = GadgetID(GadgetID)
      Font  = GetGadgetFont(GadgetID) 
      hdc   = GetDC_(hWnd)
      Font  = SelectObject_(hdc, Font)
      bsize = GetOutlineTextMetrics_(hdc, 0, 0)
      
      If bsize = 0
        SelectObject_(hdc, Font)
        ReleaseDC_(hWnd, hdc)
        ProcedureReturn 0
      EndIf
      
      *otm 				 = AllocateMemory(bsize)
      *otm\otmSize = bsize
      
      GetOutlineTextMetrics_(hdc, bsize, *otm)
      
      FontSize = Int(Round((*otm\otmTextMetrics\tmHeight * 72.0 / GetDeviceCaps_(hdc, #LOGPIXELSY)), 1))
      
      FreeMemory(*otm)
      SelectObject_(hdc, Font)
      ReleaseDC_(hWnd,hdc)
      
      ProcedureReturn FontSize * 2
  CompilerEndSelect
  
  ProcedureReturn 0	
EndProcedure
Procedure.b ____AWPB_GetLMBState(Window.i)
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Linux
      Protected *GdkWin.GTKWindow, x.i, y.i, mask.i
      
      If IsWindow(Window)
        *GdkWin = WindowID(Window)
        gdk_window_get_pointer_(*GdkWin\bin\child\Window, @x, @y, @mask)
        
        If mask & #GDK_BUTTON1_MASK
          ProcedureReturn #True
        EndIf
      EndIf
    CompilerCase #PB_OS_Windows
      If IsWindow(Window) And GetForegroundWindow_() = Window
        If GetAsyncKeyState_(#VK_LBUTTON) > 0
          ProcedureReturn #True
        EndIf
      EndIf
  CompilerEndSelect
  
  ProcedureReturn #False
EndProcedure
Procedure.b ____AWPB_GetRMBState(Window.i)
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Linux
      Protected *GdkWin.GTKWindow, x.i, y.i, mask.i
      
      If IsWindow(Window)
        *GdkWin = WindowID(Window)
        gdk_window_get_pointer_(*GdkWin\bin\child\Window, @x, @y, @mask)
        
        If mask & #GDK_BUTTON3_MASK
          ProcedureReturn #True
        EndIf
      EndIf
    CompilerCase #PB_OS_Windows
      If IsWindow(Window) And GetForegroundWindow_() = Window
        If GetAsyncKeyState_(#VK_RBUTTON) > 0
          ProcedureReturn #True
        EndIf
      EndIf
  CompilerEndSelect
  
  ProcedureReturn #False
EndProcedure
Procedure.b ____AWPB_GetMMBState(Window.i)
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Linux
      Protected *GdkWin.GTKWindow, x.i, y.i, mask.i
      
      If IsWindow(Window)
        *GdkWin = WindowID(Window)
        gdk_window_get_pointer_(*GdkWin\bin\child\Window, @x, @y, @mask)
        
        If mask & #GDK_BUTTON2_MASK
          ProcedureReturn #True
        EndIf
      EndIf
    CompilerCase #PB_OS_Windows
      If IsWindow(Window) And GetForegroundWindow_() = Window
        If GetAsyncKeyState_(#VK_MBUTTON) > 0
          ProcedureReturn #True
        EndIf
      EndIf
  CompilerEndSelect
  
  ProcedureReturn #False
EndProcedure
;}
;{ Support Macros
Macro IsFlag(x, y)
  (((x) & (y)) = y)
EndMacro
;}
;{ Sizer Object
Interface AWPB_GUILO_Sizer
  Destroy      			()
  Finish	     			(ExecuteBeforeResizeCallbacks.b = #False, ExecuteAfterResizeCallbacks.b = #False)
  Resize       			(ExecuteBeforeResizeCallbacks.b = #False, ExecuteAfterResizeCallbacks.b = #False)
  AddGadget.b  			(ParentSizer.i, GadgetID.i, Size.i, BorderLeft.i = 0, BorderTop.i = 0, BorderRight.i = 0, BorderBottom.i = 0, *OnBeforeResizeCallback.AWPB_GUILO_OnBeforeResize_Proto = #Null, *OnAfterResizeCallback.AWPB_GUILO_OnAfterResize_Proto = #Null)
  AddSizer.i   			(ParentSizer.i, Flags.i, Size.i)
  AddSpacer.b  			(ParentSizer.i, Size.i)	
  AddFramedSizer.i	(ParentSizer.i, GadgetID.i, Flags.i, Size.i, BorderLeft.i = 0, BorderTop.i = 0, BorderRight.i = 0, BorderBottom.i = 0, InnerBorderLeft.i = #PB_Any, InnerBorderTop.i = #PB_Any, InnerBorderRight.i = #PB_Any, InnerBorderBottom.i = #PB_Any, *OnBeforeResizeCallback.AWPB_GUILO_OnBeforeResize_Proto = #Null, *OnAfterResizeCallback.AWPB_GUILO_OnAfterResize_Proto = #Null)
  MinWidth.i   			(ParentSizer.i = #Null)
  MinHeight.i  			(ParentSizer.i = #Null)
EndInterface
Structure ____AWPB_GUILO_Sizer_Data
  ; calculated values
  l.i
  t.i
  r.i
  b.i
  w.i
  h.i
  
  ; given values
  Flags.i			; #AWPB_GUILO_SIZER_GADGET | #AWPB_GUILO_SIZER_SPACER | #AWPB_GUILO_SIZER_SIZER | #AWPB_GUILO_SIZER_FRAME | #AWPB_GUILO_SIZER_FIX | #AWPB_GUILO_SIZER_REL | #AWPB_GUILO_SIZER_VBOX | #AWPB_GUILO_SIZER_HBOX	
  Size.i			; 0... px | 0..100 %
  bleft.i			; Outer Border Left
  btop.i			; Outer Border Top
  bright.i		; Outer Border Right
  bbottom.i		; Outer Border Bottom
  ibleft.i		; Inner Border Left
  ibtop.i			; Inner Border Top
  ibright.i		; Inner Border Right
  ibbottom.i	; Inner Border Bottom
  GadgetID.i	; Gadget Number if needed
  
  *OnBeforeResize.AWPB_GUILO_OnBeforeResize_Proto
  *OnAfterResize.AWPB_GUILO_OnAfterResize_Proto
  
  List *childs.____AWPB_GUILO_Sizer_Data()
  
  ; Internal Flags
  *ReliesOn
  Process.b
EndStructure
Structure ____AWPB_GUILO_Sizer
  *vt.____AWPB_GUILO_Sizer_VT
  
  sizers.____AWPB_GUILO_Sizer_Data
  
  ParentID.i
EndStructure

Procedure.i AWPB_CreateSizerObj(ParentID.i)
  Protected *this.____AWPB_GUILO_Sizer
  
  If Not IsWindow(ParentID)
    If Not IsGadget(ParentID)
      ProcedureReturn #Null
    EndIf
    If (GadgetType(ParentID) <> #PB_GadgetType_Container) And (GadgetType(ParentID) <> #PB_GadgetType_Frame3D) And (GadgetType(ParentID) <> #PB_GadgetType_Panel)
      ProcedureReturn #Null
    EndIf
  EndIf
  
  *this = AllocateMemory(SizeOf(____AWPB_GUILO_Sizer))
  If *this 
    InitializeStructure(*this, ____AWPB_GUILO_Sizer)
    *this\vt              = ?____AWPB_GUILO_Sizer_VT
    *this\ParentID        = ParentID
    *this\sizers\l        = 0
    *this\sizers\t        = 0
    
    If IsWindow(ParentID)
      *this\sizers\Flags = #AWPB_GUILO_SIZER_PARENT_WINDOW
      *this\sizers\r     = WindowWidth(ParentID)
      *this\sizers\b     = WindowHeight(ParentID)
    ElseIf IsGadget(ParentID)
      If GadgetType(ParentID) = #PB_GadgetType_Container
        *this\sizers\Flags = #AWPB_GUILO_SIZER_PARENT_CONTAINER
      ElseIf GadgetType(ParentID) = #PB_GadgetType_Frame3D
        *this\sizers\Flags = #AWPB_GUILO_SIZER_PARENT_FRAME
      ElseIf GadgetType(ParentID) = #PB_GadgetType_Panel
        *this\sizers\Flags = #AWPB_GUILO_SIZER_PARENT_PANEL
      Else
        FreeMemory(*this)
        ProcedureReturn #Null
      EndIf
      *this\sizers\r     = GadgetWidth(ParentID)
      *this\sizers\b     = GadgetHeight(ParentID)
    Else
      FreeMemory(*this)
      ProcedureReturn #Null
    EndIf
    *this\sizers\flags					| #AWPB_GUILO_SIZER_VBOX | #AWPB_GUILO_SIZER_REL | #AWPB_GUILO_SIZER_SIZER
    *this\sizers\w        			= *this\sizers\r
    *this\sizers\h        			= *this\sizers\b
    *this\sizers\bleft   			  = 0
    *this\sizers\btop    			  =	0
    *this\sizers\bright   			= 0
    *this\sizers\bbottom  			= 0
    *this\sizers\ibleft   			= 0
    *this\sizers\ibtop    			= 0
    *this\sizers\ibright   			= 0
    *this\sizers\ibbottom  			= 0
    *this\sizers\GadgetID 			= #PB_Any
    *this\sizers\size     			= 100
    *this\sizers\OnBeforeResize = #Null
    *this\sizers\OnAfterResize  = #Null
    *this\sizers\Process 				= #False
    *this\sizers\ReliesOn				= #Null
    
    ProcedureReturn *this
  EndIf
  
  ProcedureReturn #Null
EndProcedure
Procedure   ____AWPB_GUILO_Sizer_DestroyChild(*sizer.____AWPB_GUILO_Sizer_Data)
  ForEach *sizer\childs()
    ____AWPB_GUILO_Sizer_DestroyChild(*sizer\childs())
  Next
  FreeList(*sizer\childs())
  FreeMemory(*sizer)
EndProcedure
Procedure   ____AWPB_GUILO_Sizer_Destroy(*this.____AWPB_GUILO_Sizer)
  ForEach *this\sizers\childs()
    ____AWPB_GUILO_Sizer_DestroyChild(*this\sizers\childs())
  Next
  FreeList(*this\sizers\childs())
  FreeMemory(*this)
EndProcedure
Procedure   ____AWPB_GUILO_Sizer_FinishChild(*sizer.____AWPB_GUILO_Sizer_Data, ExecuteBeforeResizeCallbacks.b, ExecuteAfterResizeCallbacks.b)
  Protected l.i, t.i, r.i, b.i, w.i, h.i, gl.i, gt.i, gb.i, gr.i, gw.i, gh.i, ol.i, ot.i, ow.i, oh.i
  
  l = *sizer\l
  t = *sizer\t
  r = *sizer\r
  b = *sizer\b
  w = *sizer\w
  h = *sizer\h
  
  If IsFlag(*sizer\flags, #AWPB_GUILO_SIZER_GADGET) Or IsFlag(*sizer\flags, #AWPB_GUILO_SIZER_FRAME)
    If IsGadget(*sizer\GadgetID)
      ol = l
      ot = t
      ow = w
      oh = h
      gl = *sizer\l + *sizer\bleft
      gt = *sizer\t + *sizer\btop
      gr = *sizer\r - *sizer\bright
      gb = *sizer\b - *sizer\bbottom
      If gl > gr : gl = *sizer\l : EndIf
      If gt > gb : gl = *sizer\t : EndIf
      If gr < gl : gr = *sizer\r : EndIf
      If gb < gt : gb = *sizer\b : EndIf
      gw = gr - gl
      gh = gb - gt 
      If (l <> ol) Or (t <> ot) Or (gw <> ow) Or (gh <> oh)
        If ExecuteBeforeResizeCallbacks 
          If *sizer\OnBeforeResize <> #Null
            *sizer\OnBeforeResize(*sizer\GadgetID)
          EndIf  
        EndIf  
        ResizeGadget(*sizer\GadgetID, gl, gt, gw, gh)
        If ExecuteAfterResizeCallbacks 
          If *sizer\OnAfterResize <> #Null
            *sizer\OnAfterResize(*sizer\GadgetID, gl, gt, gw, gh)
          EndIf  
        EndIf  
      EndIf
    EndIf
  EndIf
  If IsFlag(*sizer\flags, #AWPB_GUILO_SIZER_SIZER)
    If IsFlag(*sizer\flags, #AWPB_GUILO_SIZER_FRAME)
      With *sizer
        l = \l + \bleft   + \ibleft
        t = \t + \btop    + \ibtop
        r = \r - \bright  - \ibright
        b = \b - \bbottom - \ibbottom
        w = \w - \bleft   - \ibleft   - \bright  - \ibright
        h = \h - \btop    - \ibtop    - \bbottom - \ibbottom
      EndWith
    EndIf
    ForEach *sizer\childs()
      With *sizer\childs()
        If IsFlag(*sizer\flags, #AWPB_GUILO_SIZER_HBOX)
          ; horizontal - t, b and h static
          \t = t
          \b = b
          \h = h
          If IsFlag(*sizer\flags, #AWPB_GUILO_SIZER_FIX)
            \l = l
            \w = \size
            \r = \l + \w - 1
            l  = \r + 1
          ElseIf IsFlag(*sizer\flags, #AWPB_GUILO_SIZER_REL)
            \l = l
            \w = (w * \size) / 100
            \r = \l + \w - 1
            l  = \r + 1
          EndIf
        ElseIf IsFlag(*sizer\flags, #AWPB_GUILO_SIZER_VBOX)
          ; vertical - l, r and w static
          \l = l
          \r = r
          \w = w
          If IsFlag(*sizer\flags, #AWPB_GUILO_SIZER_FIX)
            \t = t
            \h = \size
            \b = \t + \h - 1
            t  = \b + 1
          ElseIf IsFlag(*sizer\flags, #AWPB_GUILO_SIZER_REL)
            \t = t
            \h = (h * \size) / 100
            \b = \t + \h - 1
            t  = \b + 1
          EndIf
        EndIf
      EndWith
      ____AWPB_GUILO_Sizer_FinishChild(*sizer\childs(), ExecuteBeforeResizeCallbacks, ExecuteAfterResizeCallbacks)
    Next
  EndIf
EndProcedure
Procedure   ____AWPB_GUILO_Sizer_Finish(*this.____AWPB_GUILO_Sizer, ExecuteBeforeResizeCallbacks.b = #False, ExecuteAfterResizeCallbacks.b = #False)
  ____AWPB_GUILO_Sizer_FinishChild(@*this\sizers, ExecuteBeforeResizeCallbacks, ExecuteAfterResizeCallbacks)
EndProcedure
Procedure   ____AWPB_GUILO_Sizer_Resize(*this.____AWPB_GUILO_Sizer, ExecuteBeforeResizeCallbacks.b = #False, ExecuteAfterResizeCallbacks.b = #False)
  If IsFlag(*this\sizers\flags, #AWPB_GUILO_SIZER_PARENT_WINDOW)
    *this\sizers\r        = WindowWidth(*this\ParentID)
    *this\sizers\b        = WindowHeight(*this\ParentID)
  ElseIf IsFlag(*this\sizers\flags, #AWPB_GUILO_SIZER_PARENT_CONTAINER) Or IsFlag(*this\sizers\flags, #AWPB_GUILO_SIZER_PARENT_FRAME)
    *this\sizers\r        = GadgetWidth(*this\ParentID)
    *this\sizers\b        = GadgetHeight(*this\ParentID)
  ElseIf IsFlag(*this\sizers\flags, #AWPB_GUILO_SIZER_PARENT_PANEL)
    *this\sizers\r        = GetGadgetAttribute(*this\ParentID, #PB_Panel_ItemWidth)
    *this\sizers\b        = GetGadgetAttribute(*this\ParentID, #PB_Panel_ItemHeight)
  EndIf
  *this\sizers\w = *this\sizers\r
  *this\sizers\h = *this\sizers\b
  ____AWPB_GUILO_Sizer_Finish(*this, ExecuteBeforeResizeCallbacks, ExecuteAfterResizeCallbacks)
EndProcedure
Procedure.b ____AWPB_GUILO_Sizer_AddGadget(*this.____AWPB_GUILO_Sizer, *ParentSizer.____AWPB_GUILO_Sizer_Data, GadgetID.i, Size.i, BorderLeft.i = 0, BorderTop.i = 0, BorderRight.i = 0, BorderBottom.i = 0, *OnBeforeResizeCallback.AWPB_GUILO_OnBeforeResize_Proto = #Null, *OnAfterResizeCallback.AWPB_GUILO_OnAfterResize_Proto = #Null)
  Protected *sizer.____AWPB_GUILO_Sizer_Data
  
  If IsGadget(GadgetID) 
    *sizer = AllocateMemory(SizeOf(____AWPB_GUILO_Sizer_Data))
    If *sizer
      InitializeStructure(*sizer, ____AWPB_GUILO_Sizer_Data)
      With *sizer
        \flags          = #AWPB_GUILO_SIZER_GADGET
        \size     			= Size
        \bleft    			= BorderLeft
        \btop     			= BorderTop
        \bright   			= BorderRight
        \bbottom  			= BorderBottom
        \ibleft    			= 0
        \ibtop     			= 0
        \ibright   			= 0
        \ibbottom  			= 0
        \GadgetID 			= GadgetID
        \OnBeforeResize = *OnBeforeResizeCallback
        \OnAfterResize  = *OnAfterResizeCallback
      EndWith
      
      If *ParentSizer
        AddElement(*ParentSizer\childs())
        *ParentSizer\childs() = *sizer
      Else
        AddElement(*this\sizers\childs())
        *this\sizers\childs() = *sizer
      EndIf
      
      ProcedureReturn #True
    EndIf
  EndIf
  
  ProcedureReturn #False
EndProcedure
Procedure.i ____AWPB_GUILO_Sizer_AddSizer(*this.____AWPB_GUILO_Sizer, *ParentSizer.____AWPB_GUILO_Sizer_Data, Flags.i, Size.i)
  Protected *sizer.____AWPB_GUILO_Sizer_Data
  
  *sizer = AllocateMemory(SizeOf(____AWPB_GUILO_Sizer_Data))
  If *sizer
    InitializeStructure(*sizer, ____AWPB_GUILO_Sizer_Data)
    With *sizer
      \flags					= #AWPB_GUILO_SIZER_SIZER
      If IsFlag(Flags, #AWPB_GUILO_SIZER_HBOX)
        \flags				| #AWPB_GUILO_SIZER_HBOX
      Else
        \flags				| #AWPB_GUILO_SIZER_VBOX
      EndIf
      If IsFlag(Flags, #AWPB_GUILO_SIZER_REL)
        \flags				| #AWPB_GUILO_SIZER_REL
      Else
        \flags				| #AWPB_GUILO_SIZER_FIX
      EndIf		
      \size     			= Size
      \bleft    			= 0
      \btop     			= 0
      \bright   			= 0
      \bbottom  			= 0
      \ibleft    			= 0
      \ibtop     			= 0
      \ibright   			= 0
      \ibbottom  			= 0
      \GadgetID 			= #PB_Any
      \OnBeforeResize = #Null
      \OnAfterResize  = #Null
    EndWith
    
    If *ParentSizer
      AddElement(*ParentSizer\childs())
      *ParentSizer\childs() = *sizer
    Else
      AddElement(*this\sizers\childs())
      *this\sizers\childs() = *sizer
    EndIf
  EndIf
  
  ProcedureReturn *sizer		
EndProcedure
Procedure.b ____AWPB_GUILO_Sizer_AddSpacer(*this.____AWPB_GUILO_Sizer, *ParentSizer.____AWPB_GUILO_Sizer_Data, Size.i)
  Protected *sizer.____AWPB_GUILO_Sizer_Data
  
  *sizer = AllocateMemory(SizeOf(____AWPB_GUILO_Sizer_Data))
  If *sizer
    InitializeStructure(*sizer, ____AWPB_GUILO_Sizer_Data)
    With *sizer
      \flags					= #AWPB_GUILO_SIZER_SPACER
      \size     			= Size
      \bleft    			= 0
      \btop     			= 0
      \bright   			= 0
      \bbottom  			= 0
      \ibleft    			= 0
      \ibtop     			= 0
      \ibright   			= 0
      \ibbottom  			= 0
      \GadgetID 			= #PB_Any
      \OnBeforeResize = #Null
      \OnAfterResize  = #Null
    EndWith
    
    If *ParentSizer
      AddElement(*ParentSizer\childs())
      *ParentSizer\childs() = *sizer
    Else
      AddElement(*this\sizers\childs())
      *this\sizers\childs() = *sizer
    EndIf
    
    ProcedureReturn #True
  EndIf
  
  ProcedureReturn #False
EndProcedure
Procedure.i ____AWPB_GUILO_Sizer_AddFramedSizer(*this.____AWPB_GUILO_Sizer, *ParentSizer.____AWPB_GUILO_Sizer_Data, GadgetID.i, Flags.i, Size.i, BorderLeft.i = 0, BorderTop.i = 0, BorderRight.i = 0, BorderBottom.i = 0, InnerBorderLeft.i = #PB_Any, InnerBorderTop.i = #PB_Any, InnerBorderRight.i = #PB_Any, InnerBorderBottom.i = #PB_Any, *OnBeforeResizeCallback.AWPB_GUILO_OnBeforeResize_Proto = #Null, *OnAfterResizeCallback.AWPB_GUILO_OnAfterResize_Proto = #Null)
  Protected *sizer.____AWPB_GUILO_Sizer_Data
  
  If IsGadget(GadgetID)
    If GadgetType(GadgetID) = #PB_GadgetType_Frame3D
      If InnerBorderBottom = #PB_Any : InnerBorderBottom = 5 : EndIf
      If InnerBorderLeft   = #PB_Any : InnerBorderLeft   = 5 : EndIf
      If InnerBorderRight  = #PB_Any : InnerBorderRight  = 5 : EndIf
      If InnerBorderTop    = #PB_Any
        If GetGadgetText(GadgetID) <> "" 
          InnerBorderTop = ____AWPB_GetGadgetTextHeight(GadgetID)
        Else
          InnerBorderTop = 5
        EndIf
      EndIf
      
      *sizer = AllocateMemory(SizeOf(____AWPB_GUILO_Sizer_Data))
      If *sizer
        InitializeStructure(*sizer, ____AWPB_GUILO_Sizer_Data)
        With *sizer
          \flags					= #AWPB_GUILO_SIZER_SIZER | #AWPB_GUILO_SIZER_FRAME
          If IsFlag(Flags, #AWPB_GUILO_SIZER_HBOX)
            \flags				| #AWPB_GUILO_SIZER_HBOX
          Else
            \flags				| #AWPB_GUILO_SIZER_VBOX
          EndIf
          If IsFlag(Flags, #AWPB_GUILO_SIZER_REL)
            \flags				| #AWPB_GUILO_SIZER_REL
          Else
            \flags				| #AWPB_GUILO_SIZER_FIX
          EndIf		
          \size     			= Size
          \bleft    			= BorderLeft
          \btop     			= BorderTop
          \bright   			= BorderRight
          \bbottom  			= BorderBottom
          \ibleft    			= InnerBorderLeft
          \ibtop     			= InnerBorderTop
          \ibright   			= InnerBorderRight
          \ibbottom  			= InnerBorderBottom
          \GadgetID 			= GadgetID
          \OnBeforeResize = *OnBeforeResizeCallback
          \OnAfterResize  = *OnAfterResizeCallback
        EndWith
        
        If *ParentSizer
          AddElement(*ParentSizer\childs())
          *ParentSizer\childs() = *sizer
        Else
          AddElement(*this\sizers\childs())
          *this\sizers\childs() = *sizer
        EndIf
      EndIf
    EndIf
  EndIf
  
  ProcedureReturn *sizer		
EndProcedure
Procedure.i ____AWPB_GUILO_Sizer_MinWidth(*this.____AWPB_GUILO_Sizer, *ParentSizer.____AWPB_GUILO_Sizer_Data = #Null)
  ;- TODO
  
EndProcedure
Procedure.i ____AWPB_GUILO_Sizer_MinHeight(*this.____AWPB_GUILO_Sizer, *ParentSizer.____AWPB_GUILO_Sizer_Data = #Null)
  ;- TODO
  
EndProcedure

DataSection ;{
  ____AWPB_GUILO_Sizer_VT:
  Data.i @____AWPB_GUILO_Sizer_Destroy()
  Data.i @____AWPB_GUILO_Sizer_Finish()
  Data.i @____AWPB_GUILO_Sizer_Resize()
  Data.i @____AWPB_GUILO_Sizer_AddGadget()
  Data.i @____AWPB_GUILO_Sizer_AddSizer()
  Data.i @____AWPB_GUILO_Sizer_AddSpacer()
  Data.i @____AWPB_GUILO_Sizer_AddFramedSizer()
  Data.i @____AWPB_GUILO_Sizer_MinWidth()
  Data.i @____AWPB_GUILO_Sizer_MinHeight()  
EndDataSection ;}
;}
;{ SizerList Object
Interface AWPB_GUILO_SizerList
  Destroy      			()
  AllocateSizer.i		(ParentID.i, *ReliesOnSizer = #Null)
  FreeSizer					(*Sizer.AWPB_GUILO_Sizer)
  Finish	     			(ExecuteBeforeResizeCallbacks.b = #False, ExecuteAfterResizeCallbacks.b = #False)	
  Resize       			(ExecuteBeforeResizeCallbacks.b = #False, ExecuteAfterResizeCallbacks.b = #False)
EndInterface
Structure ____AWPB_GUILO_SizerList
  *vt.____AWPB_GUILO_SizerList_VT
  
  Map *childs.AWPB_GUILO_Sizer()
EndStructure

Procedure.i AWPB_CreateSizerListObj()
  Protected *this.____AWPB_GUILO_SizerList
  
  *this = AllocateMemory(SizeOf(____AWPB_GUILO_SizerList))
  If *this 
    InitializeStructure(*this, ____AWPB_GUILO_SizerList)
    *this\vt = ?____AWPB_GUILO_SizerList_VT
    
    ProcedureReturn *this
  EndIf
  
  ProcedureReturn #Null
EndProcedure
Procedure   ____AWPB_GUILO_SizerList_Destroy(*this.____AWPB_GUILO_SizerList)
  Protected *sz.AWPB_GUILO_Sizer
  
  ForEach *this\childs()
    *sz = *this\childs()
    *sz\Destroy()
  Next
  
  FreeMap(*this\childs())
  FreeMemory(*this)
EndProcedure
Procedure.i ____AWPB_GUILO_SizerList_AllocateSizer(*this.____AWPB_GUILO_SizerList, ParentID.i, *ReliesOnSizer)
  Protected *sz.AWPB_GUILO_Sizer, *szd.____AWPB_GUILO_Sizer
  
  *sz = AWPB_CreateSizerObj(ParentID)
  If *sz
    *szd                 = *sz
    *szd\sizers\ReliesOn = *ReliesOnSizer
    AddMapElement(*this\childs(), Str(*sz))
    *this\childs()       = *sz
  EndIf
  
  ProcedureReturn *sz
EndProcedure
Procedure   ____AWPB_GUILO_SizerList_FreeSizer(*this.____AWPB_GUILO_SizerList, *Sizer.AWPB_GUILO_Sizer)
  If *Sizer
    *Sizer\Destroy()
    DeleteMapElement(*this\childs(), Str(*Sizer))
  EndIf
EndProcedure
Procedure   ____AWPB_GUILO_SizerList_FinishSizer(Map *sizers.AWPB_GUILO_Sizer(), ExecuteBeforeResizeCallbacks.b, ExecuteAfterResizeCallbacks.b, key.s = "")
  Protected *szd.____AWPB_GUILO_Sizer, *sz.AWPB_GUILO_Sizer
  
  If key = ""
    ForEach(*sizers())
      *szd = *sizers()
      If *szd
        If *szd\sizers\Process
          PushMapPosition(*sizers())
          ____AWPB_GUILO_SizerList_FinishSizer(*sizers(), ExecuteBeforeResizeCallbacks, ExecuteAfterResizeCallbacks, MapKey(*sizers()))
          PopMapPosition(*sizers())
        EndIf
      EndIf
    Next
  Else
    If FindMapElement(*sizers(), key)
      *szd = *sizers()
      If *szd
        If *szd\sizers\Process
          If *szd\sizers\ReliesOn
            ____AWPB_GUILO_SizerList_FinishSizer(*sizers(), ExecuteBeforeResizeCallbacks, ExecuteAfterResizeCallbacks, Str(*szd\sizers\ReliesOn))
          EndIf
          *szd\sizers\Process = #False
          *sz                 = *szd
          *sz\Finish(ExecuteBeforeResizeCallbacks, ExecuteAfterResizeCallbacks)
        EndIf
      EndIf
    EndIf
  EndIf
EndProcedure
Procedure   ____AWPB_GUILO_SizerList_Finish(*this.____AWPB_GUILO_SizerList, ExecuteBeforeResizeCallbacks.b = #False, ExecuteAfterResizeCallbacks.b = #False)
  Protected *szd.____AWPB_GUILO_Sizer
  
  ForEach *this\childs()
    *szd = *this\childs()
    *szd\sizers\Process = #True
  Next
  ____AWPB_GUILO_SizerList_FinishSizer(*this\childs(), ExecuteBeforeResizeCallbacks, ExecuteAfterResizeCallbacks, "")
EndProcedure
Procedure   ____AWPB_GUILO_SizerList_ResizeSizer(Map *sizers.AWPB_GUILO_Sizer(), ExecuteBeforeResizeCallbacks.b, ExecuteAfterResizeCallbacks.b, key.s = "")
  Protected *szd.____AWPB_GUILO_Sizer, *sz.AWPB_GUILO_Sizer
  
  If key = ""
    ForEach(*sizers())
      *szd = *sizers()
      If *szd
        If *szd\sizers\Process
          PushMapPosition(*sizers())
          ____AWPB_GUILO_SizerList_ResizeSizer(*sizers(), ExecuteBeforeResizeCallbacks, ExecuteAfterResizeCallbacks, MapKey(*sizers()))
          PopMapPosition(*sizers())
        EndIf
      EndIf
    Next
  Else
    If FindMapElement(*sizers(), key)
      *szd = *sizers()
      If *szd
        If *szd\sizers\Process
          If *szd\sizers\ReliesOn
            ____AWPB_GUILO_SizerList_ResizeSizer(*sizers(), ExecuteBeforeResizeCallbacks, ExecuteAfterResizeCallbacks, Str(*szd\sizers\ReliesOn))
          EndIf
          *szd\sizers\Process = #False
          *sz                 = *szd
          *sz\Resize(ExecuteBeforeResizeCallbacks, ExecuteAfterResizeCallbacks)
        EndIf
      EndIf
    EndIf
  EndIf
EndProcedure
Procedure   ____AWPB_GUILO_SizerList_Resize(*this.____AWPB_GUILO_SizerList, ExecuteBeforeResizeCallbacks.b = #False, ExecuteAfterResizeCallbacks.b = #False)
  Protected *szd.____AWPB_GUILO_Sizer
  
  ForEach *this\childs()
    *szd = *this\childs()
    *szd\sizers\Process = #True
  Next
  ____AWPB_GUILO_SizerList_ResizeSizer(*this\childs(), ExecuteBeforeResizeCallbacks, ExecuteAfterResizeCallbacks, "")
EndProcedure

DataSection ;{
  ____AWPB_GUILO_SizerList_VT:
  Data.i @____AWPB_GUILO_SizerList_Destroy()
  Data.i @____AWPB_GUILO_SizerList_AllocateSizer()
  Data.i @____AWPB_GUILO_SizerList_FreeSizer()
  Data.i @____AWPB_GUILO_SizerList_Finish()
  Data.i @____AWPB_GUILO_SizerList_Resize()
EndDataSection ;}
;}


;==========================================================
;**********************************************************
;==========================================================
; Ajout Mesa
; Mai 2012
; Do want you want with this part of code


Global NewMap *layout.AWPB_GUILO_Sizer()

Procedure CreateLayout(number.l,fenetre.l)
  
  *layout( Str(number)) = AWPB_CreateSizerObj(fenetre)
  
EndProcedure

Procedure.i VBOXLayout(number.l,parent.i,Size.l,relatif.b=#True)
  Protected Flags.i
  If relatif = #True
    Flags=#AWPB_GUILO_SIZER_VBOX|#AWPB_GUILO_SIZER_REL
  Else
    Flags=#AWPB_GUILO_SIZER_VBOX|#AWPB_GUILO_SIZER_FIX
  EndIf
  
  FindMapElement(*layout(), Str(number))
  
  ProcedureReturn *layout()\AddSizer(parent, Flags, Size) 
EndProcedure

Procedure.i HBOXLayout(number.l,parent.i,Size.l,relatif.b=#True)
  Protected Flags.i
  If relatif = #True
    Flags=#AWPB_GUILO_SIZER_HBOX|#AWPB_GUILO_SIZER_REL
  Else
    Flags=#AWPB_GUILO_SIZER_HBOX|#AWPB_GUILO_SIZER_FIX
  EndIf
  
  FindMapElement(*layout(), Str(number))
  
  ProcedureReturn *layout()\AddSizer(parent, Flags, Size) 
EndProcedure

Procedure.i AddGadgetLayout(number.l,parent.i, gadget.l, Size.l, Left.l=0, Top.l=0, right.l=0, bottom.l=0, OnResizeBefore.l=0, OnResizeAfter.l=0);, *OnResizeCallback.OnGadgetResize_Proto = #Null); A faire...
  
  FindMapElement(*layout(), Str(number))
  
  ProcedureReturn *layout()\AddGadget(parent, gadget,  size,left,top,right,bottom, OnResizeBefore, OnResizeAfter );,@OnResizeCallback) 
EndProcedure

Procedure.i VFRAMELayout(number.l,parent.i, gadget.l, size.l, left.l=0, top.l=0, right.l=0, bottom.l=0, relatif.b=#True, InnerBorderLeft.i = #PB_Any, InnerBorderTop.i = #PB_Any, InnerBorderRight.i = #PB_Any, InnerBorderBottom.i = #PB_Any);, *OnResizeCallback.OnGadgetResize_Proto = #Null); A faire...
  
  Protected flags.b
  If relatif = #True
    flags=#AWPB_GUILO_SIZER_VBOX|#AWPB_GUILO_SIZER_REL
  Else
    flags=#AWPB_GUILO_SIZER_VBOX|#AWPB_GUILO_SIZER_FIX
  EndIf
  
  FindMapElement(*layout(), Str(number))
  
  ProcedureReturn *layout()\AddFramedSizer(parent, gadget, flags, size,left,top,right,bottom, InnerBorderLeft, InnerBorderTop, InnerBorderRight, InnerBorderBottom);,@OnResizeCallback) 
EndProcedure

Procedure.i HFRAMELayout(number.l,parent.i, gadget.l, size.l, left.l=0, top.l=0, right.l=0, bottom.l=0, relatif.b=#True, InnerBorderLeft.i = #PB_Any, InnerBorderTop.i = #PB_Any, InnerBorderRight.i = #PB_Any, InnerBorderBottom.i = #PB_Any);, *OnResizeCallback.OnGadgetResize_Proto = #Null); A faire...
  
  Protected flags.b
  If relatif = #True
    flags=#AWPB_GUILO_SIZER_HBOX|#AWPB_GUILO_SIZER_REL
  Else
    flags=#AWPB_GUILO_SIZER_HBOX|#AWPB_GUILO_SIZER_FIX
  EndIf
  
  FindMapElement(*layout(), Str(number))
  
  ProcedureReturn *layout()\AddFramedSizer(parent, gadget, flags, size,left,top,right,bottom, InnerBorderLeft, InnerBorderTop, InnerBorderRight, InnerBorderBottom);,@OnResizeCallback) 
EndProcedure

Procedure.b AddSpacer(number.l, Parent.i, size.i)
  
  FindMapElement(*layout(), Str(number))
  
  ProcedureReturn *layout()\AddSpacer(Parent,size)
EndProcedure

; Procedure EndOneLayout(number.l)
;   
;   FindMapElement(*layout(), Str(number))
;   ProcedureReturn *layout()\Finish()
;   
; EndProcedure
; 
; Procedure FreeOneLayout(number.l)
;   
;   FindMapElement(*layout(), Str(number))
;   *layout()\Destroy()
;   
; EndProcedure
; 
Procedure ResizeOneLayout(number.l)
  
  FindMapElement(*layout(), Str(number))
  
  *layout()\Resize()
  
EndProcedure


Procedure EndLayout();EndLayoutAll()
  ForEach *layout()
    *layout()\Finish() 
  Next *layout()
EndProcedure

Procedure FreeLayout();FreeLayoutAll()
  ForEach *layout()
    *layout()\Destroy()
  Next *layout()
EndProcedure

Procedure ResizeLayout(before.b=#False, after.b=#False);ResizeLayoutAll()
  ForEach *layout()
    *layout()\Resize(before, after)
  Next *layout()
EndProcedure

; .: MACROs ===========================
Macro LayoutInitialized
  *layout()
EndMacro

Macro LayoutListInitialized
  *layoutList()
EndMacro
Dernière modification par Mesa le mar. 05/juin/2012 14:45, modifié 1 fois.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: [Tuto] Layouts

Message par Mesa »

Avertissement : Si le positionnement absolu est le plus simple à
utiliser, il n'en est pas de même pour les layouts. Il faut de
la méthode et avoir une idée claire de ce que l'on veut.
Les layouts ne sont pas adaptés pour des maquettes ou des essais
de codes, de projets...

Comment faire ?

Au niveau de vos projets, le chemin de fer est le suivant :

Code : Tout sélectionner

1) XIncludeFile "layout.pbi" 
2) Enumeration
	#win	; numéro de la fenêtre
	#layout ; Numéro du layout
	...	; enumération des fenêtres filles, d'autes layouts,
		; et des gadgets
   EndEnumeration
3) Openwindow(...)
4) Facultatif, s'arrurer que la fenêtre est bien créée
5) Création du layout avec createlayout(#Layout,#win)
6) Facultatif, s'assurer que le layout a bien été créé avec If
               layoutInitialized
7) Création de tous les gadgets sans s'occuper ni des X, des Y,
   largeur, ni hauteur.
8) Création des boîtes de redimensionnement avec HBOXLayout(...) 
						 VBOXLayout(...)
						 HFRAMELayout(...)
 					      ou VFRAMELayout(...)
9) Ajouter les gadgets dans les boîtes de redimensionnement avec
   AddGadgetLayout(...)
10) Fermer le layout avec Endlayout()
11) Ajouter dans la boucle principale 
	Case #PB_Event_SizeWindow
	ResizeLayout()
12) Facultatif, libérez les ressources avec FreeLayout() après la
    boucle
13) End.

A savoir :
En général, on n'utillise qu'un seul layout par fenêtre.
Une exception toutefois est l'utilisation du splittergadget qui
Réclame 3 layouts. Nous verrons un exemple plus tard.


Aperçu du code:

Code : Tout sélectionner

XIncludeFile "layout.pbi"

Enumeration
  #win
  #layout
  #gdg0
  ...
EndEnumeration


OpenWindow(#win, ...)
If IsWindow(#win)
  CreateLayout(#layout,#win) 
  If LayoutInitialized  
    ButtonGadget(#gdg0, 0, 0, 0, 0, "...)
   ...
    
    vBOX1 = VBOXLayout(#layout,...)     
    AddGadgetLayout(#layout,...) 
   
  ...
    
    EndLayout()  ; Fermeture du Layout    
    
    
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_SizeWindow
          ResizeLayout()          
        ...
      EndSelect
    ForEver
    
    FreeLayout() 
    
  Else
    MessageRequester("Erreur", "Impossible de créer le Layout") 
  EndIf
Else
  MessageRequester("Erreur", "Impossible de créer la fenêtre") 
EndIf

End


LES NOUVELLES FONCTIONS :

*Les Layouts*

Code : Tout sélectionner

CreateLayout(#Layout,#Parent)
Crée un Layout. #PB_Any n'est pas encore supporté. #Layout est
le numéro (d'identification) du layout et #Parent est le numéro
(d'identification) du parent qui peut-être une fenêtre ou un
container.


Code : Tout sélectionner

EndLayout()  
Ferme tous les layouts créés avec CreateLayout().


Code : Tout sélectionner

FreeLayout()
Libère la mémoire utilisée par tous les layouts. Fonction
facultative car Purebasic libère de lui-même toutes les ressources
à la fermeture du programme mais sa présence est conseillée.


Code : Tout sélectionner

LayoutInitialized
Est une Macro qui permet de savoir si le layout à bien été créé.
Facultatif mais conseillé.



*Les boîtes de redimensionnement*

Code : Tout sélectionner

Résultat = HBOXLayout(#number,#parent,Size,relatif=#True)
Est un gadget dans lequel des gadgets seront affichés
horizontalement.

Image


Code : Tout sélectionner

Résultat = VBOXLayout(#number,#parent,Size,relatif=#True)
Est un gadget dans lequel des gadgets seront affichés
verticalement.

Image


Code : Tout sélectionner

Résultat = HFRAMELayout(#number,#parent,Size,relatif=#True)
Est un gadget Frame3D dans lequel des gadgets seront affichés
horizontalement.

Image


Code : Tout sélectionner

Résultat = VFRAMELayout(#number,#parent,Size,relatif=#True)
Est un gadget Frame3D dans lequel des gadgets seront affichés
verticalement.

Image



#number est le numéro du Layout, #parent celui du parent.
Le première boîte a pour parent le nombre #null, les autres ont
pour parent le numéro d'une boîte précédente.
Size est la taille en pourcentage si relatif=#True ou en pixel si
relatif=#False

Ajouter un Gadget :

Code : Tout sélectionner

Résultat = AddGadgetLayout(#number,#parent, #gadget, Size, 
Left=0, Top=0, Right=0, Bottom=0, *OnBeforeResize(), *OnAfterResize())
#number est le numéro du Layout, #parent celui du parent.
Size est la taille en pourcentage si relatif du parent = #True
ou en pixel si relatif du parent = #false
Left, Top, Righ et Bottom sont les marges intérieur du gadget en
pixels. OnBeforeResize()et OnAfterResize() sont des fonctions
qui s'exécutent respectivement avant et après un redimension-
-nement


Ajouter un spacer :

Code : Tout sélectionner

Résultat = AddSpacer(#number, #parent, #Size)
Ajoute un espace vide
#number est le numéro du Layout, #parent celui du parent.
Size est la taille en pourcentage si relatif du parent = #True
ou en pixel si relatif du parent = #false




Exemple simple :
**************************************************
* 2 boutons positionnés horizontalement: *
**************************************************


Le code du layout:
-------------------------------

Code : Tout sélectionner

;#win est le numéro de la fenêtre
	;#layout est le numéro du layout

  CreateLayout(#layout,#win)  ; Création du layout

  If LayoutInitialized  ; Teste si le layout est correctement initialisé
    
    ;Création des gadgets sans X, Y, largeur, Hauteur	
    ButtonGadget(#gdg0, 0, 0, 0, 0, "Gadget 0")
    ButtonGadget(#gdg1, 0, 0, 0, 0, "Gadget 1")
    
    ; Création d'une BOX horizontale contenant les gadgets #gdg0 et #gdg1
    hBOX1 = HBOXLayout(#layout,#Null,100)     ; 100% en longeur

    ; Ajout des gadgets dans la HBOX
    AddGadgetLayout(#layout,hBOX1, #gdg0, 50) ; 50%
    AddGadgetLayout(#layout,hBOX1, #gdg1, 50) ; 50% 
     
   
    
    EndLayout()  ; Fermeture du Layout

Image

code entier :

Code : Tout sélectionner

XIncludeFile "layout.pbi"

Enumeration
  #win
  #layout
  #gdg0
  #gdg1
EndEnumeration


OpenWindow(#win, 0, 0, 200, 50, "HBOXLayout", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered )
If IsWindow(#win)
  createlayout(#layout,#win)
  If LayoutInitialized
    ButtonGadget(#gdg0, 0, 0, 0, 0, "Gadget 0")
    ButtonGadget(#gdg1, 0, 0, 0, 0, "Gadget 1") 
    ; Création d'une BOX horizontale contenant les gadgets #gdg0 et #gdg1
    hBOX1 = HBOXLayout(#layout,#Null,100)     ; 100% en longeur
    AddGadgetLayout(#layout,hBOX1, #gdg0, 50) ; 50%
    AddGadgetLayout(#layout,hBOX1, #gdg1, 50) ; 50%
    
    EndLayout()  ; Fermeture du Layout    
     
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_SizeWindow
          ResizeLayout() ; Redimensionnement des gadgets contenus dans le layout
          
        Case #PB_Event_CloseWindow
          Select EventWindow()
            Case win
              CloseWindow(win)
              win = 0
              Break
          EndSelect
      EndSelect
    ForEver
    
    FreeLayout() ; Libération du Layout, facultatif pour la fenêtre mère mais indispensable pour les fenêtres filles
    
  Else
    MessageRequester("Erreur", "Erreur de Layout") 
  EndIf
Else
  MessageRequester("Erreur", "Impossible de créer la fenêtre") 
EndIf

End


Note : Amusez vous à redimensionner la fenêtre !
-------------------------------------------------------------
Puis, essayez avec

Code : Tout sélectionner

AddGadgetLayout(#layout,hBOX1, #gdg0, 50) ; 50%
AddGadgetLayout(#layout,hBOX1, #gdg1, 25) ; 25%
Image

Vous voyez qu'il reste un espace vide de 25%

*Spacer*
Une autre façon de créer un espace vide est d'utiliser un spacer
avec la commande AddSpacer(#number, #parent, #Size)

Code:

Code : Tout sélectionner

XIncludeFile "layout.pbi"
Enumeration
  #win
  #layout
  #gdg0
  #gdg1
EndEnumeration
OpenWindow(#win, 0, 0, 250, 50, "HBOXLayout", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered )
If IsWindow(#win)
  createlayout(#layout,#win)
  If LayoutInitialized
    ButtonGadget(#gdg0, 0, 0, 0, 0, "Gadget 0")
    ButtonGadget(#gdg1, 0, 0, 0, 0, "Gadget 1") 
    ; Création d'une BOX horizontale contenant les gadgets #gdg0 et #gdg1
    hBOX1 = HBOXLayout(#layout,#Null,100)     ; 100% en longeur
    AddGadgetLayout(#layout, hBOX1, #gdg0, 50) ; 50%
    AddGadgetLayout(#layout, hBOX1, #gdg1, 25) ; 25%
    AddSpacer(#layout, hBOX1, 25)	       ; 25 %
    
    EndLayout()  ; Fermeture du Layout    
     
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_SizeWindow
          ResizeLayout() ; Redimensionnement des gadgets contenus dans le layout
          
        Case #PB_Event_CloseWindow
          Select EventWindow()
            Case win
              CloseWindow(win)
              win = 0
              Break
          EndSelect
      EndSelect
    ForEver
    
    FreeLayout() ; Libération du Layout, facultatif pour la fenêtre mère mais indispensable pour les fenêtres filles
    
  Else
    MessageRequester("Erreur", "Erreur de Layout") 
  EndIf
Else
  MessageRequester("Erreur", "Impossible de créer la fenêtre") 
EndIf

End

Exercice : Mettre le spacer entre les 2 gadgets
Réponse :

Code : Tout sélectionner

AddGadgetLayout(#layout, hBOX1, #gdg0, 50) ; 50%
AddSpacer(#layout, hBOX1, 25)	           ; 25 %
AddGadgetLayout(#layout, hBOX1, #gdg1, 25) ; 25%


Remarque : Si vous faites un essai avec un seul gadget, #gdg0,
à 100%, comme cela

Code : Tout sélectionner

AddGadgetLayout(#layout, hBOX1, #gdg0, 100) 
;AddSpacer(#layout, hBOX1, 25)	;pas de spacer           
;AddGadgetLayout(#layout, hBOX1, #gdg1, 25) ;pas de second gadget
Il se peut que vous ayez un petit artefact passager
dans l'affichage et seulement dans ce cas très particulier.


*Les marges*
Ajoutons des marges de 10 pixels tout autour du second gadget.
Remplacez

Code : Tout sélectionner

 AddGadgetLayout(#layout, hBOX1, #gdg0, 100) 
AddSpacer(#layout, hBOX1, 25)	;pas de spacer           
AddGadgetLayout(#layout, hBOX1, #gdg1, 25)
par

Code : Tout sélectionner

AddGadgetLayout(#layout, hBOX1, #gdg0, 50) ; 50%
AddGadgetLayout(#layout, hBOX1, #gdg1, 50,10,10,10,10) ; 50%

Image

Exercice : Faites différents essais
comme AddGadgetLayout(#layout, hBOX1, #gdg1, 50,0,10,0,20)

A suivre...

Mesa.
Dernière modification par Mesa le mar. 05/juin/2012 15:44, modifié 2 fois.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: [Tuto] Layouts

Message par Mesa »

Exemple :
Cherchons à faire cela
Là, nous entrons vraiment dans le monde des layouts.

Image

Une des solutions est celle-ci

Image

Code

Code : Tout sélectionner

XIncludeFile "layout.pbi"

Enumeration
  #win
  #layout
  #gdg0
  #gdg1
  #gdg2
  #gdg3
  #gdg4
  #gdg5
EndEnumeration


OpenWindow(#win, 100, 122, 800, 410, "GUI-Layout-Demo : AMUSEZ-VOUS A REDIMENSIONNER CETTE FENÊTRE ! ! !", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_TitleBar)
If IsWindow(#win) ; Teste si la Fenetre est correctement initialisée
  CreateLayout(#layout,#win)  ; Création du layout
  If LayoutInitialized  ; Teste si le layout est correctement initialisé
    ButtonGadget(#gdg0, 0, 0, 100, 10, "Gadget 0 - sans bordures, 20% hauteur, 100% largeur", #PB_Button_MultiLine)
    ButtonGadget(#gdg1, 0, 0, 100, 10, "Gadget 1 - avec bordures de 10 px, 20% hauteur, 100% largeur", #PB_Button_MultiLine)
    ButtonGadget(#gdg2, 0, 0, 100, 10, "Gadget 2 - sans bordures, 60% hauteur, 50% largeur", #PB_Button_MultiLine)
    ButtonGadget(#gdg3, 0, 0, 100, 10, "Gadget 3 - sans bordures, 30% hauteur, 25% largeur", #PB_Button_MultiLine)
    ButtonGadget(#gdg4, 0, 0, 100, 10, "Gadget 4 - avec bordures de 5 px, 30% hauteur, 25% largeur", #PB_Button_MultiLine)
    ButtonGadget(#gdg5, 0, 0, 100, 10, "Gadget 5 - sans bordures, 60% hauteur, 25% largeur", #PB_Button_MultiLine)
    
    ; Création d'une BOX verticale contenant les gadgets #gdg0 et #gdg1
    vBOX1 = VBOXLayout(#layout,#Null,100)     ; 100% en longeur
    AddGadgetLayout(#layout,vBOX1, #gdg0, 20) ; 20%
    AddGadgetLayout(#layout,vBOX1, #gdg1, 20, 10, 10, 10, 10) ; 20% + marge de 10 pixels tout autour du gadget
    
    ; Création d'une BOX horizontale contenant les gadgets #gdg2 et plus tard une vBOX2
    hBOX1 = HBOXLayout(#layout,vBOX1,60)      ; 60% en hauteur
    AddGadgetLayout(#layout,hBOX1, #gdg2, 50) ; 50 %
    
    ; Création d'une BOX verticale contenant les gadgets #gdg3 et 4 
    vBOX2 = VBOXLayout(#layout,hBOX1,25)      ;25%
    AddGadgetLayout(#layout,vBOX2, #gdg3, 50) ;50%
    AddGadgetLayout(#layout,vBOX2, #gdg4, 50, 5, 5, 5, 5) ; 50% + marge de 5 pixels tout autour du gadget
    ; en fait ici on a intercalé vBOX2 (gadgets 3 et 4) dans hBOX1
    AddGadgetLayout(#layout,hBOX1, #gdg5, 25) ;25%
    
    EndLayout()  ; Fermeture du Layout    
    
    
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_SizeWindow
          ResizeLayout() ; Redimensionnement des gadgets contenus dans le layout
          
        Case #PB_Event_CloseWindow
          Select EventWindow()
            Case win
              CloseWindow(win)
              win = 0
              Break
          EndSelect
      EndSelect
    ForEver
    
    FreeLayout() ; Libération du Layout, facultatif pour la fenêtre mère mais indispensable pour les fenêtres filles
    
  Else
    MessageRequester("Erreur", "Erreur de Layout") 
  EndIf
Else
  MessageRequester("Erreur", "Impossible de créer la fenêtre") 
EndIf

End
Remarque : N'hésitez pas à refaire cet exemple par vous-même.
Il faut faire 4 à 5 exercices avant de maîtriser les layouts


Exemple avec OnAferResize()
La fonction AddGadgetLayout() permet d'utiliser deux pointeurs
vers deux fonctions qui s'exécutent, l'une juste avant un
redimensionnement (OnBeforeResize()) et l'autre juste après
(onAfterResize()).
Attention, la boucle contient une variante de ResizeLayout
Qui est ResizeLayout(Boolean, Boolean)

Code

Code : Tout sélectionner

XIncludeFile "layout.pbi"

Enumeration
  #win
  #layout
  #gdg0
  #gdg1
EndEnumeration

; Procedure qui s'exécute après le redimensionnement de gdg0
ProcedureC OnAfterGdg0Resize(GadgetID.i, Left.i, Top.i, Width.i, Height.i)
  Debug "Left Gadget resized"+Chr(10)+"New Size: "+Str(Width)+"x"+Str(Height)
EndProcedure
; Procedure qui s'exécute après le redimensionnement de gdg1
ProcedureC OnAfterGdg1Resize(GadgetID.i, Left.i, Top.i, Width.i, Height.i)
  Debug "Right Gadget resized"+Chr(10)+"New Size: "+Str(Width)+"x"+Str(Height)
EndProcedure


OpenWindow(#win, 542, 122, 410, 410, "GUI-Layout-Demo", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
If IsWindow(#win)
  createlayout(#layout, #win)
  If LayoutInitialized
    ButtonGadget(#gdg0, 0, 0, 100, 10, "Gadget 0 - 100% hauteur, 50% largeur", #PB_Button_MultiLine)
    ButtonGadget(#gdg1, 0, 0, 100, 10, "Gadget 1 - avec bordures de 10 px, 1hauteur, 50% largeur", #PB_Button_MultiLine)
    
    HBOX1   = HBOXLayout(#layout, #Null, 100)
    
    ;OnAfterGdgxResize() sont des fonctions qui seront executées après un redimensionnement.
    AddGadgetLayout(#layout,HBOX1, #gdg0, 50, 0, 0, 0, 0, 0, @OnAfterGdg0Resize())
    AddGadgetLayout(#layout,HBOX1,#gdg1, 50, 10, 10, 10, 10,0, @OnAfterGdg1Resize())
    
    EndLayout()
    
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_SizeWindow
          ResizeLayout(#False, #True); Attention ici paramètres
        Case #PB_Event_CloseWindow
          Select EventWindow()
            Case win
              CloseWindow(win)
              win = 0
              Break
          EndSelect
      EndSelect
    ForEver
    
    FreeLayout()
  Else
    MessageRequester("Erreur", "Erreur de layout") 
  EndIf
Else
  MessageRequester("Erreur", "Impossible de créer la fenêtre")   
EndIf

End


Exemple SplitterGadget :
****************************************
* Utilisation d'un splittergadget *
****************************************

Image

Dans le cas du splitterGadget, il faut un Layout principal conte-
-nant le splittergadget, et deux Layouts, un pour le container
de gauche un pour le container de droite.

Dans la boucle principale, on ajoute ce code :

Code : Tout sélectionner

Case #PB_Event_Gadget
              Select EventGadget()
             ; Redimensionnement par le splitter
                Case #splitter0
                           ResizeLayout()
Le reste ne change pas.

Code :

Code : Tout sélectionner

XIncludeFile "layout.pbi"

Enumeration
  #win
  #layout
  #layoutCon0
  #layoutCon1
  #con0
  #con1
  #gdg0
  #gdg1
  #gdg2
  #gdg3
  #gdg4
  #spl0
EndEnumeration


OpenWindow(#win, 50, 122, 800, 410, "GUI-Layout-Demo Splitter : AMUSEZ-VOUS A REDIMENSIONNER CETTE FENÊTRE ! ! !", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_TitleBar)
If IsWindow(#win)
  ContainerGadget(#con0, 0, 0, 100, 10, #PB_Container_Single)
  ButtonGadget(#gdg0, 0, 0, 100, 10, "Gadget 0 - 50% en largeur côté gauche", #PB_Button_MultiLine)
  ButtonGadget(#gdg1, 0, 0, 100, 10, "Gadget 1 - 50% en largeur côté gauche", #PB_Button_MultiLine)
  CloseGadgetList()
  ContainerGadget(#con1, 0, 0, 100, 10, #PB_Container_Single)
  ButtonGadget(#gdg2, 0, 0, 100, 10, "Gadget 2 - 30% en hauteur côté droit", #PB_Button_MultiLine)
  ButtonGadget(#gdg3, 0, 0, 100, 10, "Gadget 3 - 40% en hauteur côté droit", #PB_Button_MultiLine)
  ButtonGadget(#gdg4, 0, 0, 100, 10, "Gadget 4 - 30% en hauteur côté droit", #PB_Button_MultiLine)
  CloseGadgetList()
  SplitterGadget(#spl0, 0, 1, 100, 10, #con0, #con1, #PB_Splitter_Separator|#PB_Splitter_Vertical)
  
  
  
  CreateLayout(#layout,#win)          ; Création du layout pour le splitter
  If LayoutInitialized                ; Teste si le layout est correctement initialisé
    CreateLayout(#layoutCon0,#con0)   ; Création du layout pour le container de gauche
    If LayoutInitialized              ; Teste si le layout est correctement initialisé
      CreateLayout(#layoutCon1,#con1) ; Création du layout pour le container de droite
      If LayoutInitialized            ; Teste si le layout est correctement initialisé
        
        AddGadgetLayout(#layout,#Null,  #spl0, 100) ; Ajout du splitter dans #layout 100%
        
        ; Création d'une BOX horizontale contenant les gadgets #gdg0 et #gdg1 : Panneau gauche
        hBOX1= HBOXLayout(#layoutCon0,#Null,100)       ; 100%
        AddGadgetLayout(#layoutCon0, hBOX1, #gdg0, 50) ; 50%
        AddGadgetLayout(#layoutCon0, hBOX1, #gdg1, 50) ; 50%
        
        ; Création d'une BOX verticale contenant les gadgets #gdg2, #gdg3 et #gdg4 : Panneau droit    
        vBOX1=VBOXLayout(#layoutCon1,#Null,100)        ; 100%
        AddGadgetLayout(#layoutCon1, vBOX1, #gdg2, 30) ; 30%
        AddGadgetLayout(#layoutCon1, vBOX1, #gdg3, 40) ; 40%
        AddGadgetLayout(#layoutCon1, vBOX1, #gdg4, 30) ; 30%
        
        EndLayout()  ; Fermeture des Layouts     
        
        Repeat
          Select WaitWindowEvent()
            Case #PB_Event_Gadget
              Select EventGadget()
                Case #spl0           ; Redimensionnement par le splitter
                  ResizeLayout()     ; Redimensionnement des gadgets contenus dans les layouts
                  lp = GetGadgetState(#spl0)
                  Debug lp	
                  
              EndSelect       
            Case #PB_Event_SizeWindow  ; Redimensionnement de la fenêtre
              ResizeLayout()           ; Redimensionnement des gadgets contenus dans le layout
              
            Case #PB_Event_CloseWindow
              Select EventWindow()
                Case #win
                  CloseWindow(#win)
                  Break
              EndSelect
          EndSelect
        ForEver
        
        
      Else
        MessageRequester("Erreur", "Erreur de layout container droit") 
      EndIf
      
    Else
      MessageRequester("Erreur", "Erreur de layout container gauche") 
    EndIf
    FreeLayout()
  Else
    MessageRequester("Erreur", "Erreur de layout") 
  EndIf
Else
  MessageRequester("Erreur", "Impossible de créer la fenêtre") 
EndIf

End
A suivre...

Mesa.
Dernière modification par Mesa le mar. 05/juin/2012 15:11, modifié 1 fois.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: [Tuto] Layouts

Message par Mesa »

Les conteneurs : Frame3D et autres.

Exemples Frame3D :
***********************************************
* Utilisation d'un frame3D Horizontal : *
***********************************************

On utilise une boîte de redimensionnement HFRAMELayout()
Image

Image

Code :

Code : Tout sélectionner

XIncludeFile "layout.pbi"

Enumeration
  #win
  #layout
  #option_1
  #option_2
  #option_3
  #Frame0
EndEnumeration


OpenWindow(#win, 542, 122, 410, 410, "HFRAMELayout", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
If IsWindow(#win)
  createlayout(#layout,#win)
  If LayoutInitialized
    Frame3DGadget(#Frame0, 0, 0, 1, 1, "Frame 0 ")
    OptionGadget(#option_1, 0, 0, 1, 1, "Option 1")
    OptionGadget(#option_2, 0, 0, 1, 1, "Option 2")
    OptionGadget(#option_3, 0, 0, 1, 1, "Option 3")
    SetGadgetState(#option_2, 1)
    s1  = VBOXLayout(#layout,#Null,100)
    fs0 = HFRAMELayout(#layout,s1,#Frame0,20)
    AddGadgetLayout(#layout,fs0,#option_1, 34)
    AddGadgetLayout(#layout,fs0,#option_2, 33)
    AddGadgetLayout(#layout,fs0,#option_3, 33)
    EndLayout()  ; Fermeture du Layout    
    
    
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_SizeWindow
          ResizeLayout() ; Redimensionnement des gadgets contenus dans le layout
          
        Case #PB_Event_CloseWindow
          Select EventWindow()
            Case win
              CloseWindow(win)
              win = 0
              Break
          EndSelect
      EndSelect
    ForEver
    
    FreeLayout() ; Libération du Layout, facultatif pour la fenêtre mère mais indispensable pour les fenêtres filles
    
  Else
    MessageRequester("Erreur", "Erreur de Layout") 
  EndIf
Else
  MessageRequester("Erreur", "Impossible de créer la fenêtre") 
EndIf

End

*********************************************
* Utilisation d'un frame3D Verticale : *
*********************************************

On utilise une boîte de redimensionnement VFRAMELayout()
Image

Code :

Code : Tout sélectionner

XIncludeFile "layout.pbi"

Enumeration
  #win
  #layout
  #option_1
  #option_2
  #option_3
  #Frame0
EndEnumeration


OpenWindow(#win, 542, 122, 410, 410, "HFRAMELayout", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
If IsWindow(#win)
  createlayout(#layout,#win)
  If LayoutInitialized
    Frame3DGadget(#Frame0, 0, 0, 1, 1, "Frame 0 ")
    OptionGadget(#option_1, 0, 0, 1, 1, "Option 1")
    OptionGadget(#option_2, 0, 0, 1, 1, "Option 2")
    OptionGadget(#option_3, 0, 0, 1, 1, "Option 3")
    SetGadgetState(#option_2, 1)
    s1  = VBOXLayout(#layout,#Null,100)
    fs0 = VFRAMELayout(#layout,s1,#Frame0,20)
    AddGadgetLayout(#layout,fs0,#option_1, 34)
    AddGadgetLayout(#layout,fs0,#option_2, 33)
    AddGadgetLayout(#layout,fs0,#option_3, 33)
    EndLayout()  ; Fermeture du Layout    
    
    
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_SizeWindow
          ResizeLayout() ; Redimensionnement des gadgets contenus dans le layout
          
        Case #PB_Event_CloseWindow
          Select EventWindow()
            Case win
              CloseWindow(win)
              win = 0
              Break
          EndSelect
      EndSelect
    ForEver
    
    FreeLayout() ; Libération du Layout, facultatif pour la fenêtre mère mais indispensable pour les fenêtres filles
    
  Else
    MessageRequester("Erreur", "Erreur de Layout") 
  EndIf
Else
  MessageRequester("Erreur", "Impossible de créer la fenêtre") 
EndIf

End

Layout et positionnement absolu.
Bien que le positionnement absolu aille à l'encontre de la
"philosophie" des layouts, il est tout de même possible de
s'en servir.
Regardez:
Image

Code : Vous aurez besoin de Fitgadget.pbi ou fitgadgetfreak.pbi

Fitgadget.pbi

Code : Tout sélectionner

;Code SROD

;EnableExplicit

Procedure.l GetTextWidthPix(NumGadget, espace=1)
  Protected result, hdc, tm.TEXTMETRIC, abc.ABC, overhang, hFont, char,lpSize.SIZE 
  ;espace : null-terminated + pour la checkbox par exemple, il faut ajouter la largeur d'un espace au texte 
  hDC = GetDC_(GadgetID(NumGadget))
  hFont = SendMessage_(GadgetID(NumGadget),#WM_GETFONT,0,0)
  If hFont And hDC
    SelectObject_(hDC,hFont)
  EndIf
  GetTextExtentPoint32_(hDC, GetGadgetText(NumGadget), Len(GetGadgetText(NumGadget)) + espace, lpSize)
  ;Ajustement qui depend du type de font; raster ou true/open type.
  GetTextMetrics_(hdc, tm)
  ;*sz\cy=tm\tmHeight-tm\tmInternalLeading ;on peut enlever le internal leading height
  If tm\tmOverhang ;Raster font.
    lpSize\cx + tm\tmOverhang
  Else
    char = Asc(Right(GetGadgetText(NumGadget),1))
    GetCharABCWidths_(hdc, char, char, abc) 
    overhang = abc\abcC
    If overHang < 0
      lpSize\cx - overHang
    EndIf
  EndIf
  
  SelectObject_(hdc, hFont)
  ReleaseDC_(GadgetID(NumGadget), hdc)
  result=lpSize\cx
  
  ProcedureReturn result
EndProcedure

Procedure.l GetTextHeightPix(NumGadget, espace=8)
  Protected result, hdc, tm.TEXTMETRIC, abc.ABC, overhang, hFont, char, lpSize.SIZE
  ; pourquoi 8 ????? 
  hDC = GetDC_(GadgetID(NumGadget))
  hFont = SendMessage_(GadgetID(NumGadget),#WM_GETFONT,0,0)
  If hFont And hDC
    SelectObject_(hDC,hFont)
  EndIf
  GetTextExtentPoint32_(hDC, GetGadgetText(NumGadget), Len(GetGadgetText(NumGadget)), lpSize)
  ;Ajustement qui depend du type de font; raster ou true/open type.
  GetTextMetrics_(hdc, tm)
  ;*sz\cy=tm\tmHeight-tm\tmInternalLeading ;on peut enlever le internal leading height
  If tm\tmOverhang ;Raster font.
    lpSize\cx + tm\tmOverhang
  Else
    char = Asc(Right(GetGadgetText(NumGadget),1))
    GetCharABCWidths_(hdc, char, char, abc) 
    overhang = abc\abcC
    If overHang < 0
      lpSize\cx - overHang
    EndIf
  EndIf
  
  SelectObject_(hdc, hFont)
  ReleaseDC_(GadgetID(NumGadget), hdc)
  result=lpSize\cy + espace
  
  ProcedureReturn result
EndProcedure


;Code Mesa 2012
Procedure.l GetHigherTextInListWidthPix(NumGadget)
  Protected result, hdc, tm.TEXTMETRIC, abc.ABC, overhang, hFont, char, Max, n, i, lg, lpSize.SIZE
  ;espace : null-terminated + pour la checkbox par exemple, il faut ajouter la largeur d'un espace au texte 
  hDC = GetDC_(GadgetID(NumGadget))
  hFont = SendMessage_(GadgetID(NumGadget),#WM_GETFONT,0,0)
  If hFont And hDC
    SelectObject_(hDC,hFont)
  EndIf
  n=0 
  Max=0
  For i=0 To CountGadgetItems(NumGadget)-1
    GetTextExtentPoint32_(hDC, GetGadgetItemText(NumGadget,i), Len(GetGadgetItemText(NumGadget,i)) , lpSize)
    
    If lpSize\cy>Max
      Max=lpSize\cy
      n=i
    EndIf
    
  Next i
  lpSize\cy=Max
  
  SelectObject_(hdc, hFont)
  ReleaseDC_(GadgetID(NumGadget), hdc)
  result=lpSize\cy
  
  ProcedureReturn result
EndProcedure  

Procedure.l GetLongerTextInListWidthPix(NumGadget)
  Protected result, hdc, tm.TEXTMETRIC, abc.ABC, overhang, hFont, char, Max, n, i, lg, lpSize.SIZE
  ;espace : null-terminated + pour la checkbox par exemple, il faut ajouter la largeur d'un espace au texte 
  hDC = GetDC_(GadgetID(NumGadget))
  hFont = SendMessage_(GadgetID(NumGadget),#WM_GETFONT,0,0)
  If hFont And hDC
    SelectObject_(hDC,hFont)
  EndIf
  n=0 
  Max=0
  For i=0 To CountGadgetItems(NumGadget)-1
    GetTextExtentPoint32_(hDC, GetGadgetItemText(NumGadget,i), Len(GetGadgetItemText(NumGadget,i)) , lpSize)
    
    If lpSize\cx>Max
      Max=lpSize\cx
      n=i
    EndIf
    
  Next i
  lpSize\cx=Max
  ;Ajustement qui depend du type de font; raster ou true/open type.
  GetTextMetrics_(hdc, tm)
  ;*sz\cy=tm\tmHeight-tm\tmInternalLeading ;on peut enlever le internal leading height
  If tm\tmOverhang ;Raster font.
    lpSize\cx + tm\tmOverhang
  Else
    char = Asc(Right(GetGadgetItemText(NumGadget,n),1))
    GetCharABCWidths_(hdc, char, char, abc) 
    overhang = abc\abcC
    If overHang < 0
      lpSize\cx - overHang
    EndIf
  EndIf
  
  SelectObject_(hdc, hFont)
  ReleaseDC_(GadgetID(NumGadget), hdc)
  result=lpSize\cx
  
  ProcedureReturn result
EndProcedure  

Procedure.l FitGadget(NumGadget, En_Longueur.b=#True, En_Hauteur.b=#True, Option.l=-1)
  Protected  DC, tm.TEXTMETRIC, abc.ABC, overhang, hFont, char, ncm.NONCLIENTMETRICS
  Protected Hauteur_case_a_cocher, rc.RECT,sz.SIZE, os, bordure, marge, handleimagelist, okBOOL
  Protected old$, min, max
  Protected BCM_FIRST, BCM_GETIDEALSIZE, BCM_GETTEXTMARGIN, MCM_FIRST, MCM_GETCALENDARBORDER,CBEM_GETIMAGELIST
  Protected pImageInfo.IMAGEINFO
  
  Select GadgetType(NumGadget)
    Case #PB_GadgetType_Button ;================ 
      BCM_FIRST            = $1600
      BCM_GETIDEALSIZE     = (BCM_FIRST + $0001) 
      If SendMessage_(GadgetID(NumGadget),BCM_GETIDEALSIZE,0,sz) = #True
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , sz\cx,sz\cy)
      EndIf
      
    Case #PB_GadgetType_Option ;================
      ncm\cbSize = SizeOf(NONCLIENTMETRICS)
      SystemParametersInfo_(#SPI_GETNONCLIENTMETRICS, SizeOf(NONCLIENTMETRICS), @ncm, 0)
      DC = GetDC_(0)
      Hauteur_case_a_cocher=Abs(ncm\lfMessageFont\lfheight); c'est aussi sa longueur
      ; GetDeviceCaps_(DC, #LOGPIXELSY)
      ReleaseDC_(0, DC)
      BCM_FIRST            = $1600
      BCM_GETTEXTMARGIN    = BCM_FIRST + $0005
      SendMessage_(GadgetID(NumGadget),BCM_GETTEXTMARGIN,0,rc)
      ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , rc\left+rc\right+Hauteur_case_a_cocher+GetTextWidthPix(NumGadget, 1),GetTextHeightPix(NumGadget,0))
      
    Case #PB_GadgetType_CheckBox ;================
      ncm\cbSize = SizeOf(NONCLIENTMETRICS)
      SystemParametersInfo_(#SPI_GETNONCLIENTMETRICS, SizeOf(NONCLIENTMETRICS), @ncm, 0)
      DC = GetDC_(0)
      Hauteur_case_a_cocher=Abs(ncm\lfMessageFont\lfheight); c'est aussi sa longueur
      ; GetDeviceCaps_(DC, #LOGPIXELSY)
      ReleaseDC_(0, DC)
      BCM_FIRST            = $1600
      BCM_GETTEXTMARGIN    = BCM_FIRST + $0005
      SendMessage_(GadgetID(NumGadget),BCM_GETTEXTMARGIN,0,rc)
      ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , rc\left+rc\right+Hauteur_case_a_cocher+GetTextWidthPix(NumGadget, 1),GetTextHeightPix(NumGadget,0))
      
    Case #PB_GadgetType_Calendar ;================
      SendMessage_(GadgetID(NumGadget),#MCM_GETMINREQRECT,0,rc)
      
      ;        If option= #PB_Calendar_Borderless 
      ;         ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , rc\Right,rc\bottom)
      ;         
      ;       Else
      os=OSVersion()
      If  os=#PB_OS_Windows_Vista Or os=#PB_OS_Windows_Server_2008 Or os= #PB_OS_Windows_7 Or os=#PB_OS_Windows_Future
        MCM_FIRST               = $1000
        MCM_GETCALENDARBORDER   = MCM_FIRST + 31
        bordure= SendMessage_(GadgetID(NumGadget),MCM_GETCALENDARBORDER,0,0)
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , rc\Right+bordure,rc\bottom+bordure)
      Else
        
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , rc\Right+4,rc\bottom+4)
      EndIf
      ;EndIf
      ;========================================================================  
    Case #PB_GadgetType_ComboBox ;================
      CBEM_GETIMAGELIST=1027
      marge=4
      ;Image presente ?
      handleimagelist= SendMessage_(GadgetID(NumGadget),CBEM_GETIMAGELIST ,0,0)
      If handleimagelist
        ;Retrieves information about an image. 
        okBOOL= ImageList_GetImageInfo_(handleimagelist,1,pImageInfo)
        marge+pImageInfo\rcImage\right+4
        If GetTextHeightPix(NumGadget)>pImageInfo\rcImage\bottom
          ;longueur dropdown =26
          ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , 26+marge+GetLongerTextInListWidthPix(NumGadget),GetTextHeightPix(NumGadget))
        Else
          ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , 26+marge+GetLongerTextInListWidthPix(NumGadget),0) 
        EndIf
      Else
        
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , 26+marge+GetLongerTextInListWidthPix(NumGadget),0);GetTextHeightPix(NumGadget)
      EndIf
      
    Case #PB_GadgetType_Date ;================
      ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , 26+GetTextWidthPix(NumGadget),GetTextHeightPix(NumGadget))
      
    Case #PB_GadgetType_Editor ;================
      marge=4
      
      ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , marge+GetLongerTextInListWidthPix(NumGadget),(CountGadgetItems(NumGadget)-1)*GetHigherTextInListWidthPix(NumGadget)) 
      
    Case #PB_GadgetType_String ;================
      marge=SendMessage_(GadgetID(NumGadget),#EM_GETMARGINS,0,0)
      ;Returns the width of the left margin in the LOWORD, And the width of the right margin in the HIWORD.
      ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , 4+(marge & $FFFF)+((marge >> 16) & $FFFF)+GetTextWidthPix(NumGadget),GetTextHeightPix(NumGadget)) 
      
    Case #PB_GadgetType_Text ;================
      ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , GetTextWidthPix(NumGadget,0),GetTextHeightPix(NumGadget,0)) 
      
    Case #PB_GadgetType_HyperLink ;================
      If option=#PB_HyperLink_Underline
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , GetTextWidthPix(NumGadget,0),GetTextHeightPix(NumGadget)) 
      Else
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , GetTextWidthPix(NumGadget,0),GetTextHeightPix(NumGadget,0))  
      EndIf
      
    Case #PB_GadgetType_Spin ;================
      old$=GetGadgetText(NumGadget)
      min=GetGadgetAttribute(NumGadget, #PB_Spin_Minimum);#PB_Spin_Maximum
      SetGadgetText(NumGadget, Str(min))
      min=GetTextWidthPix(NumGadget,0)
      
      max=GetGadgetAttribute(NumGadget, #PB_Spin_Maximum)
      SetGadgetText(NumGadget, Str(max))
      max=GetTextWidthPix(NumGadget,0)
      
      SetGadgetText(NumGadget, old$)
      marge=20
      If max>=min
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , marge+max,GetTextHeightPix(NumGadget))
      Else
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , marge+min,GetTextHeightPix(NumGadget))  
      EndIf 
      
    Case #PB_GadgetType_ButtonImage ;================ 
      If option <> -1
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , ImageWidth(option),ImageHeight(option))  
      EndIf 
      
      ;Case #PB_GadgetType_Image;no effects ;================
      
      ;Case #PB_GadgetType_IPAddress;There's a bug somewhere ;================
      ;old=GetGadgetState(NumGadget)
      ;SetGadgetState(NumGadget, MakeIPAddress(192, 192, 192, 192))
      ;ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , GetTextWidthPix(NumGadget),GetTextHeightPix(NumGadget))  
      ;SetGadgetState(NumGadget, old)  
      
    Case  #PB_GadgetType_ListView ;================
      marge=28
      min=SendMessage_(GadgetID(NumGadget),#LB_GETITEMHEIGHT,0,0)
      ;ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , marge+GetLongerTextInListWidthPix(NumGadget),CountGadgetItems(NumGadget)*GetTextHeightPix(NumGadget))         
      If option = -1 ; all
        ;ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , marge+GetLongerTextInListWidthPix(NumGadget),CountGadgetItems(NumGadget)*GetTextHeightPix(NumGadget))
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , marge+GetLongerTextInListWidthPix(NumGadget),min*(CountGadgetItems(NumGadget)+1))  
      Else
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , marge+GetLongerTextInListWidthPix(NumGadget),#PB_Ignore) 
      EndIf
      
  EndSelect
  ProcedureReturn #True
EndProcedure 

Procedure.l FitGadgetW(NumGadget, En_Longueur.b=#True, En_Hauteur.b=#True, Option.l=-1)
  Protected  DC, tm.TEXTMETRIC, abc.ABC, overhang, hFont, char, ncm.NONCLIENTMETRICS
  Protected Hauteur_case_a_cocher, rc.RECT,sz.SIZE, os, bordure, marge, handleimagelist, okBOOL
  Protected old$, min, max
  Protected BCM_FIRST, BCM_GETIDEALSIZE, BCM_GETTEXTMARGIN, MCM_FIRST, MCM_GETCALENDARBORDER,CBEM_GETIMAGELIST
  Protected pImageInfo.IMAGEINFO
  Protected w,h
  
  Select GadgetType(NumGadget)
    Case #PB_GadgetType_Button ;================ 
      BCM_FIRST            = $1600
      BCM_GETIDEALSIZE     = (BCM_FIRST + $0001) 
      If SendMessage_(GadgetID(NumGadget),BCM_GETIDEALSIZE,0,sz) = #True
        w=sz\cx
        h=sz\cy
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , w,h)
      EndIf
      
    Case #PB_GadgetType_Option ;================
      ncm\cbSize = SizeOf(NONCLIENTMETRICS)
      SystemParametersInfo_(#SPI_GETNONCLIENTMETRICS, SizeOf(NONCLIENTMETRICS), @ncm, 0)
      DC = GetDC_(0)
      Hauteur_case_a_cocher=Abs(ncm\lfMessageFont\lfheight); c'est aussi sa longueur
      ; GetDeviceCaps_(DC, #LOGPIXELSY)
      ReleaseDC_(0, DC)
      BCM_FIRST            = $1600
      BCM_GETTEXTMARGIN    = BCM_FIRST + $0005
      SendMessage_(GadgetID(NumGadget),BCM_GETTEXTMARGIN,0,rc)
      w=rc\left+rc\right+Hauteur_case_a_cocher+GetTextWidthPix(NumGadget, 1)
      h=GetTextHeightPix(NumGadget,0)
      ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , w,h)
      
    Case #PB_GadgetType_CheckBox ;================
      ncm\cbSize = SizeOf(NONCLIENTMETRICS)
      SystemParametersInfo_(#SPI_GETNONCLIENTMETRICS, SizeOf(NONCLIENTMETRICS), @ncm, 0)
      DC = GetDC_(0)
      Hauteur_case_a_cocher=Abs(ncm\lfMessageFont\lfheight); c'est aussi sa longueur
      ; GetDeviceCaps_(DC, #LOGPIXELSY)
      ReleaseDC_(0, DC)
      BCM_FIRST            = $1600
      BCM_GETTEXTMARGIN    = BCM_FIRST + $0005
      SendMessage_(GadgetID(NumGadget),BCM_GETTEXTMARGIN,0,rc)
      w=rc\left+rc\right+Hauteur_case_a_cocher+GetTextWidthPix(NumGadget, 1)
      h=GetTextHeightPix(NumGadget,0)
      ResizeGadget(NumGadget, #PB_Ignore, #PB_Ignore, w, h)
      
    Case #PB_GadgetType_Calendar ;================
      SendMessage_(GadgetID(NumGadget),#MCM_GETMINREQRECT,0,rc)
      
      ;        If option= #PB_Calendar_Borderless 
      ;         ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , rc\Right,rc\bottom)
      ;         
      ;       Else
      os=OSVersion()
      If  os=#PB_OS_Windows_Vista Or os=#PB_OS_Windows_Server_2008 Or os= #PB_OS_Windows_7 Or os=#PB_OS_Windows_Future
        MCM_FIRST               = $1000
        MCM_GETCALENDARBORDER   = MCM_FIRST + 31
        bordure= SendMessage_(GadgetID(NumGadget),MCM_GETCALENDARBORDER,0,0)
        w=rc\Right+bordure
        h=rc\bottom+bordure
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , w,h)
      Else
        w=rc\Right+4
        h=rc\bottom+4
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , w,h)
      EndIf
      ;EndIf
      ;========================================================================  
    Case #PB_GadgetType_ComboBox ;================
      CBEM_GETIMAGELIST=1027
      marge=4
      ;Image presente ?
      handleimagelist= SendMessage_(GadgetID(NumGadget),CBEM_GETIMAGELIST ,0,0)
      If handleimagelist
        ;Retrieves information about an image. 
        okBOOL= ImageList_GetImageInfo_(handleimagelist,1,pImageInfo)
        marge+pImageInfo\rcImage\right+4
        If GetTextHeightPix(NumGadget)>pImageInfo\rcImage\bottom
          ;longueur dropdown =26
          w=26+marge+GetLongerTextInListWidthPix(NumGadget)
          h=GetTextHeightPix(NumGadget)
          ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , w,h)
        Else
          w=26+marge+GetLongerTextInListWidthPix(NumGadget)
          h=0
          ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore ,w ,h ) 
        EndIf
      Else
        w=26+marge+GetLongerTextInListWidthPix(NumGadget)
        h=0
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , w,h);GetTextHeightPix(NumGadget)
      EndIf
      
    Case #PB_GadgetType_Date ;================
      w=26+GetTextWidthPix(NumGadget)
      h=GetTextHeightPix(NumGadget)
      ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , w,h)
      
    Case #PB_GadgetType_Editor ;================
      marge=4
      w=marge+GetLongerTextInListWidthPix(NumGadget)
      h=(CountGadgetItems(NumGadget)-1)*GetHigherTextInListWidthPix(NumGadget)
      
      ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , w,h) 
      
    Case #PB_GadgetType_String ;================
      marge=SendMessage_(GadgetID(NumGadget),#EM_GETMARGINS,0,0)
      ;Returns the width of the left margin in the LOWORD, And the width of the right margin in the HIWORD.
      w=4+(marge & $FFFF)+((marge >> 16) & $FFFF)+GetTextWidthPix(NumGadget)
      h=GetTextHeightPix(NumGadget)
      ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore ,w ,h) 
      
    Case #PB_GadgetType_Text ;================
      w=GetTextWidthPix(NumGadget,0)
      h=GetTextHeightPix(NumGadget,0)
      ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore ,w ,h) 
      
    Case #PB_GadgetType_HyperLink ;================
      w=GetTextWidthPix(NumGadget,0)
      If option=#PB_HyperLink_Underline
        h=GetTextHeightPix(NumGadget)
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore ,w ,h) 
      Else
        h=GetTextHeightPix(NumGadget,0)
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , w,h)  
      EndIf
      
    Case #PB_GadgetType_Spin ;================
      old$=GetGadgetText(NumGadget)
      min=GetGadgetAttribute(NumGadget, #PB_Spin_Minimum);#PB_Spin_Maximum
      SetGadgetText(NumGadget, Str(min))
      min=GetTextWidthPix(NumGadget,0)
      
      max=GetGadgetAttribute(NumGadget, #PB_Spin_Maximum)
      SetGadgetText(NumGadget, Str(max))
      max=GetTextWidthPix(NumGadget,0)
      
      SetGadgetText(NumGadget, old$)
      marge=20
      h=GetTextHeightPix(NumGadget)
      If max>=min
        w=marge+max
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore ,w ,h)
      Else
        w=marge+min
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore ,w ,h)  
      EndIf 
      
    Case #PB_GadgetType_ButtonImage ;================ 
      If option <> -1
        w=ImageWidth(option)
        h=ImageHeight(option)
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore ,w ,h)  
      EndIf 
      
      ;Case #PB_GadgetType_Image;no effects ;================
      
      ;Case #PB_GadgetType_IPAddress;There's a bug somewhere ;================
      ;old=GetGadgetState(NumGadget)
      ;SetGadgetState(NumGadget, MakeIPAddress(192, 192, 192, 192))
      ;ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , GetTextWidthPix(NumGadget),GetTextHeightPix(NumGadget))  
      ;SetGadgetState(NumGadget, old)  
      
    Case  #PB_GadgetType_ListView ;================
      marge=28
      min=SendMessage_(GadgetID(NumGadget),#LB_GETITEMHEIGHT,0,0)
      ;ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , marge+GetLongerTextInListWidthPix(NumGadget),CountGadgetItems(NumGadget)*GetTextHeightPix(NumGadget))         
      w=marge+GetLongerTextInListWidthPix(NumGadget)
      If option = -1 ; all
        ;ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , marge+GetLongerTextInListWidthPix(NumGadget),CountGadgetItems(NumGadget)*GetTextHeightPix(NumGadget))
        h=min*(CountGadgetItems(NumGadget)+1)
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore ,w ,h)  
      Else
        h=#PB_Ignore
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore ,w,h) 
      EndIf
      
  EndSelect
  ProcedureReturn w
EndProcedure 

Procedure.l FitGadgetH(NumGadget, En_Longueur.b=#True, En_Hauteur.b=#True, Option.l=-1)
  Protected  DC, tm.TEXTMETRIC, abc.ABC, overhang, hFont, char, ncm.NONCLIENTMETRICS
  Protected Hauteur_case_a_cocher, rc.RECT,sz.SIZE, os, bordure, marge, handleimagelist, okBOOL
  Protected old$, min, max
  Protected BCM_FIRST, BCM_GETIDEALSIZE, BCM_GETTEXTMARGIN, MCM_FIRST, MCM_GETCALENDARBORDER,CBEM_GETIMAGELIST
  Protected pImageInfo.IMAGEINFO
  Protected w,h
  
  Select GadgetType(NumGadget)
    Case #PB_GadgetType_Button ;================ 
      BCM_FIRST            = $1600
      BCM_GETIDEALSIZE     = (BCM_FIRST + $0001) 
      If SendMessage_(GadgetID(NumGadget),BCM_GETIDEALSIZE,0,sz) = #True
        w=sz\cx
        h=sz\cy
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , w,h)
      EndIf
      
    Case #PB_GadgetType_Option ;================
      ncm\cbSize = SizeOf(NONCLIENTMETRICS)
      SystemParametersInfo_(#SPI_GETNONCLIENTMETRICS, SizeOf(NONCLIENTMETRICS), @ncm, 0)
      DC = GetDC_(0)
      Hauteur_case_a_cocher=Abs(ncm\lfMessageFont\lfheight); c'est aussi sa longueur
      ; GetDeviceCaps_(DC, #LOGPIXELSY)
      ReleaseDC_(0, DC)
      BCM_FIRST            = $1600
      BCM_GETTEXTMARGIN    = BCM_FIRST + $0005
      SendMessage_(GadgetID(NumGadget),BCM_GETTEXTMARGIN,0,rc)
      w=rc\left+rc\right+Hauteur_case_a_cocher+GetTextWidthPix(NumGadget, 1)
      h=GetTextHeightPix(NumGadget,0)
      ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , w,h)
      
    Case #PB_GadgetType_CheckBox ;================
      ncm\cbSize = SizeOf(NONCLIENTMETRICS)
      SystemParametersInfo_(#SPI_GETNONCLIENTMETRICS, SizeOf(NONCLIENTMETRICS), @ncm, 0)
      DC = GetDC_(0)
      Hauteur_case_a_cocher=Abs(ncm\lfMessageFont\lfheight); c'est aussi sa longueur
      ; GetDeviceCaps_(DC, #LOGPIXELSY)
      ReleaseDC_(0, DC)
      BCM_FIRST            = $1600
      BCM_GETTEXTMARGIN    = BCM_FIRST + $0005
      SendMessage_(GadgetID(NumGadget),BCM_GETTEXTMARGIN,0,rc)
      w=rc\left+rc\right+Hauteur_case_a_cocher+GetTextWidthPix(NumGadget, 1)
      h=GetTextHeightPix(NumGadget,0)
      ResizeGadget(NumGadget, #PB_Ignore, #PB_Ignore, w, h)
      
    Case #PB_GadgetType_Calendar ;================
      SendMessage_(GadgetID(NumGadget),#MCM_GETMINREQRECT,0,rc)
      
      ;        If option= #PB_Calendar_Borderless 
      ;         ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , rc\Right,rc\bottom)
      ;         
      ;       Else
      os=OSVersion()
      If  os=#PB_OS_Windows_Vista Or os=#PB_OS_Windows_Server_2008 Or os= #PB_OS_Windows_7 Or os=#PB_OS_Windows_Future
        MCM_FIRST               = $1000
        MCM_GETCALENDARBORDER   = MCM_FIRST + 31
        bordure= SendMessage_(GadgetID(NumGadget),MCM_GETCALENDARBORDER,0,0)
        w=rc\Right+bordure
        h=rc\bottom+bordure
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , w,h)
      Else
        w=rc\Right+4
        h=rc\bottom+4
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , w,h)
      EndIf
      ;EndIf
      ;========================================================================  
    Case #PB_GadgetType_ComboBox ;================
      CBEM_GETIMAGELIST=1027
      marge=4
      ;Image presente ?
      handleimagelist= SendMessage_(GadgetID(NumGadget),CBEM_GETIMAGELIST ,0,0)
      If handleimagelist
        ;Retrieves information about an image. 
        okBOOL= ImageList_GetImageInfo_(handleimagelist,1,pImageInfo)
        marge+pImageInfo\rcImage\right+4
        If GetTextHeightPix(NumGadget)>pImageInfo\rcImage\bottom
          ;longueur dropdown =26
          w=26+marge+GetLongerTextInListWidthPix(NumGadget)
          h=GetTextHeightPix(NumGadget)
          ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , w,h)
        Else
          w=26+marge+GetLongerTextInListWidthPix(NumGadget)
          h=0
          ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore ,w ,h ) 
        EndIf
      Else
        w=26+marge+GetLongerTextInListWidthPix(NumGadget)
        h=0
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , w,h);GetTextHeightPix(NumGadget)
      EndIf
      
    Case #PB_GadgetType_Date ;================
      w=26+GetTextWidthPix(NumGadget)
      h=GetTextHeightPix(NumGadget)
      ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , w,h)
      
    Case #PB_GadgetType_Editor ;================
      marge=4
      w=marge+GetLongerTextInListWidthPix(NumGadget)
      h=(CountGadgetItems(NumGadget)-1)*GetHigherTextInListWidthPix(NumGadget)
      
      ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , w,h) 
      
    Case #PB_GadgetType_String ;================
      marge=SendMessage_(GadgetID(NumGadget),#EM_GETMARGINS,0,0)
      ;Returns the width of the left margin in the LOWORD, And the width of the right margin in the HIWORD.
      w=4+(marge & $FFFF)+((marge >> 16) & $FFFF)+GetTextWidthPix(NumGadget)
      h=GetTextHeightPix(NumGadget)
      ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore ,w ,h) 
      
    Case #PB_GadgetType_Text ;================
      w=GetTextWidthPix(NumGadget,0)
      h=GetTextHeightPix(NumGadget,0)
      ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore ,w ,h) 
      
    Case #PB_GadgetType_HyperLink ;================
      w=GetTextWidthPix(NumGadget,0)
      If option=#PB_HyperLink_Underline
        h=GetTextHeightPix(NumGadget)
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore ,w ,h) 
      Else
        h=GetTextHeightPix(NumGadget,0)
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , w,h)  
      EndIf
      
    Case #PB_GadgetType_Spin ;================
      old$=GetGadgetText(NumGadget)
      min=GetGadgetAttribute(NumGadget, #PB_Spin_Minimum);#PB_Spin_Maximum
      SetGadgetText(NumGadget, Str(min))
      min=GetTextWidthPix(NumGadget,0)
      
      max=GetGadgetAttribute(NumGadget, #PB_Spin_Maximum)
      SetGadgetText(NumGadget, Str(max))
      max=GetTextWidthPix(NumGadget,0)
      
      SetGadgetText(NumGadget, old$)
      marge=20
      h=GetTextHeightPix(NumGadget)
      If max>=min
        w=marge+max
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore ,w ,h)
      Else
        w=marge+min
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore ,w ,h)  
      EndIf 
      
    Case #PB_GadgetType_ButtonImage ;================ 
      If option <> -1
        w=ImageWidth(option)
        h=ImageHeight(option)
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore ,w ,h)  
      EndIf 
      
      ;Case #PB_GadgetType_Image;no effects ;================
      
      ;Case #PB_GadgetType_IPAddress;There's a bug somewhere ;================
      ;old=GetGadgetState(NumGadget)
      ;SetGadgetState(NumGadget, MakeIPAddress(192, 192, 192, 192))
      ;ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , GetTextWidthPix(NumGadget),GetTextHeightPix(NumGadget))  
      ;SetGadgetState(NumGadget, old)  
      
    Case  #PB_GadgetType_ListView ;================
      marge=28
      min=SendMessage_(GadgetID(NumGadget),#LB_GETITEMHEIGHT,0,0)
      ;ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , marge+GetLongerTextInListWidthPix(NumGadget),CountGadgetItems(NumGadget)*GetTextHeightPix(NumGadget))         
      w=marge+GetLongerTextInListWidthPix(NumGadget)
      If option = -1 ; all
        ;ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore , marge+GetLongerTextInListWidthPix(NumGadget),CountGadgetItems(NumGadget)*GetTextHeightPix(NumGadget))
        h=min*(CountGadgetItems(NumGadget)+1)
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore ,w ,h)  
      Else
        h=#PB_Ignore
        ResizeGadget(NumGadget,#PB_Ignore ,#PB_Ignore ,w,h) 
      EndIf
      
  EndSelect
  ProcedureReturn h
EndProcedure


Fitgadgetfreak.pbi

Code : Tout sélectionner

; 
;  Calculates the size required to display a Gadget properly.
;
;  Supported Gadgets:
;    Button, Checkbox, Option, Text, String, ComboBox, Image 
;
;  Note:
;    For Gadgets with variable content (String, ComboBox), only the returned height
;    is useful, as the width will only be an absolute minimum value.
;
;  The 'Flags' parameter gives gadget flags to include in the calculation.
;  Currently only #PB_Text_Border makes a difference there.   
;

CompilerIf Defined(Max, #PB_Procedure) = 0
	Procedure Max(a, b)
		If a > b
			ProcedureReturn a
		Else
			ProcedureReturn b
		EndIf
	EndProcedure
CompilerEndIf

CompilerIf #PB_Compiler_OS = #PB_OS_Linux
	Structure PB_Gadget
		*Gadget.GtkWidget
		*Container.GtkWidget
		*VT
		UserData.i
		GadgetData.i[4]
	EndStructure
CompilerEndIf

CompilerIf #PB_Compiler_OS = #PB_OS_MacOS
	Structure OSX_Rect
		top.w
		left.w
		bottom.w
		right.w
	EndStructure
	
	#noErr = 0
CompilerEndIf


; Stores the result in *Width\l and *Height\l
;
Procedure GetRequiredSize(Gadget, *Width.LONG, *Height.LONG, Flags = 0)

	CompilerSelect #PB_Compiler_OS
	CompilerCase #PB_OS_Windows
	
		DC = GetDC_(GadgetID(Gadget))
		oldFont = SelectObject_(DC, GetGadgetFont(Gadget)) 
		Size.SIZE
	
		Select GadgetType(Gadget)
		
			Case #PB_GadgetType_Text
				Text$ = RemoveString(GetGadgetText(Gadget), Chr(10))
				count = CountString(Text$, Chr(13)) + 1
				empty = 0
				maxheight = 0 
				For index = 1 To count 
					Line$ = StringField(Text$, index, Chr(13))
					If Line$ = ""
						empty + 1
					Else 
						GetTextExtentPoint32_(DC, @Line$, Len(Line$), @LineSize.SIZE)
						Size\cx = Max(Size\cx, LineSize\cx)
						Size\cy + LineSize\cy
						maxheight = Max(maxheight, LineSize\cy)
					EndIf
				Next index            
				Size\cy + empty * maxheight  
				
				If Flags & #PB_Text_Border
					Size\cx + GetSystemMetrics_(#SM_CXEDGE) * 2
					Size\cy + GetSystemMetrics_(#SM_CYEDGE) * 2
				Else           
					Size\cx + 2
					Size\cy + 2
				EndIf

			Case #PB_GadgetType_CheckBox, #PB_GadgetType_Option
				Text$ = GetGadgetText(Gadget)
				GetTextExtentPoint32_(DC, @Text$, Len(Text$), @Size.SIZE)
				Size\cx + 20
				Size\cy = Max(Size\cy+2, 20)
				
			Case #PB_GadgetType_Button
				Text$ = GetGadgetText(Gadget)
				GetTextExtentPoint32_(DC, @Text$, Len(Text$), @Size.SIZE)
				Size\cx + GetSystemMetrics_(#SM_CXEDGE)*2
				Size\cy = Max(Size\cy+GetSystemMetrics_(#SM_CYEDGE)*2, 24)
				Size\cx + 10
				
			Case #PB_GadgetType_String
				Text$ = GetGadgetText(Gadget) + "Hg" 
				GetTextExtentPoint32_(DC, @Text$, Len(Text$), @Size.SIZE)
				Size\cx = GetSystemMetrics_(#SM_CXEDGE)*2 
				Size\cy = Max(Size\cy+GetSystemMetrics_(#SM_CXEDGE)*2, 20)
				
			Case #PB_GadgetType_ComboBox
				GetTextExtentPoint32_(DC, @"Hg", 2, @Size.SIZE)
				Size\cy = Max(Size\cy + 8, 21)
				Size\cx = Size\cy  
				
			Case #PB_GadgetType_Image
				Size\cx = GadgetWidth(Gadget)
				Size\cy = GadgetHeight(Gadget)
				
		EndSelect
		
		SelectObject_(DC, oldFont)
		ReleaseDC_(GadgetID(Gadget), DC)
		*Width\l  = Size\cx
		*Height\l = Size\cy
	
	CompilerCase #PB_OS_Linux
	
		*Gadget.PB_Gadget = IsGadget(Gadget)
		
		If *Gadget And *Gadget\Container And GadgetType(Gadget) <> #PB_GadgetType_ComboBox
			gtk_widget_size_request_(*Gadget\Container, @RealSize.GtkRequisition)
			gtk_widget_set_size_request_(*Gadget\Container, -1, -1)
			gtk_widget_size_request_(*Gadget\Container, @Size.GtkRequisition)      
			gtk_widget_set_size_request_(*Gadget\Container, RealSize\Width, RealSize\Height) 
		Else
			gtk_widget_size_request_(GadgetID(Gadget), @RealSize.GtkRequisition)
			gtk_widget_set_size_request_(GadgetID(Gadget), -1, -1)              
			gtk_widget_size_request_(GadgetID(Gadget), @Size.GtkRequisition)    
			gtk_widget_set_size_request_(GadgetID(Gadget), RealSize\Width, RealSize\Height)
		EndIf
		
		If GadgetType(Gadget) = #PB_GadgetType_ComboBox Or GadgetType(Gadget) = #PB_GadgetType_String
			*Width\l  = 20 
		Else
			*Width\l  = Size\Width
		EndIf
				
		*Height\l = Size\Height    

	CompilerCase #PB_OS_MacOS
	
		Type = GadgetType(Gadget)
		
		If Type = #PB_GadgetType_Image    
			*Width\l = GadgetWidth(Gadget)
			*Height\l = GadgetHeight(Gadget)
			
		ElseIf Type = #PB_GadgetType_Text
			realwidth   = GadgetWidth(Gadget)
			
			*Width\l = 40
			*Height\l = 20      
			
			ResizeGadget(Gadget, #PB_Ignore, #PB_Ignore, 1000, #PB_Ignore) 
			
			If GetBestControlRect_(GadgetID(Gadget), @Rect.OSX_Rect, @BaseLine.w) = #noErr
				Height = Rect\bottom - Rect\top
				If Height > 0
				
					Min = 0
					Max = 1000
					
					While Max > Min+2
						Mid = (Min + Max) / 2
						
						ResizeGadget(Gadget, #PB_Ignore, #PB_Ignore, Mid, #PB_Ignore) 
						
						If GetBestControlRect_(GadgetID(Gadget), @Rect.OSX_Rect, @BaseLine.w) <> #noErr
							ProcedureReturn 
						EndIf
						
						If Rect\bottom - Rect\top > Height
							Min = Mid
						Else
							Max = Mid
						EndIf
					Wend
					
					*Width\l = Rect\right - Rect\left + 2 
					*Height\l = Max(Height, 20) 
				EndIf
					
			EndIf 
			
			ResizeGadget(Gadget, #PB_Ignore, #PB_Ignore, realwidth, #PB_Ignore)

		Else 
			If GetBestControlRect_(GadgetID(Gadget), @Rect.OSX_Rect, @BaseLine.w) = #noErr
				*Width\l = Rect\right - Rect\left
				*Height\l = Max(Rect\bottom - Rect\top, 20) 
				
				If Type = #PB_GadgetType_Button Or Type = #PB_GadgetType_String
					*Height\l = Max(*Height\l, 24)        
				EndIf        
			Else 
				*Width\l = 40
				*Height\l = 20
			EndIf
			
			If Type = #PB_GadgetType_String Or Type  = #PB_GadgetType_ComboBox        
				*Width\l = 30 
			EndIf
		
		EndIf
	
	CompilerEndSelect
	
EndProcedure

; convinience wrappers if only one size is needed
;
Procedure GetRequiredWidth(Gadget, Flags = 0)
	Protected Width.l, Height.l
	GetRequiredSize(Gadget, @Width, @Height, Flags)
	ProcedureReturn Width
EndProcedure 

Procedure GetRequiredHeight(Gadget, Flags = 0)
	Protected Width.l, Height.l
	GetRequiredSize(Gadget, @Width, @Height, Flags)
	ProcedureReturn Height
EndProcedure 


Procedure FitGadgetW(Gadget, Flags = 0)
Protected Width.l, Height.l
	GetRequiredSize(Gadget, @Width, @Height, Flags)
	ProcedureReturn Width
EndProcedure

Procedure FitGadgetH(Gadget, Flags = 0)
Protected Width.l, Height.l
	GetRequiredSize(Gadget, @Width, @Height, Flags)
	ProcedureReturn Height
EndProcedure

Exemple.

Code : Tout sélectionner

XIncludeFile "layout.pbi"
XIncludeFile "FitGadget.pbi" ; Windows seulement tout gadget sauf IPGadget
;XIncludeFile "FitGadgetfreak.pbi"; multiplateforme mais prend en charge moins de gadgets.
Enumeration
  #win
  #Layout
  #option_1
  #option_2
  #option_3
  #option_4
  #option_5
  #option_6
  #option_7
  #option_8
  #option_9
  #option_10
  #option_11
  #option_12
  #Frame0
  #Frame1
  #Frame2
  #Frame3
  #Frame4
  #Frame5
EndEnumeration

; Changer la police
; If LoadFont(1, "Arial", 15)
;   SetGadgetFont(#PB_Default, FontID(1))
; EndIf

OpenWindow(#win, 0, 0, 710, 410, "GUI-Layout-Demo Frame3D", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
If IsWindow(#win)
  createlayout(#Layout,#win)
  If layoutInitialized
    Frame3DGadget(#Frame0, 0, 0, 1, 1, "Frame 0 - Contenu Relatif")
    OptionGadget(#option_1, 0, 0, 1, 1, "Option 1")
    OptionGadget(#option_2, 0, 0, 1, 1, "Option 2")
    OptionGadget(#option_3, 0, 0, 1, 1, "Option 3")
    SetGadgetState(#option_2, 1)
    
    Frame3DGadget(#Frame1, 0, 0, 1, 1, "Frame 1 - Contenu Fixe")
    OptionGadget(#option_4, 0, 0, 1, 1, "Option 4")
    OptionGadget(#option_5, 0, 0, 1, 1, "Option 5")
    OptionGadget(#option_6, 0, 0, 1, 1, "Option 6")
    SetGadgetState(#option_4, 1)
    Frame3DGadget(#Frame2, 0, 0, 1, 1, "Frame 2 - Contenu Fixe")
    OptionGadget(#option_7, 0, 0, 1, 1, "Option 7")
    OptionGadget(#option_8, 0, 0, 1, 1, "Option 8")
    OptionGadget(#option_9, 0, 0, 1, 1, "Option 9")
    SetGadgetState(#option_7, 1)
    Frame3DGadget(#Frame3, 0, 0, 1, 1, "Frame 3 - ", #PB_Frame3D_Double)
    Frame3DGadget(#Frame4, 0, 0, 1, 1, "Frame 4 - ",#PB_Frame3D_Flat)
    Frame3DGadget(#Frame5, 0, 0, 1, 1, "Frame 5 - Contenu Relatif")
    OptionGadget(#option_10, 0, 0, 1, 1, "Option 10")
    OptionGadget(#option_11, 0, 0, 1, 1, "Option 11")
    OptionGadget(#option_12, 0, 0, 1, 1, "Option 12")
    SetGadgetState(#option_10, 1)
    
    ; Bug sous linux
    CompilerIf #PB_Compiler_OS = #PB_OS_Linux
      AWPB_GUILO_Fix_Frame3DGadget_Resize(#Frame0)
      AWPB_GUILO_Fix_Frame3DGadget_Resize(#Frame1)
      AWPB_GUILO_Fix_Frame3DGadget_Resize(#Frame2)
      AWPB_GUILO_Fix_Frame3DGadget_Resize(#Frame3)
      AWPB_GUILO_Fix_Frame3DGadget_Resize(#Frame4)
      AWPB_GUILO_Fix_Frame3DGadget_Resize(#Frame5)
    CompilerEndIf
    
    s1  = VBOXLayout(#Layout,#Null,100)
    fs0 = HFRAMELayout(#Layout,s1,#Frame0,20,0,0,0,0,#True,15)
    AddGadgetLayout(#Layout,fs0,#option_1, 34)
    AddGadgetLayout(#Layout,fs0,#option_2, 33)
    AddGadgetLayout(#Layout,fs0,#option_3, 33)
    fs1 = HFRAMELayout(#Layout,s1,#Frame1,20,10,10,10,10,#False)
    AddGadgetLayout(#Layout,fs1,#option_4,  FitGadgetW(#option_4)+10)
    AddGadgetLayout(#Layout,fs1,#option_5,  FitGadgetW(#option_5)+10)
    AddGadgetLayout(#Layout,fs1,#option_6,  FitGadgetW(#option_6)+10)    
    s2  = HBOXLayout(#Layout,s1,60)
    fs2 = VFRAMELayout(#Layout,s2,#Frame2,50,0,0,0,0,#False)
    AddGadgetLayout(#Layout,fs2,#option_7,  FitGadgetH(#option_7)+5)
    AddGadgetLayout(#Layout,fs2,#option_8,  FitGadgetH(#option_8)+5)
    AddGadgetLayout(#Layout,fs2,#option_9,  FitGadgetH(#option_9)+5)
    s3  = VBOXLayout(#Layout,s2,25)
    fs3 = HFRAMELayout(#Layout,s3,#Frame3,50)
    fs4 = HFRAMELayout(#Layout,s3,#Frame4,50)
    fs5 = VFRAMELayout(#Layout,s2,#Frame5,25)
    AddGadgetLayout(#Layout,fs5,#option_10, 34)
    AddGadgetLayout(#Layout,fs5,#option_11, 33)
    AddGadgetLayout(#Layout,fs5,#option_12, 33)
    
    endlayout()
    
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_SizeWindow
          resizeLayout()
        Case #PB_Event_CloseWindow
          Select EventWindow()
            Case win
              CloseWindow(win)
              win = 0
              Break
          EndSelect
      EndSelect
    ForEver
    
    FreeLayout()
  Else
    MessageRequester("Erreur", "Erreur de Layout") 
  EndIf
Else
  MessageRequester("Erreur", "Impossible de créer la fenêtre") 
EndIf

End
A suivre...

Mesa.
Dernière modification par Mesa le mar. 05/juin/2012 15:30, modifié 2 fois.
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: [Tuto] Layouts

Message par Mesa »

Exercice 1
J'ai trouvé ici un petit code sympathique :
http://forums.purebasic.com/english/vie ... 12&t=49846

dont voici l'originale
Image

Code

Code : Tout sélectionner

Global my_COLORS.s = "250,255,220|255,225,255|225,250,225|64,255,64|200,200,200|0,32,64|225,250,225|255,200,80|210,190,140"
Global d2h.s = "0123456789ABCDEF"

Macro Dec2Hex(n)
  Mid(d2h,(n/16)+1,1)+Mid(d2h,(n%16)+1,1)
EndMacro
Macro divide_cols(col)
  Val(StringField(col,1,",")), Val(StringField(col,2,",")), Val(StringField(col,3,","))
EndMacro

Procedure SetTracks(rd,gr,bl)
  co = RGB(rd,gr,bl)
  hcolor.s = "$"+Dec2Hex(bl)+Dec2Hex(gr)+Dec2Hex(rd)
  SetGadgetState(1,rd)
  SetGadgetState(2,gr)
  SetGadgetState(3,bl)
  SetGadgetText (11,RSet(Str(rd),3,"0"))
  SetGadgetText (12,RSet(Str(gr),3,"0"))
  SetGadgetText (13,RSet(Str(bl),3,"0"))
  SetGadgetText (14,hcolor)
  SetGadgetText (15,Str(co))
  SetGadgetColor(21,#PB_Gadget_FrontColor,0)
  SetGadgetColor(21,#PB_Gadget_BackColor,co)
  SetGadgetColor(22,#PB_Gadget_FrontColor,$FFFFFF)
  SetGadgetColor(22,#PB_Gadget_BackColor,co)
  SetGadgetColor(23,#PB_Gadget_FrontColor,co)
  SetGadgetColor(23,#PB_Gadget_BackColor,0)
  SetGadgetColor(24,#PB_Gadget_FrontColor,co)
  SetGadgetColor(24,#PB_Gadget_BackColor,$FFFFFF)
  SetGadgetColor(25,#PB_Gadget_FrontColor,co)
EndProcedure

OpenWindow(0, 0, 0, 320,160, "Testing Colors Sans Layout",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
TrackBarGadget( 1, 55, 10,256, 25, 0, 255)
TrackBarGadget( 2, 55, 45,256, 25, 0, 255)
TrackBarGadget( 3, 55, 80,256, 25, 0, 255)
TextGadget    ( 4,  2, 13, 30, 15, "Red")
TextGadget    ( 5,  2, 48, 30, 15, "Green")
TextGadget    ( 6,  2, 83, 30, 15, "Blue")
TextGadget    (11, 32, 13, 20, 15, "000")
TextGadget    (12, 32, 48, 20, 15, "000")
TextGadget    (13, 32, 83, 20, 15, "000")
SetGadgetColor(11, #PB_Gadget_FrontColor, RGB(200,0,0))
SetGadgetColor(12, #PB_Gadget_FrontColor, RGB(0,128,0))
SetGadgetColor(13, #PB_Gadget_FrontColor, RGB(0,0,200))
TextGadget    (14,  2,118, 50, 20, "$000000")
TextGadget    (15, 55,118, 50, 20, "0",#PB_Text_Right)
ButtonGadget  (19,  5,142, 55, 15, "ClipBoard")
For n=1 To 5
  TextGadget  (20+n,110+((n-1)*40),115, 40, 20, "TEST",#PB_Text_Border|#PB_Text_Center)
Next
For n=1 To 9
  StringGadget(30+n,110+((n-1)*20),142, 15, 15, " "+Str(n),#PB_String_ReadOnly)
  color.s = StringField(my_COLORS,n,"|")
  SetGadgetColor(30+n, #PB_Gadget_BackColor, RGB(divide_cols(color)))
Next
SetGadgetColor(36, #PB_Gadget_FrontColor, #White)
hcolor.s = ""

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow: Break
    Case #PB_Event_Gadget
      nGad = EventGadget()
      If nGad = 19
        If Len(hcolor): SetClipboardText(hcolor): EndIf
      ElseIf nGad > 30 And nGad < 40
        If EventType() = #PB_EventType_Focus
          ncol  = nGad - 30
          color = StringField(my_COLORS,ncol,"|")
          rd    = Val(StringField(color,1,","))
          gr    = Val(StringField(color,2,","))
          bl    = Val(StringField(color,3,","))
          SetTracks(rd,gr,bl)
        EndIf
      Else
        rd = GetGadgetState(1)
        gr = GetGadgetState(2)
        bl = GetGadgetState(3)
        SetTracks(rd,gr,bl)
      EndIf
  EndSelect
ForEver

End

Ajoutons un layout :
Image

Solution :

Code : Tout sélectionner

XIncludeFile "layout.pbi"

Enumeration
  #win 
  #layout
  
EndEnumeration

Global my_COLORS.s = "250,255,220|255,225,255|225,250,225|64,255,64|200,200,200|0,32,64|225,250,225|255,200,80|210,190,140"
Global d2h.s = "0123456789ABCDEF"

Macro Dec2Hex(n)
  Mid(d2h,(n/16)+1,1)+Mid(d2h,(n%16)+1,1)
EndMacro
Macro divide_cols(col)
  Val(StringField(col,1,",")), Val(StringField(col,2,",")), Val(StringField(col,3,","))
EndMacro

Procedure SetTracks(rd,gr,bl)
  co = RGB(rd,gr,bl)
  hcolor.s = "$"+Dec2Hex(bl)+Dec2Hex(gr)+Dec2Hex(rd);+"  | "
  SetGadgetState(1,rd)
  SetGadgetState(2,gr)
  SetGadgetState(3,bl)
  SetGadgetText (11,RSet(Str(rd),3,"0"))
  SetGadgetText (12,RSet(Str(gr),3,"0"))
  SetGadgetText (13,RSet(Str(bl),3,"0"))
  SetGadgetText (14,hcolor)
  SetGadgetText (15,Str(co))
  SetGadgetColor(21,#PB_Gadget_FrontColor,0)
  SetGadgetColor(21,#PB_Gadget_BackColor,co)
  SetGadgetColor(22,#PB_Gadget_FrontColor,$FFFFFF)
  SetGadgetColor(22,#PB_Gadget_BackColor,co)
  SetGadgetColor(23,#PB_Gadget_FrontColor,co)
  SetGadgetColor(23,#PB_Gadget_BackColor,0)
  SetGadgetColor(24,#PB_Gadget_FrontColor,co)
  SetGadgetColor(24,#PB_Gadget_BackColor,$FFFFFF)
  SetGadgetColor(25,#PB_Gadget_FrontColor,co)
EndProcedure

OpenWindow(#win, 0, 0, 380,140, "Testing Colors",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget)

CreateLayout(#layout,#win)
If LayoutInitialized
  TrackBarGadget( 1, 0, 0,0, 0, 0, 255);TrackBarGadget( 1, 0, 0, 0, 0, 0, 255) will work
  TrackBarGadget( 2, 0, 0,0, 0, 0, 255)
  TrackBarGadget( 3, 0, 0,0, 0, 0, 255)
  TextGadget    ( 4,  0, 0,0, 0, "Red")
  TextGadget    ( 5,  0, 0,0, 0, "Green")
  TextGadget    ( 6,  0, 0,0, 0, "Blue")
  TextGadget    (11, 0, 0,0, 0, "000")
  TextGadget    (12, 0, 0,0, 0, "000")
  TextGadget    (13, 0, 0,0, 0, "000")
  SetGadgetColor(11, #PB_Gadget_FrontColor, RGB(200,0,0))
  SetGadgetColor(12, #PB_Gadget_FrontColor, RGB(0,128,0))
  SetGadgetColor(13, #PB_Gadget_FrontColor, RGB(0,0,200))
  TextGadget    (14,  0, 0,0, 0, "$000000")
  TextGadget    (15, 0, 0,0, 0, "0",#PB_Text_Center)
  ButtonGadget  (19,  0, 0,0, 0, "ClipBoard")
  For n=1 To 5
    TextGadget  (20+n,0, 0,0, 0, "TEST",#PB_Text_Border|#PB_Text_Center)
  Next
  For n=1 To 9
    StringGadget(30+n,0, 0,0, 0, " "+Str(n),#PB_String_ReadOnly)
    color.s = StringField(my_COLORS,n,"|")
    SetGadgetColor(30+n, #PB_Gadget_BackColor, RGB(divide_cols(color)))
  Next
  SetGadgetColor(36, #PB_Gadget_FrontColor, #White)
  hcolor.s = ""
  
  vBOX1 = VBOXLayout(#layout,#Null,100) 
  
  ;hBOX1 = HBOXLayout(#layout,#Null,20)
  hBOX1 = HBOXLayout(#layout,vBOX1,20)      ; 20%
  AddGadgetLayout(#layout,hBOX1, 4, 15)
  AddGadgetLayout(#layout,hBOX1, 11, 10)
  AddGadgetLayout(#layout,hBOX1, 1, 75)
  
  hBOX2 = HBOXLayout(#layout,vBOX1,20)      ; 20%
  AddGadgetLayout(#layout,hBOX2, 5, 15)
  AddGadgetLayout(#layout,hBOX2, 12, 10)
  AddGadgetLayout(#layout,hBOX2,2, 75)
  
  hBOX3 = HBOXLayout(#layout,vBOX1,20)      ; 20%
  AddGadgetLayout(#layout,hBOX3, 6, 15)
  AddGadgetLayout(#layout,hBOX3,13, 10)
  AddGadgetLayout(#layout,hBOX3, 3, 75)
  
  hBOX4 = HBOXLayout(#layout,vBOX1,20)      ; 20%
  AddGadgetLayout(#layout,hBOX4, 14, 20)
  AddGadgetLayout(#layout,hBOX4, 15, 20)
  AddGadgetLayout(#layout,hBOX4, 21, 12,0,0,0,5)
  AddGadgetLayout(#layout,hBOX4, 22, 12,0,0,0,5)
  AddGadgetLayout(#layout,hBOX4, 23, 12,0,0,0,5)
  AddGadgetLayout(#layout,hBOX4, 24, 12,0,0,0,5)
  AddGadgetLayout(#layout,hBOX4, 25, 12,0,0,0,5)
    
  hBOX5 = HBOXLayout(#layout,vBOX1,20)      ; 20%
  AddGadgetLayout(#layout,hBOX5, 19, 28)
  AddGadgetLayout(#layout,hBOX5, 31, 8,0,0,0,5)
  AddGadgetLayout(#layout,hBOX5, 32, 8,0,0,0,5)
  AddGadgetLayout(#layout,hBOX5, 33, 8,0,0,0,5)
  AddGadgetLayout(#layout,hBOX5, 34, 8,0,0,0,5)
  AddGadgetLayout(#layout,hBOX5, 35, 8,0,0,0,5)
  AddGadgetLayout(#layout,hBOX5, 36, 8,0,0,0,5)
  AddGadgetLayout(#layout,hBOX5, 37, 8,0,0,0,5)
  AddGadgetLayout(#layout,hBOX5, 38, 8,0,0,0,5)
  AddGadgetLayout(#layout,hBOX5, 39, 8,0,0,0,5)
  
  EndLayout() 
  
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_SizeWindow
        ResizeLayout() ; Redimensionnement des gadgets contenus dans le layout
        
      Case #PB_Event_CloseWindow: Break
      Case #PB_Event_Gadget
        nGad = EventGadget()
        If nGad = 19
          If Len(hcolor): SetClipboardText(hcolor): EndIf
        ElseIf nGad > 30 And nGad < 40
          If EventType() = #PB_EventType_Focus
            ncol  = nGad - 30
            color = StringField(my_COLORS,ncol,"|")
            rd    = Val(StringField(color,1,","))
            gr    = Val(StringField(color,2,","))
            bl    = Val(StringField(color,3,","))
            SetTracks(rd,gr,bl)
          EndIf
        Else
          rd = GetGadgetState(1)
          gr = GetGadgetState(2)
          bl = GetGadgetState(3)
          SetTracks(rd,gr,bl)
        EndIf
    EndSelect
  ForEver
  FreeLayout()
Else
  MessageRequester("Erreur", "Erreur de Layout") 
EndIf
End

Exercice 2
Les problèmes commencent...

Prenons l'exemple de "Chat Fiches" de Dobro
http://www.purebasic.fr/french/viewtopi ... =3&t=12745

Image

Une des solutions possibles de création de layout est :
Image

On obtient :
Image

Code:

Code : Tout sélectionner

XIncludeFile "layout.pbi"

;{- Enumerations / DataSections
;{ Windows

UseJPEGImageDecoder()
UsePNGImageDecoder()

;}
;{ Gadgets
Enumeration
  #Win
  #Layout
  #Text_Titre
  #Text_Auteur
  #Text_Nom
  #Text_date_naissance
  #Photo
  #Date_naissance
  #String_Nom
  #Text_evenements
  #Button_av
  #Button_ap
  #Editor
  #Button_new
  #Button_del
  #Button_efface
  #file_save_pos
  #Button_edit
EndEnumeration
;}
;{ Fonts
Enumeration
  #Font_Text_Titre
  #Font_Text_Nom
  #Font_Text_date_naissance
  #Font_Editor
EndEnumeration
;}
;{ Images
Enumeration
  #image
  #image_defaut
EndEnumeration
;}

Structure Fiche
  nom_chat.s
  date_naissance_chat.s
  evenements.s
  path_image.s
EndStructure

Global NewList Fiche.Fiche()
Global Path$=GetCurrentDirectory()
;debug Path$
; ********************* Declarations procedures *****************************
;-declaration
Declare  OpenWindow_Win(x_window,y_window)
Declare  Sauvegarde()
Declare  chargement_fiches()
Declare  efface()


; *************************************************************************
Global x_window.w
Global y_window.w
Global nombre_fiche.i ,path_image.s,nom_chat.s,date_naissance_chat.s,evenements.s
Global compteur.i,flag_edit=0
CreateImage(#image_defaut,341,256,32)

;}

;  *************** chargement de la position de la fenetre ****************
If OpenFile(#file_save_pos,path$+"chats_fiche.inf")
  x_window.w=ReadWord(#file_save_pos)
  y_window.w=ReadWord(#file_save_pos)
  
  CloseFile(#file_save_pos)
EndIf
If x_window.w=0 Or y_window=0
  x_window.w=404
  y_window.w=26
EndIf
; *********************************************************************

OpenWindow_Win(x_window,y_window)
chargement_fiches() ; charge les fiches , et peuple la liste chainée--structure

; preparation de l'interface
If nombre_fiche.i=0
  DisableGadget(#Button_av, 1) ; desactive
  DisableGadget(#Button_ap, 1) ; desactive
EndIf
;{- Event loop
Repeat
  Select WaitWindowEvent(2)
    Case #PB_Event_SizeWindow
      ResizeLayout() ; Redimensionnement des gadgets contenus dans le layout
      
      ; ///////////////////
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Text_Titre
        Case #Text_Auteur
        Case #Text_Nom
          
        Case #Text_date_naissance
          
        Case #Photo
          path_image.s=OpenFileRequester("Charger une Image","c:\","Images|*.jpg|*.png|*.bmp",0)
          If LoadImage(#image,path_image.s)
            ResizeImage(#image,341,256)
            ImageGadget(#Photo, 531, 124, 341, 256, ImageID(#image), #PB_Image_Border)
          EndIf
        Case #Date_naissance
          date_naissance_chat.s=GetGadgetText(#Date_naissance)
          
          
        Case #String_Nom
          nom_chat.s =GetGadgetText(#String_Nom)
          
        Case #Text_evenements
          
        Case #Button_av
          compteur.i=compteur.i-1
          
          If compteur.i<0
            compteur.i=0
          EndIf
          
          SelectElement(fiche(),compteur.i)
          
          path_image.s=fiche()\path_image.s
          If  path_image.s<>""
            If LoadImage(#image,path_image.s)
              ResizeImage(#image,341,256)
              ImageGadget(#Photo, 531, 124, 341, 256, ImageID(#image), #PB_Image_Border)
            EndIf
          Else
            ImageGadget(#Photo, 531, 124, 341, 256, ImageID(#image_defaut), #PB_Image_Border)
          EndIf
          nom_chat.s=fiche()\nom_chat.s
          date_naissance_chat.s=fiche()\date_naissance_chat.s
          evenements.s=fiche()\evenements.s;
          SetGadgetText(#String_Nom,nom_chat.s)
          SetGadgetText(#Date_naissance,date_naissance_chat.s)
          SetGadgetText(#Editor,evenements.s)
          
        Case #Button_ap
          compteur.i=compteur.i+1
          
          If compteur.i> ListSize(fiche())-1
            compteur.i=ListSize(fiche())-1
          EndIf
          
          SelectElement(fiche(),compteur.i)
          
          path_image.s=fiche()\path_image.s
          If  path_image.s<>""
            If LoadImage(#image,path_image.s)
              ResizeImage(#image,341,256)
              ImageGadget(#Photo, 531, 124, 341, 256, ImageID(#image), #PB_Image_Border)
            EndIf
          Else
            ImageGadget(#Photo, 531, 124, 341, 256, ImageID(#image_defaut), #PB_Image_Border)
          EndIf
          nom_chat.s=fiche()\nom_chat.s
          date_naissance_chat.s=fiche()\date_naissance_chat.s
          evenements.s=fiche()\evenements.s
          ;
          SetGadgetText(#String_Nom,nom_chat.s)
          SetGadgetText(#Date_naissance,date_naissance_chat.s)
          SetGadgetText(#Editor,evenements.s)
          
          
        Case #Editor
          
          evenements.s=GetGadgetText(#Editor)
          
        Case #Button_edit
          
          SelectElement(fiche(),compteur.i)
          If nom_chat.s<>""
            fiche()\nom_chat.s=nom_chat.s
            fiche()\date_naissance_chat.s=date_naissance_chat.s
            fiche()\evenements.s=evenements.s
            fiche()\path_image.s = path_image.s
          EndIf
          sauvegarde()
          chargement_fiches()
          
        Case #Button_new
          DisableGadget(#Button_av, 0) ; active
          DisableGadget(#Button_ap, 0) ; active
          LastElement(fiche()) ; va a la  derniere fiche
          ; Peuple la liste chainée avec les données récupérées
          AddElement(fiche()) ; ajoute une fiche
          fiche()\nom_chat.s=nom_chat.s
          fiche()\date_naissance_chat.s=date_naissance_chat.s
          fiche()\evenements.s=evenements.s
          fiche()\path_image.s = path_image.s
          
          sauvegarde()
          chargement_fiches()
          
          efface()
          
        Case #Button_del
          SelectElement(fiche(),compteur.i)
          DeleteElement(fiche())
          
          efface()
          sauvegarde()
          
          If  ListSize(fiche())=0
            DisableGadget(#Button_av, 1) ; desactive
            DisableGadget(#Button_ap, 1) ; desactive
          EndIf
          
        Case #Button_efface
          efface()
      EndSelect
      ; ////////////////////////
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #Win
          sauvegarde()
          CloseWindow(#Win)
          Break
      EndSelect
  EndSelect
  
ForEver
FreeLayout()

;
;}

; ************************** Procedures Land ******************************
Procedure OpenWindow_Win(x_window,y_window)
  If OpenWindow(#Win,x_window,y_window, 890, 499, "Chats_Fiche", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_TitleBar)
    CreateLayout(#Layout,#Win)
    If LayoutInitialized
      TextGadget(#Text_Titre, 0, 0,0, 0, "Les Chats", #PB_Text_Center)
      TextGadget(#Text_Auteur, 0, 0,0, 0, "By Dobro",#PB_Text_Right )
      TextGadget(#Text_Nom, 0, 0,0, 0, "Nom")
      TextGadget(#Text_date_naissance, 0, 0,0, 0, "Date de Naissance")
      ImageGadget(#Photo, 0, 0,0, 0, 0, #PB_Image_Border)
      DateGadget(#Date_naissance, 0, 0,0, 0, "%dd/%mm/%yyyy", Date())
      StringGadget(#String_Nom, 0, 0,0, 0, "")
      TextGadget(#Text_evenements, 0, 0,0, 0, "evenements")
      ButtonGadget(#Button_av, 0, 0,0, 0, "<--")
      ButtonGadget(#Button_ap, 0, 0,0, 0, "-->")
      EditorGadget(#Editor,0, 0,0, 0)
      ButtonGadget(#Button_new, 0, 0,0, 0, "confirme Nouv fiche ") ; creer une nouvelle Fiche
      ButtonGadget(#Button_del, 0, 0,0, 0, "Erase fiche") ; destruction de la fiche en cours
      ButtonGadget(#Button_edit,0, 0,0, 0, "Modifie fiche") ; modification d'une fiche apres creation
      ButtonGadget(#Button_efface, 0, 0,0, 0, "Efface") ; efface la fiche pour pouvoir réecrire dedans (juste un netoyage de l'interface )
      ; Gadget Fonts
      SetGadgetFont(#Text_Titre, LoadFont(#Font_Text_Titre, "Arial", 24, #PB_Font_Bold|#PB_Font_HighQuality))
      SetGadgetFont(#Text_Nom, LoadFont(#Font_Text_Nom, "Arial", 14, #PB_Font_HighQuality))
      SetGadgetFont(#Text_date_naissance, LoadFont(#Font_Text_date_naissance, "Arial", 14, #PB_Font_HighQuality))
      SetGadgetFont(#Editor, LoadFont(#Font_Editor, "Arial", 12, #PB_Font_HighQuality))
      ; Gadget Colors²
      ;PureCOLOR_SetGadgetColor(#Editor, $259300, $0) ; si Purecolor est utilisé .. !
      
      
      vBOX1 = VBOXLayout(#layout,#Null,100) ;
      AddGadgetLayout(#layout,vBOX1, #Text_Titre, 10) ;
      AddGadgetLayout(#layout,vBOX1, #Text_Auteur, 5) ;
      hBOX1 = HBOXLayout(#layout,vBOX1,85)
      
      vBOX2 = VBOXLayout(#layout,hBOX1,60)
      vBOX3 = VBOXLayout(#layout,hBOX1,40)
      
      ;VBOX 2
      hBOX2 = HBOXLayout(#layout,vBOX2,6)
      AddGadgetLayout(#layout,hBOX2, #Text_Nom, 30)
      AddGadgetLayout(#layout,hBOX2, #String_Nom, 70)
      hBOX3 = HBOXLayout(#layout,vBOX2,6)
      AddGadgetLayout(#layout,hBOX3, #Text_date_naissance, 50)
      AddGadgetLayout(#layout,hBOX3, #Date_naissance, 50)
      AddGadgetLayout(#layout,vBOX2, #Text_evenements, 6)
      AddGadgetLayout(#layout,vBOX2, #Editor, 72)
      hBOX4 = HBOXLayout(#layout,vBOX2,10)
      AddGadgetLayout(#layout,hBOX4,#Button_new, 33)
      AddGadgetLayout(#layout,hBOX4, #Button_edit, 33)
      AddGadgetLayout(#layout,hBOX4, #Button_efface, 34)
      
      ;VBOX 3
      AddGadgetLayout(#layout,vBOX3, #Photo, 80)
      hBOX5 = HBOXLayout(#layout,vBOX3,10)
      AddGadgetLayout(#layout,hBOX5,#Button_av, 50,50,5,50,5)
      AddGadgetLayout(#layout,hBOX5,#Button_ap, 50,50,5,50,5)
      AddGadgetLayout(#layout,vBOX3,#Button_del, 10,50,0,50,0)
      
      
      
      
      EndLayout()
      
      
    Else
      MessageRequester("Erreur", "Erreur de Layout") 
      End
    EndIf
    
  EndIf
EndProcedure


Procedure Sauvegarde()
  ; By Dobro
  ; ***********  sauvegarde position de la fenetre ***************
  If OpenFile(#file_save_pos,path$+"chats_fiche.inf")
    x_window.w=WindowX(#win)
    y_window.w=WindowY(#win)
    WriteWord(#file_save_pos,x_window.w)
    WriteWord(#file_save_pos,y_window.w)
    CloseFile(#file_save_pos)
  EndIf
  ; ********************************************************
  
  
  If CreatePreferences(path$+"chats_fiche.prefs")
    PreferenceGroup("parametres")
    nombre_fiche=ListSize(fiche())
    
    WritePreferenceLong ("nbr_fiches", nombre_fiche)
    
    For i=0 To nombre_fiche-1
      SelectElement(fiche(), i)
      nom_chat.s=fiche()\nom_chat.s
      If date_naissance_chat.s=""
        date_naissance_chat.s=FormatDate("%dd/%mm/%yyyy", Date())
        
      EndIf
      
      date_naissance_chat.s=fiche()\date_naissance_chat.s
      evenements.s=fiche()\evenements.s
      evenements.s=ReplaceString(evenements.s,Chr(10),"$") ; transforme les retours a la ligne en  $ ... astuce pour avoir du multiligne dans les fichiers Pref
      evenements.s=ReplaceString(evenements.s,Chr(13),"") ; on vire les chr(13) qui ne servent pas dans un editeur..
      path_image.s=fiche()\path_image.s
      
      If nom_chat.s=""
        MessageRequester("erreur" , "il y aura une fiche vide dans le fichiers.. il faudra la retirer a la main")
      EndIf
      PreferenceGroup("Fiche "+Str(i))
      WritePreferenceString("Nom", nom_chat.s)
      WritePreferenceString("Date Naissance", date_naissance_chat.s)
      WritePreferenceString("evenements", evenements.s)
      WritePreferenceString("photo", path_image.s)
      
    Next i
    ClosePreferences()
    
  EndIf
EndProcedure

Procedure chargement_fiches()
  ; By Dobro
  ClearList(fiche())
  If OpenPreferences(path$+"chats_fiche.prefs")
    PreferenceGroup("parametres")
    nombre_fiche.i=ReadPreferenceLong ("nbr_fiches", 1)
    
    For i=0 To nombre_fiche-1
      PreferenceGroup("Fiche "+Str(i))
      nom_chat.s=ReadPreferenceString("Nom", "")
      date_naissance_chat.s=ReadPreferenceString("Date Naissance","")
      evenements.s=ReadPreferenceString("evenements", "")
      evenements.s=ReplaceString(evenements.s,"$",Chr(10)) ; retransforme les $ en retour a la ligne.. astuce pour avoir du multiligne dans les fichiers Pref
      path_image.s=ReadPreferenceString("photo", "")
      ; Peuple la liste chainée
      AddElement(fiche())
      fiche()\nom_chat.s=nom_chat.s
      fiche()\date_naissance_chat.s=date_naissance_chat.s
      fiche()\evenements.s=evenements.s
      fiche()\path_image.s = path_image.s
    Next i
    ClosePreferences()
  EndIf
  
  ; redessin de la premiere fiche dans l'interface
  If ListSize(fiche()) >0
    SelectElement(fiche(), 0) ; Saute a la premiere fiche
    path_image.s=fiche()\path_image.s
    If path_image.s<>""
      If LoadImage(#image,path_image.s)
        ResizeImage(#image,341,256)
        ImageGadget(#Photo, 531, 124, 341, 256, ImageID(#image), #PB_Image_Border)
      EndIf
    EndIf
    nom_chat.s=fiche()\nom_chat.s
    date_naissance_chat.s=fiche()\date_naissance_chat.s
    evenements.s=fiche()\evenements.s
    ;
    SetGadgetText(#String_Nom,nom_chat.s)
    SetGadgetText(#Date_naissance,date_naissance_chat.s)
    SetGadgetText(#Editor,evenements.s)
  EndIf
EndProcedure

Procedure efface()
  ; By Dobro
  nom_chat.s=""
  date_naissance_chat.s=""
  evenements.s=""
  path_image.s=""
  
  ImageGadget(#Photo, 531, 124, 341, 256, 0, #PB_Image_Border)
  SetGadgetText(#String_Nom,nom_chat.s)
  SetGadgetText(#Date_naissance,date_naissance_chat.s)
  SetGadgetText(#Editor,evenements.s)
EndProcedure



; ***********************************************************************
;

; EPB

Mais on observe un mauvais alignement :
Image

De plus on a des problèmes à l'utilisation à cause de ce genre
de Code :
Image

Image
Conclusion, si vous utilisez les layouts alors n'utilisez que
les layouts. Il n'est pas conseillé de mélanger positionnement
absolu et relatif et La création de gadgets à la volée, n'est
plus possible.

Exercice 3:

Essayer de faire ceci :
Image



Exemple avec un panel:
Image

Il n'y a pas de difficultés majeures.

Code:

Code : Tout sélectionner

XIncludeFile "layout.pbi"
Enumeration 
  #Win
  #LayoutMain
  #LayoutSplitLeft
  #LayoutSplitRight
  #LayoutPanelTab1
  #LayoutPanelTab2
  #LayoutPanelTab3
  #PanelGdg
  #TreeGdg 
  #ListGdg 
  #EditGdg
  #SplitLeftCont
  #SplitRightCont
  #SplitGdg
  #SplitGdgLastPos
  #Btn1
  #Btn2
  #Btn3
  #Btn4
  #Cal1
  #Frame1
  #Track1
  #IP1
  #String1
  #Option1a
  #Option1b
  #Option1c
  #Check1a
  #Check1b
  #Check1c
  #Check1d
    
EndEnumeration


; If LoadFont(1, "Arial", 25)
;   SetGadgetFont(#PB_Default, FontID(1))
; EndIf

OpenWindow(#Win, 0, 0, 500, 350, "GUI-Layout-Demo 6", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget)
If IsWindow(#Win)
  
  PanelGadget(#PanelGdg, 0, 0, 1, 1)
  
  ;TAB 1
  AddGadgetItem(#PanelGdg, -1, "Tab 1")
  
  ContainerGadget(#SplitLeftCont, 0, 0, 1, 1, #PB_Container_Single)
  TreeGadget(#TreeGdg, 0, 0, 1, 1)
  CloseGadgetList()
  
  ContainerGadget(#SplitRightCont, 0, 0, 1, 1, #PB_Container_Single)
  ListViewGadget(#ListGdg, 0, 0, 1, 1)
  EditorGadget(#EditGdg, 0, 0, 1, 1)
  CloseGadgetList()
  
  SplitterGadget(#SplitGdg, 0, 0, 1, 1, #SplitLeftCont, #SplitRightCont, #PB_Splitter_Separator|#PB_Splitter_Vertical)
  
  
  ;TAB 2
  AddGadgetItem(#PanelGdg, -1, "Tab 2")
  Frame3DGadget(#Frame1, 0, 0, 200, 1, "Commands", #PB_Frame3D_Double)
  ButtonGadget(#Btn1, 0, 0, 1, 1, "Button 1")
  ButtonGadget(#Btn2, 0, 0, 1, 1, "Button 2")
  ButtonGadget(#Btn3, 0, 0, 1, 1, "Button 3")
  ButtonGadget(#Btn4, 0, 0, 1, 1, "Button 4")
  CalendarGadget(#Cal1, 0, 0, 1, 1)
  
  
  ;TAB 3
  AddGadgetItem(#PanelGdg, -1, "Tab 3")
  TrackBarGadget(#Track1, 0, 0, 1, 1, 0, 100)
  IPAddressGadget(#IP1, 0, 0, 1, 1)
  StringGadget(#String1, 0, 0, 1, 1, "Test Text")
  OptionGadget(#Option1a, 0, 0, 1, 1, "Option 1")
  OptionGadget(#Option1b, 0, 0, 1, 1, "Option 2")
  OptionGadget(#Option1c, 0, 0, 1, 1, "Option 3")
  CheckBoxGadget(#Check1a, 0, 0, 1, 1, "Checkbox 1")
  CheckBoxGadget(#Check1b, 0, 0, 1, 1, "Checkbox 2")
  CheckBoxGadget(#Check1c, 0, 0, 1, 1, "Checkbox 3")
  CheckBoxGadget(#Check1d, 0, 0, 1, 1, "Checkbox 4")
  CloseGadgetList()
  
  createlayout(#LayoutMain,#win)
  If LayoutInitialized
    createlayout(#LayoutSplitLeft,#SplitLeftCont)
    If LayoutInitialized
      createlayout(#LayoutSplitRight,#SplitRightCont)
      If LayoutInitialized
        createlayout(#LayoutPanelTab1,#PanelGdg)
        If LayoutInitialized
          createlayout(#LayoutPanelTab2,#PanelGdg)
          If LayoutInitialized
            createlayout(#LayoutPanelTab3,#PanelGdg)
            If LayoutInitialized
              
              ; TAB123
              AddGadgetLayout(#LayoutMain,#Null, #PanelGdg, 100)
              
              ; Splitter
              AddGadgetLayout(#LayoutPanelTab1,#Null, #SplitGdg, 100) 
              
              ; TAB 1
              AddGadgetLayout(#LayoutSplitLeft,#Null, #TreeGdg, 100)
              tmp1 = VBOXLayout(#LayoutSplitRight,#Null,100)
              AddGadgetLayout(#LayoutSplitRight,tmp1, #ListGdg, 50)
              AddGadgetLayout(#LayoutSplitRight,tmp1, #EditGdg, 50)
              
              ; TAB 2
              tmp1 = HBOXLayout(#LayoutPanelTab2,#Null, 100)
              tmp2 = VFrameLayout(#LayoutPanelTab2,tmp1, #Frame1, 30)			
              AddGadgetLayout(#LayoutPanelTab2,tmp2, #Btn1, 15)
              AddGadgetLayout(#LayoutPanelTab2,tmp2, #Btn2, 15)
              AddSpacer(#LayoutPanelTab2,tmp2, 20)
              AddGadgetLayout(#LayoutPanelTab2,tmp2, #Btn3, 15)
              AddSpacer(#LayoutPanelTab2,tmp2, 20)
              AddGadgetLayout(#LayoutPanelTab2,tmp2, #Btn4, 15)
              AddGadgetLayout(#LayoutPanelTab2,tmp1, #Cal1, 70)
              
              ; TAB 3
              tmp1 = VBOXLayout(#LayoutPanelTab3,#Null, 100)
              AddGadgetLayout(#LayoutPanelTab3,tmp1, #Track1, 10)		
              tmp2 = HBOXLayout(#LayoutPanelTab3,tmp1, 10)
              AddGadgetLayout(#LayoutPanelTab3,tmp2, #IP1, 30)			
              AddGadgetLayout(#LayoutPanelTab3,tmp2, #String1, 70)			
              tmp3 = HBOXLayout(#LayoutPanelTab3,tmp1, 80)
              tmp4 = VBOXLayout(#LayoutPanelTab3,tmp3, 50)
              AddGadgetLayout(#LayoutPanelTab3,tmp4, #Option1a, 10)			
              AddGadgetLayout(#LayoutPanelTab3,tmp4, #Option1b, 10)		
              AddGadgetLayout(#LayoutPanelTab3,tmp4, #Option1c, 10)			
              AddSpacer(#LayoutPanelTab3,tmp4, 70)			
              tmp5 = VBOXLayout(#LayoutPanelTab3,tmp3, 50)
              AddGadgetLayout(#LayoutPanelTab3,tmp5, #Check1a, 10)			
              AddGadgetLayout(#LayoutPanelTab3,tmp5, #Check1b, 10)			
              AddGadgetLayout(#LayoutPanelTab3,tmp5, #Check1c, 10)			
              AddGadgetLayout(#LayoutPanelTab3,tmp5, #Check1d, 10)		
              AddSpacer(#LayoutPanelTab3,tmp5, 60)			
              EndLayout()
              
              SplitGdgLastPos = #PB_Any
              
              Repeat
                Select WaitWindowEvent()
                  Case #PB_Event_Gadget
                    Select EventGadget()
                      Case #SplitGdg
                        ; redimensionner uniquement si le splitter a été déplacé
                        If SplitGdgLastPos <> GetGadgetState(#SplitGdg)
                          ; Sizer pas affecté, n'a pas besoin d'être redimensionné
                          
                          ;ResizeLayout() marche très bien
                          
                          ResizeOneLayout(#LayoutSplitLeft)
                          ResizeOneLayout(#LayoutSplitRight)
                          
                          SplitGdgLastPos = GetGadgetState(#SplitGdg)
                        EndIf
                    EndSelect        
                  Case #PB_Event_SizeWindow, #PB_Event_MaximizeWindow, #PB_Event_RestoreWindow 
                    ResizeLayout()
                  Case #PB_Event_CloseWindow
                    Select EventWindow()
                      Case win
                        CloseWindow(win)
                        win = 0
                        Break
                    EndSelect
                EndSelect
              ForEver
              FreeLayout()
            Else
              MessageRequester("Erreur", "Le Layout n'a pas pu être initialisé")  
            EndIf
          Else
            MessageRequester("Erreur", "Le Layout n'a pas pu être initialisé")  
          EndIf
        Else
          MessageRequester("Erreur", "Le Layout n'a pas pu être initialisé")  
        EndIf
      Else
        MessageRequester("Erreur", "Le Layout n'a pas pu être initialisé")  
      EndIf
    Else
      MessageRequester("Erreur", "Le Layout n'a pas pu être initialisé")  
    EndIf
  Else
    MessageRequester("Erreur", "Le Layout n'a pas pu être initialisé")  
  EndIf
Else
  MessageRequester("Erreur", "Fenêtre pas initialisée") 
EndIf

End

En conclusion,
l'utilisation des layouts est une charge sup-
-plémentaire pour le programmeur, mais qui vaut le coup pour
les applications dont on sait que l'utilisateur redimension-
-nera sa fenêtre. Tous les problèmes de DPI sont réglés.
(voir le post "Êtes-vous DPI aware ?"
http://www.purebasic.fr/french/viewtopi ... 21&t=12634)
Si en plus, vous utilisez la bibliothèque "Preference" pour
sauvegarder la taille de la (les) fenêtre(s), l'utiisateur
redimensionnera sa fenêtre lui-même au bonnes dimensions et la
retrouvera sans problèmes d'affichages (boutons trop petits,
etc.).

Le code du layout.pbi reste à être optimisé et une bibliothèque
reste à faire...

Enfin, pour être pleinement opérationnel, un module layout
devrait être intégré dans un éditeur visuel.

Mesa.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: [Tuto] Layouts

Message par Kwai chang caine »

Et ben !!!! que de travail 8O
Ca c'est du TUTO...merci beaucoup MESA 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: [Tuto] Layouts

Message par djes »

Chapeau ! :D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: [Tuto] Layouts

Message par Backup »

Merci :)

Tuto ajouté dans le sommaire
ici : http://www.purebasic.fr/french/viewtopi ... =21&t=6664
(tuto 13 section utilisateur Avertis)

en esperant, que le Chiffre 13 , ne te gene point :)
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: [Tuto] Layouts

Message par dayvid »

Quel tuto Mesa :o
Merci :)
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Répondre