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