Page 1 sur 2

Redimensionnement automatique d'une interface

Publié : mar. 22/févr./2005 22:38
par Flype
Il y a quelques mois quelqu'un sur le forum anglais ( USCode ) faisait part d'un algorithme simple et efficace pour redimensionner une interface. L'idée était très séduisante et rapide. Gnozal par la suite l'a adaptée pour en faire une userlibrairie : la PureRESIZE.
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 :P

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
DEUXIEME FICHIER : exemple d'utilisation

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

Publié : mar. 22/févr./2005 22:46
par Flype
ce source est multi-plateforme... en principe...

il y a juste un appel à l'API à la ligne 204 : InvalidateRect_(GadgetID(RS()\Gadget),0,1)
j'aimerais pouvoir éviter cet appel mais dans certains cas le rafraichissement sous windows 98 ou meme supérieur le nécessite.

@Fred est-il possible de créer une nouvelle fonction genre 'UpdateGadget(GadgetID) qui lui serait multi plateforme ?

Publié : mar. 22/févr./2005 23:07
par nico
Je viens de l'essayer, vraiment nickel. :D

Publié : mer. 23/févr./2005 0:02
par Flype
:lol:

Publié : mer. 23/févr./2005 0:23
par Le Soldat Inconnu
Pas mal :D

j'aurais ajouté dans la procedure MinMax la prise en compte de la taille des bordures de la fenêtres, afin que la taille entrée comme min ou max soit celle de la zone utilisable de la fen :wink:

Publié : mer. 23/févr./2005 0:41
par Fred
Le code est vraiment bien construit. Du beau boulot ! A propos de la routine UpdateGadget(), en principe elle ne devrait pas etre utile. Peux tu me dire les gadgets qui posent probleme ?

Publié : mer. 23/févr./2005 7:51
par Flype
regis> oui c vrai - bonne remarque

fred>
Merci, en général ceux de type 'Static'...
dans l'exemple fournit tu verras que si on enlève le InvalidateRect_()
les gadgets LISTE ou PROPRIETE ne se recentre pas correctement par ex.

bon je pars au travail, ce soir je mettrais à jour ce source en tenant compte de ce que regis a proposé, et plus si nécessaire...

Publié : mer. 23/févr./2005 13:05
par gnozal
@Flype : J'ai fait une traduction rapide en PureRESIZE, çà fonctionne pareil sur mon PC (et c'est plus court 8)).

Code : Tout sélectionner

Procedure MyCallback(WindowID, Message, wParam, lParam) 
  Result = #PB_ProcessPureBasicEvents 
  ; 
  Result = PureRESIZE_CallBack(WindowID, Message, wParam, lParam, Result)
  ; 
  ProcedureReturn Result 
EndProcedure
;
ww = 400
wh = 477
If 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")
EndIf
SetWindowCallback(@MyCallback())
; ----- PureRESIZE début
PureRESIZE_SetGadgetResize(0,   1,1,1,1)
PureRESIZE_SetGadgetResize(1,   1,1,1,0)
PureRESIZE_SetGadgetResize(2,   1,1,1,1)
PureRESIZE_SetGadgetResize(3,   0,1,1,0)
PureRESIZE_SetGadgetResize(4,   1,0,1,1)
PureRESIZE_SetGadgetResize(5,   1,1,1,0)
PureRESIZE_SetGadgetResize(6,   1,1,0,0)
PureRESIZE_SetGadgetResize(7,   1,1,0,0)
PureRESIZE_SetGadgetResize(8,   1,1,1,0)
PureRESIZE_SetGadgetResize(9,   1,1,1,0)
PureRESIZE_SetGadgetResize(10,  1,0,0,0)
PureRESIZE_SetGadgetResize(11,  1,0,0,0)
PureRESIZE_SetGadgetResize(12,  1,0,0,0)
PureRESIZE_SetGadgetResize(13,  1,0,0,0)
PureRESIZE_SetGadgetResize(14,  0,0,1,0)
PureRESIZE_SetWindowMaximumSize(0, 800,600)
PureRESIZE_SetWindowMinimumSize(0, WindowWidth()+8,175)
; ----- PureRESIZE fin
;
Repeat
  Evenement = WaitWindowEvent()
