Code : Tout sélectionner
CompilerIf #PB_Compiler_Thread ;> 
  #ObjectManager = "Compilers/ObjectManagerThread.lib" 
CompilerElse ;= 
  #ObjectManager = "Compilers/ObjectManager.lib" 
CompilerEndIf;< 
Import #PB_Compiler_Home + #ObjectManager 
  Object_GetOrAllocate   (Objects, Object.l) As "_PB_Object_GetOrAllocateID@8" 
  Object_GetObject       (Objects, Object.l) As "_PB_Object_GetObject@8" 
  Object_IsObject        (Objects, Object.l) As "_PB_Object_IsObject@8" 
  Object_EnumerateAll    (Objects, ObjectEnumerateAllCallback, *VoidData) As "_PB_Object_EnumerateAll@12" 
  Object_EnumerateStart  (Objects) As "_PB_Object_EnumerateStart@4" 
  Object_EnumerateNext   (Objects, *object.Long) As "_PB_Object_EnumerateNext@8" 
  Object_EnumerateAbort  (Objects) As "_PB_Object_EnumerateAbort@4" 
  Object_Free            (Objects, Object.l) As "_PB_Object_FreeID@8" 
  Object_Init            (StructureSize.l, IncrementStep.l, ObjectFreeFunction) As "_PB_Object_Init@12" 
  Object_GetThreadMemory (MemoryID.l) As "_PB_Object_GetThreadMemory@4" 
  Object_InitThreadMemory(Size.l, InitFunction, EndFunction) As "_PB_Object_InitThreadMemory@12" 
EndImport 
Prototype ObjectFreeFunction(Object.l) 
Structure PB_SimpleList 
  *Next    .PB_SimpleList 
  *Previous.PB_SimpleList 
EndStructure 
Structure PB_Object 
  ; 
  StructureSize.l 
  IncrementStep.l 
  ObjectsNumber.l 
  *ListFirstElement.PB_SimpleList 
  ; 
  FreeObject.ObjectFreeFunction 
  ; 
  Current.l 
  *CurrentElement.PB_SimpleList 
  ; 
  CompilerIf #PB_Compiler_Thread ;> 
    IncrementShift.l 
    *FirstObjectsArea.PB_SimpleList 
    *LastObjectsArea .PB_SimpleList 
    ObjectMutex.CRITICAL_SECTION 
  CompilerElse ;= 
    *ObjectsArea 
  CompilerEndIf ;< 
  ; 
EndStructure 
Declare Screen_CloseWindow(Fenetre.l)
Procedure InitScreen_Window() 
;Initialise les fonctions screen window. A appeler en avant les commandes de screenwindow.
;declarations
;{
#Screen_Theme = 0
#Screen_Skin = 1
Structure Screen_FenetreClassementStructure
  position.b
  fenetre.l
EndStructure
Global NewList Screen_FenetreClassement.Screen_FenetreClassementStructure()
Structure Screen_FenetreStructure ;structure d'une fenetre
  Nom.s
  Numero.l
  TailleX.l
  TailleY.l
  PositionX.l
  PositionY.l
  Theme.l
  Hide.b
  Type.l
  Selected.l
  Position.l
  Couleur.l[10];a definir le nombre de couleur max
  Sprite.l
EndStructure
;Global Screen_Fenetre.Screen_FenetreStructure
Structure Screen_GadgetStructure ;structure d'un gadget
  Numero.l
  Fenetre.l
  TailleX.l
  TailleY.l
  PositionX.l
  PositionY.l
  Theme.l
  Hide.b
  type.b
  Texte.s
  Couleur.l[10];a definir le nombre de couleur max
EndStructure
;Global Screen_Gadget.Screen_GadgetStructure
Structure Screen_ThemeStructure ;structure d'un theme
  Nom.s
  Taille.l[10];a definir le nombre de dimension max
  Couleur.l[10];a definir le nombre de couleur max
  Police.s
  PoliceTaille.l
EndStructure
;Global Screen_Theme.Gui_ThemeStructure
Global ScreenFenetreObjects
 ScreenFenetreObjects = Object_Init(SizeOf(Screen_FenetreStructure), 1, @Screen_CloseWindow())
 
 
 Global Dim ScreenVar(4)
 Global ScreenDecalageselectX,ScreenDecalageselectY 
;}
 
