Redimensionnement automatique d'une interface

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Redimensionnement automatique d'une interface

Message 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
Dernière modification par Flype le mar. 22/févr./2005 22:54, modifié 1 fois.
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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 ?
Image
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Je viens de l'essayer, vraiment nickel. :D
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

:lol:
Image
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message 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 ?
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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...
Image
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message 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 ).
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Flype a conçu sa lib pour qu'elle soit multi-plateformes, est-ce le cas de ta Lib?
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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.
Dernière modification par Flype le jeu. 24/févr./2005 2:39, modifié 2 fois.
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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
Image
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message 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.
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

la rangée de boutons n'est pas, contrairement aux autres boutons dans l'exemple, dans un Container ou un Panel...
Image
Répondre