MultiWindow.

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

MultiWindow.

Message par Chris »

Un petit code que j'ai fait, comme ça :roll:

Bon, ça vole pas bien haut, mais si ça peut être utile à quelqu'un!

Code : Tout sélectionner

;- Constantes Fenêtres
Enumeration
  #Win_Main
  #Win_Child_1
  #Win_Child_2
EndEnumeration

;- Constantes Gadgets
Enumeration
  #Text_1
  #Btn_1
  #Contain_1
  #String_1
  #Text_2
  #Btn_2
  #Contain_2
#String_2  
EndEnumeration

;- Constantes Menus
Enumeration
  #Menu_Win_1
  #M_Open_1
  #M_Save_1
  #M_SaveAs_1
  #Menu_Win_2
  #M_Open_2
  #M_Save_2
  #M_SaveAs_2
EndEnumeration
  
Style = #WS_POPUP|#WS_SYSMENU 
Parent.RECT

hWnd = OpenWindow(#Win_Main, 0, 0, 500, 310,  #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "MultiWindow") 
GetClientRect_(hWnd, Parent)

; If CreateGadgetList(hWnd)
; GadgetList pour la fenêtre principale
; endif
  
  ; Ouverture de la première fenêtre
hWin1 = OpenWindow(#Win_Child_1,Parent\left,Parent\top,500,150,Style   ,"Window 1",hWnd)
SetParent_(hWin1,hWnd)
  
  ;  et création des menus...
hMenu1 = CreateMenu(#Menu_Win_1,hWin1)
MenuTitle("Project") 
MenuItem(#M_Open_1, "Open"   +Chr(9)+"Ctrl+O") 
MenuItem(#M_Save_1, "Save"   +Chr(9)+"Ctrl+S") 
MenuItem(#M_SaveAs_1, "Save as"+Chr(9)+"Ctrl+A") 
  
  ; et de la GadgetList pour la première fenêtre.
If CreateGadgetList(hWin1)
  TextGadget(#Text_1,10,10,100,15,"Bouton n° 1")
  ButtonGadget(#Btn_1,10,25,100,20,"Bouton")
  ContainerGadget(#Contain_1,120,10,370,120,#PB_Container_Raised)
  StringGadget(#String_1,10,10,200,25,"Mon texte")
  CloseGadgetList()
EndIf
  
  ; Ouverture de la seconde fenêtre
hWin2 = OpenWindow(#Win_Child_2,Parent\left,Parent\top+150,500,150,Style ,"Window 2",hWnd)
SetParent_(hWin2,hWnd)
  
  ; et création des menus...
hMenu2 = CreateMenu(#Menu_Win_2,hWin2)
MenuTitle("Project") 
MenuItem(#M_Open_2, "Open"   +Chr(9)+"Ctrl+O") 
MenuItem(#M_Save_2, "Save"   +Chr(9)+"Ctrl+S") 
MenuItem(#M_SaveAs_2, "Save as"+Chr(9)+"Ctrl+A") 
  
  ; et de la GadgetList pour la seconde fenêtre.
If CreateGadgetList(hWin2)
  TextGadget(#Text_2,10,10,100,15,"Bouton n° 2")
  ButtonGadget(#Btn_2,10,25,100,20,"Bouton")
  ContainerGadget(#Contain_2,120,10,370,120,#PB_Container_Raised)
  StringGadget(#String_2,10,10,200,25,"Mon texte")
  CloseGadgetList()
  
EndIf

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Menu
      Select EventMenuID()
        Case #M_Open_1 : Debug "Menu Open, fenêtre 1"
        Case #M_Open_2 : Debug "Menu Open, fenêtre 2"
        Case #M_Save_1 : Debug "Menu Save, fenêtre 1"
        Case #M_Save_2 : Debug "Menu Save, fenêtre 2"
        Case #M_SaveAs_1 : Debug "Menu Save As, fenêtre 1"
        Case #M_SaveAs_2 : Debug "Menu Save As, fenêtre 2"
      EndSelect
      
    Case #PB_Event_Gadget
      Select EventGadgetID()
        Case #Btn_1 : Debug "Bouton 1 cliqué"
        Case #Btn_2 : Debug "Bouton 2 cliqué"
      EndSelect
    Case #PB_Event_CloseWindow
      Quit = 1
  EndSelect
  
Until  Quit =1
End
Chris :)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Une question:
En partant de ce MAAAAGNIFIQUE code :lol: , est-ce que quelqu'un pourrait me dire si il y a un moyen de coller tout ça dans un SplitterGadget, histoire de redimensionner les deux fenêtres en même temps.

Parce que j'ai essayé, ben ça veut pas :cry:

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

Message par Le Soldat Inconnu »

comme sur mon bi-exploreur ? vu que tu utilises la même astuces pour les fenêtres.
j'ai mis un bouton fait avec ma lib ButtonImageGadgetEx
quand je clique sur le bouton, je lance une procedure qui regarde la position de la souris et redimentionne les fen en conséquence.
j'arrête dès que je détecte que l'on a relaché le bouton de la souris.

cette solution te vas ?

ça donne ceci :

il faut la lib ButtonImageGadgetEx dispo sur mon site pour exécuter ce code

Code : Tout sélectionner

;- Constantes Fenêtres
Enumeration
  #Win_Main
  #Win_Child_1
  #Win_Child_2
EndEnumeration

;- Constantes Gadgets
Enumeration
  #Redim
  #Text_1
  #Btn_1
  #Contain_1
  #String_1
  #Text_2
  #Btn_2
  #Contain_2
  #String_2
EndEnumeration

;- Constantes Menus
Enumeration
  #Menu_Win_1
  #M_Open_1
  #M_Save_1
  #M_SaveAs_1
  #Menu_Win_2
  #M_Open_2
  #M_Save_2
  #M_SaveAs_2
EndEnumeration

Style = #WS_POPUP | #WS_SYSMENU
Parent.RECT

;- GetWindowSize

Structure WinSize
  Height.l
  Width.l
  Title.l
  Edge.l
EndStructure

Global WindowSize.WinSize

Procedure GetWindowSize(Window.l)
  Protected Espace.POINT, Taille_Fenetre.RECT
  
  GetWindowRect_(Window, @Taille_Fenetre) ; taille de la fenêtre totale
  ClientToScreen_(Window, Espace) ; taille de la zone utilisable de la fenêtre (sans le titre et les bordures)
    
  WindowSize\Width = Taille_Fenetre\right - Taille_Fenetre\left ; largeur de la fenêtre
  WindowSize\Height = Taille_Fenetre\bottom - Taille_Fenetre\top ; hauteur de la fenêtre
  WindowSize\Edge = Espace\x - Taille_Fenetre\left ; largeur de la bordure droite, gauche ou basse d'une fenêtre
  WindowSize\Title = Espace\y - Taille_Fenetre\top ; hauteur de la bordure de titre d'une fenêtre
EndProcedure


; création de l'image du bouton pour redimensionner
CreateImage(0, 500, 3)
StartDrawing(ImageOutput())
  Box(0, 0, 500, 3, GetSysColor_(#COLOR_3DFACE))
  Line(0, 1, 500, 0, 0)
StopDrawing()

hWnd = OpenWindow(#Win_Main, 0, 0, 500, 310, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "MultiWindow")
GetClientRect_(hWnd, Parent)

; Taille des bordures et du titre
GetWindowSize(WindowID())

; on ajoute un bouton avec ma lib ButtonImageGadgetEx
CreateGadgetList(WindowID())
UseButtonImageGadgetEx(WindowID())
ButtonImageGadgetCursor(#IDC_SIZENS)
ButtonImageGadgetEx(#Redim, 0, 150, "", UseImage(0), UseImage(0), UseImage(0))

; If CreateGadgetList(hWnd)
; GadgetList pour la fenêtre principale
; endif

; Ouverture de la première fenêtre
hWin1 = OpenWindow(#Win_Child_1, Parent\left, Parent\top, 500, 150, Style, "Window 1", hWnd)
SetParent_(hWin1, hWnd)

; et création des menus...
hMenu1 = CreateMenu(#Menu_Win_1, hWin1)
MenuTitle("Project")
MenuItem(#M_Open_1, "Open" + Chr(9) + "Ctrl+O")
MenuItem(#M_Save_1, "Save" + Chr(9) + "Ctrl+S")
MenuItem(#M_SaveAs_1, "Save as" + Chr(9) + "Ctrl+A")

; et de la GadgetList pour la première fenêtre.
If CreateGadgetList(hWin1)
  TextGadget(#Text_1, 10, 10, 100, 15, "Bouton n° 1")
  ButtonGadget(#Btn_1, 10, 25, 100, 20, "Bouton")
  ContainerGadget(#Contain_1, 120, 10, 370, 120, #PB_Container_Raised)
    StringGadget(#String_1, 10, 10, 200, 25, "Mon texte")
  CloseGadgetList()
EndIf

; Ouverture de la seconde fenêtre
hWin2 = OpenWindow(#Win_Child_2, Parent\left, Parent\top + 153, 500, 150, Style, "Window 2", hWnd)
SetParent_(hWin2, hWnd)

; et création des menus...
hMenu2 = CreateMenu(#Menu_Win_2, hWin2)
MenuTitle("Project")
MenuItem(#M_Open_2, "Open" + Chr(9) + "Ctrl+O")
MenuItem(#M_Save_2, "Save" + Chr(9) + "Ctrl+S")
MenuItem(#M_SaveAs_2, "Save as" + Chr(9) + "Ctrl+A")

; et de la GadgetList pour la seconde fenêtre.
If CreateGadgetList(hWin2)
  TextGadget(#Text_2, 10, 10, 100, 15, "Bouton n° 2")
  ButtonGadget(#Btn_2, 10, 25, 100, 20, "Bouton")
  ContainerGadget(#Contain_2, 120, 10, 370, 120, #PB_Container_Raised)
    StringGadget(#String_2, 10, 10, 200, 25, "Mon texte")
  CloseGadgetList()
  
EndIf

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Menu
      Select EventMenuID()
        Case #M_Open_1 : Debug "Menu Open, fenêtre 1"
        Case #M_Open_2 : Debug "Menu Open, fenêtre 2"
        Case #M_Save_1 : Debug "Menu Save, fenêtre 1"
        Case #M_Save_2 : Debug "Menu Save, fenêtre 2"
        Case #M_SaveAs_1 : Debug "Menu Save As, fenêtre 1"
        Case #M_SaveAs_2 : Debug "Menu Save As, fenêtre 2"
      EndSelect
      
    Case #PB_Event_Gadget
      Select EventGadgetID()
        Case #Btn_1 : Debug "Bouton 1 cliqué"
        Case #Btn_2 : Debug "Bouton 2 cliqué"
      EndSelect
      
      
    Case #WM_LBUTTONDOWN
      If GetActiveButtonImage() = GadgetID(#Redim) ; si on a appuyé sur le bouton pour redimensionner la fen
      
        ; pos initiale du curseur
        y2 = WindowMouseY() - WindowSize\Title
        
        Repeat
          UseWindow(#Win_Main)
          y = WindowMouseY() - WindowSize\Title ; on récupère la position du curseur
          
          If y <> y2 ; si la position a changé
            ; on redm et actualise la fen principale
            ResizeGadget(#Redim, 0, y, -1, -1)
            UpdateWindow_(WindowID(#Win_Main))
            
            ; on redim et actualise la fen 1
            UseWindow(#Win_Child_1)
            ResizeWindow(500, y)
            UpdateWindow_(WindowID(#Win_Child_1))
            
            ; on redim, déplace et actualise la fen 2
            UseWindow(#Win_Child_2)
            MoveWindow(0, y + 3)
            ResizeWindow(500, 300 - y)
            UpdateWindow_(WindowID(#Win_Child_2))
            
            y2 = y
          EndIf

          Event = WaitWindowEvent()
        Until Event = #WM_LBUTTONUP ; jusqu'a ce qu'on relève la souris
      EndIf
      
    Case #PB_Event_CloseWindow
      Quit = 1
  EndSelect
  
Until Quit = 1
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)]
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Ca marche impec ! :) Merci !

Chris :)
Répondre