EndProcedure
InitScreen_Window() 
Procedure Screen_CloseWindow(Fenetre.l)
  Protected *Screen_Fenetre.Screen_FenetreStructure
  
  If Object_IsObject(ScreenFenetreObjects, Fenetre) 
    *Screen_Fenetre = Object_GetObject(ScreenFenetreObjects, Fenetre) 
  EndIf 
  
  If *Screen_Fenetre 
    Object_Free(ScreenFenetreObjects, Fenetre) 
  EndIf 
EndProcedure
Procedure Screen_OpenWindow(Fenetre.l, x, y, LargeurInterne, HauteurInterne, Titre$ , Theme, Type = 0)
  Protected Resultat = 0, *Screen_Fenetre.Screen_FenetreStructure, color1, CouleurBordureBarre, TailleBarreBordure, CouleurPolice, Police
  ;Screen_OpenWindow(Fenetre, x, y, LargeurInterne, HauteurInterne, Titre$ , #Theme[, Type]) 
  ;Ouvre une fenêtre avec le thème actuellement utilisé ou le thème par defaut. 
  ;Si #PB_Any est utilisé pour le paramètre 'Fenetre', le numéro de la fenêtre sera renvoyé dans 'Resultat'. 
  ;Si Type vaut #Screen_Skin , alors la fenêtre sera utilisera le skin numéro #Theme.
  If Fenetre And LargeurInterne > 0 And HauteurInterne > 0 And Theme
    *Screen_Fenetre = Object_GetOrAllocate(ScreenFenetreObjects, Fenetre)
    If *Screen_Fenetre 
      *Screen_Fenetre\Numero  = Fenetre 
      *Screen_Fenetre\TailleX = LargeurInterne 
      *Screen_Fenetre\TailleY = HauteurInterne
      *Screen_Fenetre\Nom = Titre$
      *Screen_Fenetre\PositionX = x
      *Screen_Fenetre\PositionY = y
      *Screen_Fenetre\Theme = Theme
      *Screen_Fenetre\Type = Type
      *Screen_Fenetre\Sprite = CreateSprite(#PB_Any, LargeurInterne, HauteurInterne , #PB_Sprite_Texture)
      If Theme = #PB_Any
        color1 = RGB(162, 162, 162)
        CouleurBordureBarre = RGB(110, 110, 110)
        TailleBarreBordure = 2
        CouleurPolice = RGB(0, 0, 0)
        Police = LoadFont(#PB_Any , "", 15 )
        HauteurTitre = 20
        HauteurTitreCouleur = RGB(135, 135, 135)
        TransparentSpriteColor(*Screen_Fenetre\Sprite, RGB(255, 0, 255))
      EndIf
      If *Screen_Fenetre\Sprite And StartDrawing(SpriteOutput(*Screen_Fenetre\Sprite))
        ;fond principal
        Box(0, 0, LargeurInterne, HauteurInterne ,color1)
        ;fond haut de fenetre
        Box(TailleBarreBordure, TailleBarreBordure,LargeurInterne-TailleBarreBordure*2,HauteurTitre,HauteurTitreCouleur)
        ;bordure
        ;haut
        Box(0, 0, LargeurInterne, TailleBarreBordure, CouleurBordureBarre)
        ;millieu
        Box(0, HauteurTitre+TailleBarreBordure, LargeurInterne, TailleBarreBordure, CouleurBordureBarre)
        ;droite
        Box(0, 0,TailleBarreBordure,HauteurInterne,CouleurBordureBarre)
        ;gauche
        Box(LargeurInterne-TailleBarreBordure, 0,TailleBarreBordure,HauteurInterne,CouleurBordureBarre)
        ;bas
        Box(0, HauteurInterne-TailleBarreBordure,LargeurInterne,TailleBarreBordure,CouleurBordureBarre)
        ;Titre
        If Titre$
          FrontColor(CouleurPolice)
          DrawingMode(1) 
          DrawingFont(FontID(Police))
          DrawText(TailleBarreBordure, TailleBarreBordure,Titre$)
        EndIf 
        StopDrawing()
      
        If Fenetre = #PB_Any 
          Resultat = *Screen_Fenetre 
        ElseIf *Screen_Fenetre
          Resultat = *Screen_Fenetre\Numero 
        EndIf
        AddElement(Screen_FenetreClassement())
        Screen_FenetreClassement()\position = 1
        Screen_FenetreClassement()\fenetre = Resultat
        If CountList(Screen_FenetreClassement()) > 1
          ForEach Screen_FenetreClassement()
            If Screen_FenetreClassement()\fenetre <> Resultat
              Screen_FenetreClassement()\position + 1 
            EndIf
          Next
          SortStructuredList(Screen_FenetreClassement(), 1, OffsetOf(Screen_FenetreClassementStructure\position), #PB_Sort_Byte)
        EndIf
      EndIf
    EndIf 
  EndIf
  ProcedureReturn Resultat
EndProcedure
Procedure Screen_RefreshWindows()
  Protected *Screen_Fenetre.Screen_FenetreStructure, i
  For i = 0 To CountList(Screen_FenetreClassement()) - 1
    SelectElement(Screen_FenetreClassement(), i)
    *Screen_Fenetre = Object_GetObject(ScreenFenetreObjects, Screen_FenetreClassement()\fenetre)  
    If *Screen_Fenetre And *Screen_Fenetre\Hide = 0
      DisplayTransparentSprite(*Screen_Fenetre\Sprite, *Screen_Fenetre\PositionX, *Screen_Fenetre\PositionY)  
    EndIf
  Next i
  ProcedureReturn  0
EndProcedure  
Procedure Screen_EventWindow(Mode.b = 0, Fenetre.l = 0, Event.l = 0)
  Protected Resultat = 0, mouseY, mouseX, BestPosition = 0, mouseState, oldmouseWMPX, oldmouseWMPY, Temp.l , *Screen_Fenetre.Screen_FenetreStructure
  ;Teste si un évènement s'est produit sur chacune des fenêtres ouvertes. Cette fonction est à retour immédiat, les évènements possibles sont : 
  ;#PB_Event_Gadget : Un gadget a été cliqué #PB_Event_MoveWindow : La fenêtre a été déplacée #PB_Event_SizeWindow : La fenêtre a été redimensionnée 
  ;#PB_Event_ActivateWindow : La fenêtre a été activée (focus)
  oldmouseX = ScreenVar(0) 
  oldmouseY = ScreenVar(1)
  oldmouseState = ScreenVar(2)
  If Mode = 0
    mouseY = WindowMouseY(Fenetre)
    mouseX = WindowMouseX(Fenetre)
    Select Event
      Case #WM_LBUTTONDOWN
        mouseState = 1
        oldmouseWMPX = mouseX 
        oldmouseWMPY = mouseY 
      Case #WM_LBUTTONUP
        mouseState = 0
        ScreenVar(3) = 0
        oldmouseWMPX = -1
        oldmouseWMPY = -1 
    EndSelect
  Else  
    mouseY = MouseX()
    mouseX = MouseX()
  EndIf
  
  ;- selection a 0
  Object_EnumerateStart(ScreenFenetreObjects) 
  While Object_EnumerateNext(ScreenFenetreObjects, @Temp) 
    *Screen_Fenetre = Object_GetObject(ScreenFenetreObjects, Temp) 
    *Screen_Fenetre\Selected = 0 
  Wend 
  
  
  Object_EnumerateStart(ScreenFenetreObjects) 
  While Object_EnumerateNext(ScreenFenetreObjects, @Temp)
    *Screen_Fenetre = Object_GetObject(ScreenFenetreObjects, Temp)  
    ;-on regarde quel fenetre est touché par la souris
    If mouseState = 1 And oldmouseState = 0 
      If mouseX>*Screen_Fenetre\PositionX And mouseY>*Screen_Fenetre\PositionY And mouseX< *Screen_Fenetre\PositionX+*Screen_Fenetre\TailleX And mouseY< *Screen_Fenetre\PositionY+*Screen_Fenetre\TailleY
        If oldmouseX>*Screen_Fenetre\PositionX And oldmouseY>*Screen_Fenetre\PositionY And oldmouseX< *Screen_Fenetre\PositionX+*Screen_Fenetre\TailleX And oldmouseY< *Screen_Fenetre\PositionY+*Screen_Fenetre\TailleY
          *Screen_Fenetre\Selected = 1
        EndIf
      EndIf      
    EndIf
  Wend
  ;-on donne le focus
  ForEach Screen_FenetreClassement()
    *Screen_Fenetre = Object_GetObject(ScreenFenetreObjects, Screen_FenetreClassement()\fenetre)  
    If *Screen_Fenetre\Selected = 1
      If BestPosition = 0
        BestPosition = Screen_FenetreClassement()\Position
      Else 
        If Screen_FenetreClassement()\Position < BestPosition
          BestPosition = Screen_FenetreClassement()\Position  
        EndIf
      EndIf
    EndIf
  Next
 
  If BestPosition > 0 
    TempPosition = 1
    ForEach Screen_FenetreClassement()
      *Screen_Fenetre = Object_GetObject(ScreenFenetreObjects, Screen_FenetreClassement()\fenetre) 
      If Screen_FenetreClassement()\Position = BestPosition
        Screen_FenetreClassement()\Position = 1
        If *Screen_Fenetre\Theme 
          If *Screen_Fenetre\Theme = #PB_Any
            TailleBarreY = 20
          Else 
            ;For i2 = 0 To CountList(Gui_Theme()) - 1
            ;  SelectElement(Gui_Theme(), i2)
            ;  If Gui_Fenetre()\Theme = Gui_Theme()\Nom
            ;    Break
            ;  EndIf
            ;Next i2
          EndIf
          If mouseX>*Screen_Fenetre\PositionX And mouseY>*Screen_Fenetre\PositionY And mouseX< *Screen_Fenetre\PositionX+*Screen_Fenetre\TailleX And mouseY< *Screen_Fenetre\PositionY+TailleBarreY 
            If oldmouseX>*Screen_Fenetre\PositionX And oldmouseY>*Screen_Fenetre\PositionY And oldmouseX< *Screen_Fenetre\PositionX+*Screen_Fenetre\TailleX And oldmouseY< *Screen_Fenetre\PositionY+*Screen_Fenetre\TailleY 
              ScreenVar(3) = *Screen_Fenetre\Numero
              ScreenDecalageselectX = mouseX - *Screen_Fenetre\PositionX 
              ScreenDecalageselectY = mouseY - *Screen_Fenetre\PositionY
            EndIf
          EndIf
        EndIf 
      ElseIf Screen_FenetreClassement()\Position < BestPosition   
        Screen_FenetreClassement()\Position + 1  
      EndIf
    Next
  EndIf
  SortStructuredList(Screen_FenetreClassement(), 1, OffsetOf(Screen_FenetreClassementStructure\position), #PB_Sort_Byte)
  Object_EnumerateStart(ScreenFenetreObjects) 
  While Object_EnumerateNext(ScreenFenetreObjects, @Temp)
    *Screen_Fenetre = Object_GetObject(ScreenFenetreObjects, Temp)  
    If *Screen_Fenetre\Theme
      If *Screen_Fenetre\Theme = #PB_Any
        TailleBarreY = 20
      Else 
        ;For i2 = 0 To CountList(Gui_Theme()) - 1
        ;  SelectElement(Gui_Theme(), i2)
        ;  If Gui_Fenetre()\Theme = Gui_Theme()\Nom
        ;    Break
        ;  EndIf
        ;Next i2
      EndIf
    EndIf
    
    ;-on déplace
    If ScreenVar(3) = *Screen_Fenetre\Numero 
      *Screen_Fenetre\PositionX = mouseX - ScreenDecalageselectX
      *Screen_Fenetre\PositionY = mouseY - ScreenDecalageselectY
    EndIf
  Wend
  
  ScreenVar(0) = mouseX 
  ScreenVar(1) = mouseY
  ScreenVar(2) = mouseState
  ProcedureReturn Resultat
EndProcedure
Procedure Screen_GetWindowColor(Fenetre) 
;Le numéro du theme ou du skin actuellement utilisé sera renvoyé dans 'Resultat' 
EndProcedure
Procedure Screen_GetActiveWindow() 
;Renvoie le numéro de la fenêtre active dans 'Resultat' 
EndProcedure
Procedure Screen_GetWindowTitle(Fenetre) 
;Le titre de la fenêtre sera renvoyé dans 'Resultat' 
EndProcedure
Procedure Screen_GetWindowType(Fenetre) 
;Le type de la Fenêtre sera renvoyé dans 'Resultat': 
;#PB_ScreenWindow_Theme : La fenêtre utilise un thème. 
;#PB_ScreenWindow_Skin : La fenêtre utilise un skin. 
EndProcedure
Procedure LoadSkin(Skin,Fichier$,CouleurInvisible,CouleurSeparatrice) 
;Charge un skin en mémoire. 
;Si #PB_Any est utilisé pour le paramètre '#Skin', le numéro de la fenêtre sera renvoyé dans 'Resultat'. 
;La CouleurInvisible ne sera pas affichée. 
;La CouleurSeparatrice sera utiliser pour découper le skin dans l'image (Ca permet une simplification de la création des skins) 
EndProcedure
Procedure Screen_SetWindowType(Fenetre, Type) 
;Change le type de la Fenetre. 
;Les valeurs de Type peuvent être: 
;#PB_ScreenWindow_Theme : La fenêtre utilise un thème. 
;#PB_ScreenWindow_Skin : La fenêtre utilise un skin. 
EndProcedure
Procedure Screen_SetWindowColor(Fenetre, Theme) 
;Change le numéro du skin ou du thème utilisé. 
EndProcedure
Procedure Screen_SetActiveWindow(Fenetre) 
;Active (donne le focus) à la Fenetre 
EndProcedure
Procedure Screen_SetWindowTitle(Fenetre, Titre$) 
;Change le titre de la Fenetre 
EndProcedure
Procedure Createtheme();Arguments à définir)
;Crée un thème en suivant les arguments 
EndProcedure
Procedure Screen_ResizeWindow(Fenetre, X,Y) 
;Redimensionne la Fenetre 
EndProcedure
Procedure Screen_MovesWindow(Fenetre, X,Y) 
;Déplace la Fenetre 
EndProcedure
Procedure Screen_WindowHeight(Fenetre) 
;Renvoie la hauteur en pixels de la Fenetre spécifiée. 
EndProcedure
Procedure Screen_WindowWidth (Fenetre) 
;Renvoie la hauteur en pixels de la Fenetre spécifiée. 
EndProcedure
Procedure Screen_WindowX(Fenetre) 
;Renvoie la position gauche de la Fenetre spécifiée, en pixels. 
EndProcedure
Procedure Screen_WindowY(Fenetre) 
;Renvoie la position haute de la Fenetre spécifiée, en pixels.
EndProcedure