un petit code pas tout a fait fini :
Il permet de déplacer une fenêtre avec un accrochage sur les bords de l'écran et avec toutes les autres fenêtres du programme.
Pour le moment, il ne fonctionne que quand on déplace une fenêtre en cliquant sur celle ci et pas sur la barre de titre, j'ai pas encore trouvé le moyen de passer outre le système de déplacement de windobe, j'ai pas trop cherché encore aussi.
voici le code :
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 3.93
;
; Explication du programme :
; Déplacer des fenêtres avec accrochage entre elles et sur les bords de l'écran
NewList Deplacement_FenetreID.l()
Procedure Deplacement_RechercheFenetre(hWnd.l, lParam.l)
Protected hWnd_Class.s, hWnd_ProcessID.l
Class.s = Space(50)
GetClassName_(hWnd, @hWnd_Class, 50)
If hWnd_Class = "WindowClass_0" ; Nom de l'objet rechercher
GetWindowThreadProcessId_(hWnd, @hWnd_ProcessID)
If ProcessID = lParam And GetWindowLong_(hWnd, #GWL_STYLE) & #WS_VISIBLE = #WS_VISIBLE ; pour lister que les fenêtres visibles
AddElement(Deplacement_FenetreID()) : Deplacement_FenetreID() = hWnd
EndIf
EndIf
ProcedureReturn #True
EndProcedure
Procedure Deplacement(WindowID, Accrochage)
#Accrochage_Ecran = 6
#Accrochage_Fenetre = 8
#Accrochage_Pas = 4
Protected Fenetre.RECT, AutreFenetre.RECT, Ecran.RECT, Deplacement_X, Deplacement_Y, Event, FenetreX, FenetreY, ProcessID, hWnd, hWnd_ProcessID, FenetreL, FenetreH
; Recherche de toute les fenêtres visibles du programme
GetWindowThreadProcessId_(WindowID(WindowID), @ProcessID) ; Handle du process
hWnd.l = FindWindow_(0, 0)
While hWnd <> 0
GetWindowThreadProcessId_(hWnd, @hWnd_ProcessID)
If hWnd_ProcessID = ProcessID And GetWindowLong_(hWnd, #GWL_STYLE) & #WS_VISIBLE = #WS_VISIBLE ; pour lister que les fenêtres visibles
AddElement(Deplacement_FenetreID()) : Deplacement_FenetreID() = hWnd
EndIf
EnumChildWindows_(hWnd, @Deplacement_RechercheFenetre(), ProcessID) ; On recherche sur les fenêtres enfants
hWnd = GetWindow_(hWnd, #GW_HWNDNEXT)
Wend
; Dimension de l'écran
SystemParametersInfo_(#SPI_GETWORKAREA, 0, @Ecran.RECT, 0)
; Point de départ
GetWindowRect_(WindowID(WindowID), @Fenetre) ; Taille de la fenêtre totale, bordure comprise
ClientToScreen_(WindowID(WindowID), @AutreFenetre) ; Taille de la zone de travail
FenetreL = Fenetre\Right - Fenetre\Left
FenetreH = Fenetre\Bottom - Fenetre\Top
UseWindow(WindowID) ; On utilise la fenetre WindowID
Deplacement_X = WindowMouseX() + AutreFenetre\Left - Fenetre\Left
Deplacement_Y = WindowMouseY() + AutreFenetre\Top - Fenetre\Top
Repeat
Event = WindowEvent()
Delay(3)
ForEach Deplacement_FenetreID() ; On actualise l'affichage de toute les fenêtres
UpdateWindow_(Deplacement_FenetreID())
Next
FenetreX = DesktopMouseX() - Deplacement_X
FenetreY = DesktopMouseY() - Deplacement_Y
If Accrochage
; Dimension de la fenêtre avec prise en comptes des bords
Fenetre\Left = FenetreX
Fenetre\Right = FenetreX + FenetreL
Fenetre\Top = FenetreY
Fenetre\Bottom = FenetreY + FenetreH
; Accrochage sur les bords de l'écran
If Fenetre\Left - Ecran\Left < #Accrochage_Pas * #Accrochage_Ecran + #Accrochage_Ecran / 2
FenetreX = (Fenetre\Left - Ecran\Left + #Accrochage_Ecran / 2) / #Accrochage_Ecran
FenetreX * #Accrochage_Ecran
ElseIf Ecran\Right - Fenetre\Right < #Accrochage_Pas * #Accrochage_Ecran + #Accrochage_Ecran / 2
FenetreX = (Ecran\Right - Fenetre\Right + #Accrochage_Ecran / 2) / #Accrochage_Ecran
FenetreX * #Accrochage_Ecran
FenetreX = Ecran\Right + Fenetre\Left - Fenetre\Right - FenetreX
EndIf
If Fenetre\Top - Ecran\Top < #Accrochage_Pas * #Accrochage_Ecran + #Accrochage_Ecran / 2
FenetreY = (Fenetre\Top - Ecran\Top + #Accrochage_Ecran / 2) / #Accrochage_Ecran
FenetreY * #Accrochage_Ecran
ElseIf Ecran\Bottom - Fenetre\Bottom < #Accrochage_Pas * #Accrochage_Ecran + #Accrochage_Ecran / 2
FenetreY = (Ecran\Bottom - Fenetre\Bottom + #Accrochage_Ecran / 2) / #Accrochage_Ecran
FenetreY * #Accrochage_Ecran
FenetreY = Ecran\Bottom + Fenetre\Top - Fenetre\Bottom - FenetreY
EndIf
; Accrochage sur le milieu de l'écran
If Abs((Fenetre\Right + Fenetre\Left) - (Ecran\Right + Ecran\Left)) < #Accrochage_Fenetre * 2
FenetreX = (Ecran\Right + Ecran\Left)/2 - (Fenetre\Right - Fenetre\Left)/2
EndIf
If Abs((Fenetre\Bottom + Fenetre\Top) - (Ecran\Bottom + Ecran\Top)) < #Accrochage_Fenetre * 2
FenetreY = (Ecran\Bottom + Ecran\Top)/2 - (Fenetre\Bottom - Fenetre\Top)/2
EndIf
; Accrochage sur les autres fenêtres
ForEach Deplacement_FenetreID()
If Deplacement_FenetreID() <> WindowID(WindowID)
GetWindowRect_(Deplacement_FenetreID(), @AutreFenetre.RECT) ; On récupère la positon de la fenêtre
; Bord gauche et droit
If (Fenetre\Top >= AutreFenetre\Top - #Accrochage_Fenetre And Fenetre\Top <= AutreFenetre\Bottom + #Accrochage_Fenetre) Or (Fenetre\Bottom >= AutreFenetre\Top - #Accrochage_Fenetre And Fenetre\Bottom <= AutreFenetre\Bottom + #Accrochage_Fenetre)
; Bord gauche de l'autre fenêtre
If Abs(Fenetre\Right - AutreFenetre\Left) < #Accrochage_Fenetre
FenetreX = AutreFenetre\Left - (Fenetre\Right - Fenetre\Left)
ElseIf Abs(Fenetre\Left - AutreFenetre\Left) < #Accrochage_Fenetre
FenetreX = AutreFenetre\Left
EndIf
; Bord droit de l'autre fenêtre
If Abs(Fenetre\Right - AutreFenetre\Right) < #Accrochage_Fenetre
FenetreX = AutreFenetre\Right - (Fenetre\Right - Fenetre\Left)
ElseIf Abs(Fenetre\Left - AutreFenetre\Right) < #Accrochage_Fenetre
FenetreX = AutreFenetre\Right
EndIf
EndIf
; Bord haut et bas
If (Fenetre\Left >= AutreFenetre\Left - #Accrochage_Fenetre And Fenetre\Left <= AutreFenetre\Right + #Accrochage_Fenetre) Or (Fenetre\Right >= AutreFenetre\Left - #Accrochage_Fenetre And Fenetre\Right <= AutreFenetre\Right + #Accrochage_Fenetre)
; Bord haut de l'autre fenêtre
If Abs(Fenetre\Bottom - AutreFenetre\Top) < #Accrochage_Fenetre
FenetreY = AutreFenetre\Top - (Fenetre\Bottom - Fenetre\Top)
ElseIf Abs(Fenetre\Top - AutreFenetre\Top) < #Accrochage_Fenetre
FenetreY = AutreFenetre\Top
EndIf
; Bord bas de l'autre fenêtre
If Abs(Fenetre\Bottom - AutreFenetre\Bottom) < #Accrochage_Fenetre
FenetreY = AutreFenetre\Bottom - (Fenetre\Bottom - Fenetre\Top)
ElseIf Abs(Fenetre\Top - AutreFenetre\Bottom) < #Accrochage_Fenetre
FenetreY = AutreFenetre\Bottom
EndIf
EndIf
EndIf
Next
EndIf
; On déplace la fenêtre
UseWindow(WindowID) ; On utilise la fenetre WindowID
MoveWindow(FenetreX, FenetreY)
Until Event = #WM_LBUTTONUP Or Event = #WM_NCLBUTTONUP
ClearList(Deplacement_FenetreID())
EndProcedure
; Création des fenêtres et des GadgetList
If OpenWindow(0, 100, 100, 100, 100, #PB_Window_BorderLess | #WS_SYSMENU, "Test") = 0 Or CreateGadgetList(WindowID(0)) = 0
End
EndIf
CreateImage(0, WindowWidth(), WindowHeight())
StartDrawing(ImageOutput())
Box(0, 0, WindowWidth(), WindowHeight(), RGB(255, 0, 0))
StopDrawing()
ImageGadget(0, 0, 0, 0, 0, UseImage(0))
If OpenWindow(1, 300, 100, 100, 100, #PB_Window_BorderLess | #WS_SYSMENU, "Test2", WindowID(0)) = 0 Or CreateGadgetList(WindowID(1)) = 0
End
EndIf
CreateImage(1, WindowWidth(), WindowHeight())
StartDrawing(ImageOutput())
Box(0, 0, WindowWidth(), WindowHeight(), RGB(0, 255, 0))
StopDrawing()
ImageGadget(1, 0, 0, 0, 0, UseImage(1))
If OpenWindow(2, 100, 300, 100, 150, #PB_Window_BorderLess | #WS_SYSMENU | #WS_BORDER, "Test3", WindowID(0)) = 0 Or CreateGadgetList(WindowID(2)) = 0
End
EndIf
CreateImage(2, WindowWidth(), WindowHeight())
StartDrawing(ImageOutput())
Box(0, 0, WindowWidth(), WindowHeight(), RGB(0, 0, 255))
StopDrawing()
ImageGadget(2, 0, 0, 0, 0, UseImage(2))
If OpenWindow(3, 300, 300, 150, 100, #PB_Window_BorderLess | #WS_SYSMENU | #WS_SIZEBOX, "Test4", WindowID(0)) = 0 Or CreateGadgetList(WindowID(3)) = 0
End
EndIf
CreateImage(3, WindowWidth(), WindowHeight())
StartDrawing(ImageOutput())
Box(0, 0, WindowWidth(), WindowHeight(), RGB(255, 255, 0))
StopDrawing()
ImageGadget(3, 0, 0, 0, 0, UseImage(3))
; Boucle d'évènement
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_EventGadget
Select EventWindowID()
Case 0
Select EventGadgetID()
Case 0
Select EventType()
Case #PB_EventType_LeftClick
Deplacement(0, 1)
EndSelect
EndSelect
Case 1
Select EventGadgetID()
Case 1
Select EventType()
Case #PB_EventType_LeftClick
Deplacement(1, 1)
EndSelect
EndSelect
Case 2
Select EventGadgetID()
Case 2
Select EventType()
Case #PB_EventType_LeftClick
Deplacement(2, 1)
EndSelect
EndSelect
Case 3
Select EventGadgetID()
Case 3
Select EventType()
Case #PB_EventType_LeftClick
Deplacement(3, 1)
EndSelect
EndSelect
EndSelect
EndSelect
Until Event = #PB_EventCloseWindow
End