Redimensionnement automatique d'une interface

Partagez votre expérience de PureBasic avec les autres utilisateurs.
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Je pense avoir trouvé !
Certains gadgets n'étaient pas redimensionnés car dans certains cas mon callback ne recevait pas d'évènement(s)!
Aucune idée pourquoi ... Captés par Purebasic ...?
En ajoutant une commande de redimensionnement après l'évènement #PB_Event_SizeWindow, çà fonctionnait (un peu comme ton exemple).
Mais je voulais tout gérer dans le callback (plus commode pour l'utilisateur), donc j'ai ajouté un 'hack' comme on dit en bon français pour compenser cette perte d'évènements, et çà semble fonctionner.
Peux-tu retester la nouvelle version de la lib ?
http://people.freenet.de/gnozal/PureRESIZE.zip
Cet exemple fonctionne en tout cas :

Code : Tout sélectionner

; CallBack
Procedure MyCallback(WindowID,Message,wParam,lParam)
  result = #PB_ProcessPureBasicEvents
  result = PureCOLOR_CallBack(WindowID, Message, wParam, lParam, result)
  result = PureRESIZE_CallBack(WindowID, Message, wParam, lParam, result)
  ProcedureReturn result
EndProcedure
; Window
ww = 400
wh = 477
If 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")
EndIf
; Callback
SetWindowCallback(@MyCallback())
; Colors
PureCOLOR_SetGadgetColor(1,$FFFFFF,$888888)
PureCOLOR_SetGadgetColor(5,$FFFFFF,$888888)
; Resize
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,275)
;
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
    Case #PB_Event_Gadget
      If EventGadgetID()=14 : End : EndIf
  EndSelect
ForEver
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

merci gnozal je vais tester çà sur une grosse interface...
Image
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

merci gnozal je vais tester çà
Merci !
J'espère que çà fonctionne enfin. Je ne comprends pas pourquoi certains évènements sont perdus au niveau du callback et qu'il faille ajouter un 'rattrapage' dans la boucle des évènements au niveau de #PB_Event_SizeWindow.
J'espère que mon truc fonctionne.
sur une grosse interface...
Il n'y a pas que la taille qui compte :lol:
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

lol :lol:

au fait gnozal tu es francais, non ?
tu parle aussi anglais que francais alors je sais pas du coup 8O
Image
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

et allemand je crois
gnozal doit être interprète au parlement européen ? :)
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Je suis français, mais je parle aussi allemand et anglais (les langues des 3 forums purebasic :wink:).
En fait, j'habite en Alsace à quelques kilomètres de Fred 8)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

gnozal a écrit :Je suis français, mais je parle aussi allemand et anglais (les langues des 3 forums purebasic :wink:).
En fait, j'habite en Alsace à quelques kilomètres de Fred 8)
And what about a french page of your website ? :wink:
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Denis a écrit :And what about a french page of your website ? :wink:
Pourquoi faire ? C'est du boulot en plus :oops:
C'est juste un site de téléchargement de quelques utilitaires ...
Il se trouve que l'anglais est la langue internationale, et c'est encore plus vrai pour l'informatique (voir les commandes purebasic :wink:). Je pense que si l'on veut dépasser le niveau débutant en informatique, il faut maîtriser un minimum d'anglais !
Et pratiquer une autre langue n’est ni déshonorant, ni une trahison envers la langue nationale (polémique cocorico), c'est un plus, surtout pour les français traditionnellement pas très doués en langues.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Je ne relance aucune polémique ni chauvinisme d'aucune sorte, simplement sur ce forum il y a beaucoup de très jeunes codeus qui ne maitrisent pas forcément l'anglais, c'est pour eux que je parle, moi j'arrive à me débrouiller :wink:
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message par gnozal »

Denis a écrit :il y a beaucoup de très jeunes codeus qui ne maitrisent pas forcément l'anglais, c'est pour eux que je parle, moi j'arrive à me débrouiller :wink:
Les jeunes apprennent vite :D
Si un vieux comme moi y arrive ...
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

@Flype: A mon tour de dire un grand merci pour le source ! Nickel !