Until Evenement = #PB_Event_CloseWindow
;- Fin
Avec PureRESIZE, pas besoin de spécifier la fenêtre (la librairie recherche le 'parent' du gadget, et c'est là qu'il y a peut-être eu des problèmes ?).
Si tu as des exemples qui ne fonctionnent pas avec ma lib, je suis preneur (j'adore chercher les bugs :D ).

Publié : mer. 23/févr./2005 20:08
par nico
Flype a conçu sa lib pour qu'elle soit multi-plateformes, est-ce le cas de ta Lib?

Publié : jeu. 24/févr./2005 2:27
par Flype
fred>
cet exemple isole au moins un probleme ( textgadget dans un containergadget )
il faut dé-commenté les InvalidateRect_() pour voir la difference.

Code : Tout sélectionner

OpenWindow(0,0,0,400,400,#PB_Window_SizeGadget|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"test")
CreateStatusBar(0,WindowID())
CreateGadgetList(WindowID())
ContainerGadget(0,50,50,300,300,#PB_Container_Single)
TextGadget(1,50,20,200,50,"CE GADGET N'EST PAS CORRECTEMENT RAFRAICHIT",#PB_Text_Center)
TextGadget(2,50,90,200,50,"CELUI LA NON PLUS - SAUF AVEC InvalidateRect_()",#PB_Text_Center|#PB_Text_Border)
CloseGadgetList()

Repeat
  Select WaitWindowEvent()
    
    Case #PB_Event_CloseWindow
      End
      
    Case #PB_Event_Gadget
      If EventGadgetID()=14 : End : EndIf
      
    Case #PB_Event_SizeWindow
      ResizeGadget(0,-1,-1,WindowWidth()-100,WindowHeight()-100)
      ResizeGadget(1,-1,-1,WindowWidth()-200,-1)
      ResizeGadget(2,-1,-1,WindowWidth()-200,-1)
      ;InvalidateRect_(GadgetID(1),0,1)
      ;InvalidateRect_(GadgetID(2),0,1)
  EndSelect
ForEver
gnozal>
ca fait plaisir de te parler en francais :D
l'exemple donné au début du post ne fonctionne pas avec ta lib si on clique sur le bouton Maximize d'une fenetre. certains des gadgets ne sont pas pris en compte dans le redimensionnement.

nico>
les fonctions concernant le MinMaxInfo sont uniquement pour windows par contre. ne serait ce que à cause de la procedure CallBack et de l'evenement #GETMINMAXINFO. seul toi, Fred, pourrait trouver une parade multi-plateforme sur ce point précis.

Publié : jeu. 24/févr./2005 2:34
par Flype
fred>
alors que celui là fonctionne ( textgadget dans un panelgadget )

Code : Tout sélectionner

OpenWindow(0,0,0,400,400,#PB_Window_SizeGadget|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"test")
CreateStatusBar(0,WindowID())
CreateGadgetList(WindowID())
ContainerGadget(0,50,50,300,300,#PB_Container_Single)
PanelGadget(1,10,10,280,280)
AddGadgetItem(1,0,"Page 1")
TextGadget(2,40,50,200,50,"VOICI LE TEXTGADGET DE TEST NUMERO UN",#PB_Text_Center)
AddGadgetItem(1,1,"Page 2")
TextGadget(3,40,50,200,50,"VOICI UN DEUXIEME TEXTGADGET DE TEST",#PB_Text_Center|#PB_Text_Border)
CloseGadgetList()
CloseGadgetList()

Repeat
  Select WaitWindowEvent()
    
    Case #PB_Event_CloseWindow
      End
      
    Case #PB_Event_Gadget
      If EventGadgetID()=14 : End : EndIf
      
    Case #PB_Event_SizeWindow
      ResizeGadget(0,-1,-1,WindowWidth()-100,WindowHeight()-100)
      ResizeGadget(1,-1,-1,WindowWidth()-120,WindowHeight()-120)
      ResizeGadget(2,-1,-1,WindowWidth()-200,-1)
      ResizeGadget(3,-1,-1,WindowWidth()-200,-1)
      
  EndSelect
ForEver

Publié : jeu. 24/févr./2005 2:43
par Flype
encore plus simple - marche pas non plus :
OpenWindow(0,0,0,400,400,#PB_Window_SizeGadget|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"test")
CreateGadgetList(WindowID())

TextGadget(0,40,50,200,50,"VOICI LE TEXTGADGET DE TEST NUMERO UN",#PB_Text_Center)
TextGadget(1,40,120,200,50,"VOICI UN DEUXIEME TEXTGADGET DE TEST",#PB_Text_Center|#PB_Text_Border)

Repeat
Select WaitWindowEvent()

Case #PB_Event_CloseWindow
End

Case #PB_Event_SizeWindow
ResizeGadget(0,-1,-1,WindowWidth()-200,-1)
ResizeGadget(1,-1,-1,WindowWidth()-200,-1)

EndSelect
ForEver

Publié : jeu. 24/févr./2005 2:51
par Flype
gnozal>

voilà un exemple :
clique sur le bouton Maximize ( chez moi sur XP ca marche pas à ta lib )

Code : Tout sélectionner

IncludeFile "rs.pb"

#PureRESIZE_TEST = 1

ww = 400
wh = 477
OpenWindow(0,0,0,ww,wh,#PB_Window_SizeGadget|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#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")

PureCOLOR_SetGadgetColor(1,$FFFFFF,$888888)
PureCOLOR_SetGadgetColor(5,$FFFFFF,$888888)

If #PureRESIZE_TEST
  PureRESIZE_SetGadgetResize(0,   1,1,1,1) 
  PureRESIZE_SetGadgetResize(1,   1,1,1,0) 
  PureRESIZE_SetGadgetResize(2,   1,1,1,1) 
  PureRESIZE_SetGadgetResize(3,   0,1,1,0) 
  PureRESIZE_SetGadgetResize(4,   1,0,1,1) 
  PureRESIZE_SetGadgetResize(5,   1,1,1,0) 
  PureRESIZE_SetGadgetResize(6,   1,1,0,0) 
  PureRESIZE_SetGadgetResize(7,   1,1,0,0) 
  PureRESIZE_SetGadgetResize(8,   1,1,1,0) 
  PureRESIZE_SetGadgetResize(9,   1,1,1,0) 
  PureRESIZE_SetGadgetResize(10,  1,0,0,0) 
  PureRESIZE_SetGadgetResize(11,  1,0,0,0) 
  PureRESIZE_SetGadgetResize(12,  1,0,0,0) 
  PureRESIZE_SetGadgetResize(13,  1,0,0,0) 
  PureRESIZE_SetGadgetResize(14,  0,0,1,0) 
  ;PureRESIZE_SetWindowMaximumSize(0, 800,600) 
  ;PureRESIZE_SetWindowMinimumSize(0, WindowWidth()+8,175) 
Else
  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)
  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)
EndIf

Procedure MyCallback(WindowID,message,wParam,lParam)
  
  result = #PB_ProcessPureBasicEvents 
  
  result = PureCOLOR_CallBack(WindowID, message, wParam, lParam, result)
  
  If #PureRESIZE_TEST
    result = PureRESIZE_CallBack(WindowID, message, wParam, lParam, result) 
  Else
    result = RS_MinMaxCallback(WindowID,message,wParam,lParam,result)
  EndIf
  
  ProcedureReturn result
  
EndProcedure

SetWindowCallback(@MyCallback())

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
    Case #PB_Event_SizeWindow
      If #PureRESIZE_TEST=0 : RS_Resize(0) : EndIf
    Case #PB_Event_Gadget
      If EventGadgetID()=14 : End : EndIf
  EndSelect
ForEver

Publié : jeu. 24/févr./2005 9:01
par gnozal
Flype a conçu sa lib pour qu'elle soit multi-plateformes, est-ce le cas de ta Lib?
Non, il y a quelques appels WinAPI et le callback.
voilà un exemple :
clique sur le bouton Maximize ( chez moi sur XP ca marche pas à ta lib )
Merci pour ton exemple!
Chez moi çà redimensionne correctement, sauf la rangée de boutons !?
Peut-être un problème de 'parent' ?. Je vais jeter un coup d'oeil.

Publié : jeu. 24/févr./2005 9:32
par Flype
la rangée de boutons n'est pas, contrairement aux autres boutons dans l'exemple, dans un Container ou un Panel...