Mais j'ai rencontrée qq pb avec cette dernière. Depuis j'ai peaufinée ma version pour mon compte. Ensuite je l'ai largement utilisée dans beaucoup de situations, même avec des interfaces comportant des PanelGadget, des ContainerGadget, et même parfois + de 300 gadgets.
Ca reste très rapide... Kado

PREMIER SOURCE : FICHIER INCLUDE 'rs.pb'
Code : Tout sélectionner
;-
;- Nom : rs_lib
;- Auteur: Flype
;- Date: 22 fev 2005
;-
;- Descr: fichier d'include comportant des fonctions de
;- redimensionnement automatique d'interface graphique
;-
;- Note: Ce code est basé sur l'algorithme de USCode
;-
;-
;- WM_GETMINMAXINFO
;-
Structure RS_MMI_STRUCT
Window.l
MinWidth.w
MinHeight.w
MaxWidth.w
MaxHeight.w
EndStructure
NewList RS_MMI.RS_MMI_STRUCT()
Procedure.b RS_RegisterMinMax(WindowID.l,MinWidth.w,MinHeight.w,MaxWidth.w,MaxHeight.w)
If AddElement(RS_MMI())=#False
ProcedureReturn #False
EndIf
If MaxWidth = -1
MaxWidth = GetSystemMetrics_(#SM_CXSCREEN)
EndIf
If MaxHeight = -1
MaxHeight = GetSystemMetrics_(#SM_CYSCREEN)
EndIf
RS_MMI()\Window = Window
RS_MMI()\MinWidth = MinWidth
RS_MMI()\MinHeight = MinHeight
RS_MMI()\MaxWidth = MaxWidth
RS_MMI()\MaxHeight = MaxHeight
ProcedureReturn #True
EndProcedure
Procedure.b RS_UnregisterMinMax(WindowID.l)
ForEach RS_MMI()
If RS_MMI()\Window=Window
DeleteElement(RS_MMI())
ProcedureReturn #True
EndIf
Next
ProcedureReturn #False
EndProcedure
Procedure.l RS_MinMaxCallback(hWindow.l,message.l,wParam.l,lParam.l,result.l)
If message = #WM_GETMINMAXINFO
ForEach RS_MMI()
If WindowID(RS_MMI()\Window)=hWindow
*pMinMax.MINMAXINFO=lParam
*pMinMax\ptMinTrackSize\x=RS_MMI()\MinWidth
*pMinMax\ptMinTrackSize\y=RS_MMI()\MinHeight
*pMinMax\ptMaxTrackSize\x=RS_MMI()\MaxWidth
*pMinMax\ptMaxTrackSize\y=RS_MMI()\MaxHeight
ProcedureReturn #Null
EndIf
Next
EndIf
ProcedureReturn result
EndProcedure
;-
;- WM_SIZE
;-
Structure RS_STRUCT
Window.l
Gadget.l
left.w
Left_Lock.b
top.w
Top_Lock.b
right.w
Right_Lock.b
bottom.w
Bottom_Lock.b
EndStructure
NewList RS.RS_STRUCT()
Procedure.b RS_RegisterGadget(WindowID.l,GadgetID.l,left.b,top.b,right.b,bottom.b)
If AddElement(RS())
RS()\Window = WindowID
RS()\Gadget = GadgetID
RS()\Left_Lock = left
RS()\Top_Lock = top
RS()\Right_Lock = right
RS()\Bottom_Lock = bottom
UseWindow(WindowID)
ww = WindowWidth()
wh = WindowHeight()
gx = GadgetX(GadgetID)
gy = GadgetY(GadgetID)
gw = GadgetWidth(GadgetID)
gh = GadgetHeight(GadgetID)
If left = 0 : RS()\left = ww-gx : EndIf
If top = 0 : RS()\top = wh-gy : EndIf
If right = 1 : RS()\right = ww-(gx+gw) : EndIf
If bottom = 1 : RS()\bottom = wh-(gy+gh) : EndIf
ProcedureReturn #True
EndIf
EndProcedure
Procedure.b RS_UnregisterGadget(WindowID.l,GadgetID.l)
ForEach RS()
If RS()\Window=WindowID And RS()\Gadget=GadgetID
DeleteElement(RS())
ProcedureReturn #True
EndIf
Next
ProcedureReturn #False
EndProcedure
Procedure.l RS_ResizeCallBack(hWindow.l,message.l,wParam.l,lParam.l,result.l)
If message=#WM_SIZING Or message=#WM_SIZE
ForEach RS()
If WindowID(RS()\Window)=hWindow
UseWindow(RS()\Window)
ww = WindowWidth()
wh = WindowHeight()
gx = GadgetX(RS()\Gadget)
gy = GadgetY(RS()\Gadget)
gw = -1
gh = -1
If RS()\Left_Lock = #False : gx=ww-RS()\left : EndIf
If RS()\Top_Lock = #False : gy=wh-RS()\top : EndIf
If RS()\Right_Lock = #True : gw=ww-gx-RS()\right : EndIf
If RS()\Bottom_Lock = #True : gh=wh-gy-RS()\bottom : EndIf
ResizeGadget(RS()\Gadget,gx,gy,gw,gh)
InvalidateRect_(GadgetID(RS()\Gadget),0,0)
result = #Null
EndIf
Next
EndIf
ProcedureReturn result
EndProcedure
Procedure.l RS_Resize(WindowID.l)
ForEach RS()
If RS()\Window=WindowID
UseWindow(RS()\Window)
ww = WindowWidth()
wh = WindowHeight()
gx = GadgetX(RS()\Gadget)
gy = GadgetY(RS()\Gadget)
gw = -1
gh = -1
If RS()\Left_Lock = #False : gx=ww-RS()\left : EndIf
If RS()\Top_Lock = #False : gy=wh-RS()\top : EndIf
If RS()\Right_Lock = #True : gw=ww-gx-RS()\right : EndIf
If RS()\Bottom_Lock = #True : gh=wh-gy-RS()\bottom : EndIf
ResizeGadget(RS()\Gadget,gx,gy,gw,gh)
InvalidateRect_(GadgetID(RS()\Gadget),0,1)
EndIf
Next
EndProcedure
Code : Tout sélectionner
;-
;- Exemple d'utilisation du fichier rs ( flype 22/10/2005 )
;-
IncludeFile "rs.pb"
;-
;- Création d'une interface de démonstration ( 14 gadgets )
;-
ww = 400
wh = 477
OpenWindow(0,0,0,ww,wh,#PB_Window_SizeGadget|#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"test")
CreateStatusBar(0,WindowID())
CreateGadgetList(WindowID())
ContainerGadget(0,10,10,ww-20,320,#PB_Container_Flat)
TextGadget(1,0,0,ww-20,16,"LISTE",#PB_Text_Center)
ListIconGadget(2,10,26,ww-40,284,"Id.",80,#PB_ListIcon_GridLines|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_FullRowSelect)
AddGadgetColumn(2,1,"Description",185)
AddGadgetColumn(2,2,"Index",60)
ButtonGadget(3,ww-36,2,12,12,"-")
CloseGadgetList()
ContainerGadget(4,10,340,ww-20,80,#PB_Container_Flat)
TextGadget(5,0,0,ww-20,16,"PROPRIETES",#PB_Text_Center)
HyperLinkGadget(6, 10,25,80,21,"Identifiant :",$FFFF)
HyperLinkGadget(7,10,50,80,21,"Description :",$FFFF)
StringGadget(8,100,25,ww-130,21,"",#PB_String_UpperCase)
StringGadget(9,100,50,ww-130,21,"")
CloseGadgetList()
ButtonGadget(10,10,430,70,21,"Actualiser")
ButtonGadget(11,85,430,70,21,"Ajouter")
ButtonGadget(12,160,430,70,21,"Modifier")
ButtonGadget(13,235,430,70,21,"Effacer")
ButtonGadget(14,ww-80,430,70,21,"Quitter")
;-
;- Définitions des règles de redimensionnement
;-
;- RS_RegisterGadget(WindowID,GadgetID,LEFT,TOP,RIGHT,BOTTOM)
;- RS_RegisterMinMax(WindowID,MinWIDTH,MinHEIGHT,MaxWIDTH,MaxHEIGHT)
;-
RS_RegisterGadget(0,0, 1,1,1,1)
RS_RegisterGadget(0,1, 1,1,1,0)
RS_RegisterGadget(0,2, 1,1,1,1)
RS_RegisterGadget(0,3, 0,1,1,0)
RS_RegisterGadget(0,4, 1,0,1,1)
RS_RegisterGadget(0,5, 1,1,1,0)
RS_RegisterGadget(0,6, 1,1,0,0) ; la matrice ;-)
RS_RegisterGadget(0,7, 1,1,0,0)
RS_RegisterGadget(0,8, 1,1,1,0)
RS_RegisterGadget(0,9, 1,1,1,0)
RS_RegisterGadget(0,10, 1,0,0,0)
RS_RegisterGadget(0,11, 1,0,0,0)
RS_RegisterGadget(0,12, 1,0,0,0)
RS_RegisterGadget(0,13, 1,0,0,0)
RS_RegisterGadget(0,14, 0,0,1,0)
RS_RegisterMinMax(0,WindowWidth()+8,175,800,600)
;-
;- La taille mini et maxi de la fenêtre peuvent être
;- contrôlées dans une procédure callback comme ceci :
;-
;- RS_MinMaxCallback(WindowID,message,wParam,lParam,resultat)
;-
Procedure MyCallback(WindowID,message,wParam,lParam)
resultat = #PB_ProcessPureBasicEvents
resultat = RS_MinMaxCallback(WindowID,message,wParam,lParam,resultat)
ProcedureReturn resultat
EndProcedure
;-
;- Gestion simplifiées des évênements
;-
;- Seule la ligne 'Case #PB_Event_SizeWindow : RS_Resize(WindowID)'
;- est nécessaire pour procéder au redimensionnement automatique.
;-
SetWindowCallback(@MyCallback())
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow : End
Case #PB_Event_SizeWindow : RS_Resize(0)
EndSelect
ForEver
;-
;- ou bien...
;-
SetWindowCallback(@MyCallback())
Repeat
Evenement = WaitWindowEvent()
If Evenement = #PB_Event_CloseWindow
RS_Resize(0)
EndIf
Until Evenement = #PB_Event_CloseWindow
;- Fin