(Au passage, mais les gens auront corrigé, dans la deuxième boucle Repeat/Until de l'exemple, il faut bien sur lire: If Evenement = #PB_Event_SizeWindow )
olivier
Messages : 305
Inscription : mer. 05/janv./2005 12:58
Localisation : http://www.tib-net.com/meca/index.htm

Message par olivier »

Moi je fais cela comme ça. Ce n'est pas paramêtrable, mais cela à la mérite d'être simple d'adaptation à chaque fênetre.
1 étape : enregistrer toutes les positions des gadgets en cours
2 étape : resize les gadget à chaque resizewindow.

C'est sans callback ! Sans préparamêtre !

V4 - Attention code pour - V4

Code : Tout sélectionner

Procedure sauve_taille_gadget(id_window,nb_max_gadget)
    
    Structure gadget
        id.l
        x.l
        y.l
        l.l
        h.l
    EndStructure
    
    Global Dim gadget.gadget(1)
    nb_gadget=0
    For num_gadget=0 To nb_max_gadget ; #PB_Compiler_EnumerationValue 
        If IsGadget(num_gadget)
            Debug num_gadget
            nb_gadget=nb_gadget+1
            redim gadget.gadget(nb_gadget)
            gadget(nb_gadget)\id=num_gadget
            gadget(nb_gadget)\x=GadgetX(num_gadget)
            gadget(nb_gadget)\y=GadgetY(num_gadget)
            gadget(nb_gadget)\h=GadgetHeight(num_gadget)
            gadget(nb_gadget)\l=GadgetWidth(num_gadget)
        EndIf
        
    Next
    gadget(0)\id=nb_gadget
    gadget(0)\h=WindowHeight(id_window)
    gadget(0)\l=WindowWidth(id_window)
EndProcedure


Procedure resize_gadget(id_window)
    hw=gadget(0)\h
    lw=gadget(0)\l
    nhw=WindowHeight(id_window)
    nlw=WindowWidth(id_window)
    For num_gadget=1 To gadget(0)\id
        Debug num_gadget

        If IsGadget(gadget(num_gadget)\id)
            nx=gadget(num_gadget)\x*nlw/lw
            ny=gadget(num_gadget)\y*nhw/hw
            nh=gadget(num_gadget)\h*nhw/hw
            nl=gadget(num_gadget)\l*nlw/lw
            
            ResizeGadget(gadget(num_gadget)\id,nx,ny,nl,nh) 
        EndIf
        
    Next
    
EndProcedure
ww=600
wh=500
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(0))
CreateGadgetList(WindowID(0))
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")
ButtonGadget(15,ww-80,450,70,21,"Quitter2")



sauve_taille_gadget(0,100) ;100 c'est le nombre de gadget max,
;comme dans mes programme l'énumeration des gadget à lieu avant j'utilise :#PB_Compiler_EnumerationValue 
;
Repeat
    Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
            End
        Case #PB_Event_Gadget
        Case #PB_Event_SizeWindow  
            resize_gadget(0)
            
    EndSelect
ForEver


Vive le temps libre !
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

C'est intéressant ton truc et facile à mettre en oeuvre...
Mais comme tu l'as dis çà réagit pas pareil, pas comme j'aime...

Sinon juste un petit truc, as-tu remarqué que les TextGadget sont mal rafraichit au redimensionnement, les WebGadget aussi parfois ?

Pour palier au problème et tout en restant cross-platform voici une petite macro bien utile, il faut complèter les types de gadgets qui posent problème :

Code : Tout sélectionner

Macro ResizeGadgetEx(gadget,x,y,width,height)
  CompilerSelect #PB_Compiler_OS
    CompilerCase #PB_OS_Windows
      ResizeGadget(gadget,x,y,width,height)
      Select GadgetType(gadget)
        Case #PB_GadgetType_Text, #PB_GadgetType_Web ; à complèter
          RedrawWindow_(GadgetID(gadget),0,0,#RDW_FRAME|#RDW_INTERNALPAINT|#RDW_ERASE|#RDW_INVALIDATE)
      EndSelect
    CompilerCase #PB_OS_Linux
      LinuxRedrawWindow_(GadgetID(gadget),#LINUX_EXAMPLE) ; à définir
    CompilerCase #PB_OS_MacOS
      MacOSRedrawWindow_(GadgetID(gadget),#MACOS_EXAMPLE) ; à définir
  CompilerEndSelect
EndMacro
Image
Répondre