Page 1 sur 1

Accrochage sur les bords de l'écran et entre fenêtres

Publié : lun. 13/févr./2006 13:44
par Le Soldat Inconnu
Salut,

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

Publié : lun. 13/févr./2006 17:30
par Flype
tiens çà me rappelle quelquechose çà :wink:

et voilà pour ce que tu demandais :

Code : Tout sélectionner

If OpenWindow(0,0,0,210,300,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Move me") And CreateGadgetList(WindowID(0))
  
  TextGadget(0,5,5,200,120,"Move me !",#PB_Text_Border)
  TextGadget(1,5,210,200,50,"But not here !",#PB_Text_Border)
  
  Repeat
    
    Select WaitWindowEvent()
    
      Case #PB_Event_CloseWindow
        Break
        
      Case #WM_LBUTTONDOWN
        
        Select ChildWindowFromPoint_(WindowID(0),WindowMouseX(0),WindowMouseY(0))
          Case GadgetID(1)
            ; do nothing
          Case WindowID(0), GadgetID(0)
            ReleaseCapture_()
            SendMessage_(WindowID(0),#WM_NCLBUTTONDOWN, #HTCAPTION,0)
            ;RedrawWindow_(WindowID(0),0,0,#RDW_FRAME|#RDW_INTERNALPAINT|#RDW_ERASE|#RDW_INVALIDATE)
        EndSelect
        
    EndSelect
    
  ForEver

EndIf

Publié : lun. 13/févr./2006 19:02
par nico
ça serait bien d'indiquer la version de Pb à chaque post de code, le soldat à un code PB V3.93 et tu lui répond avec un code PB V4.

:!:

Publié : lun. 13/févr./2006 19:09
par Flype
oups j'avais prévu de le préciser... g zappé :oops:

Publié : lun. 13/févr./2006 23:09
par Le Soldat Inconnu
Pas de ça que je parlais, ta fonction, c'est le truc de windows pour déplacer :D

mon souci, c'est de ne pas avoir la fonction de windows de déplacement et de récupérer le clic de la souris sur la barre de titre, pour pouvoir utiliser ma fonction avec accrochage sur les fenêtres et bords de l'écran

Re: Accrochage sur les bords de l'écran et entre fenêtres

Publié : dim. 02/sept./2012 10:01
par Le Soldat Inconnu
Nouvelle version compatible avec du double écran

Code : Tout sélectionner

; Auteur : Le Soldat Inconnu
; Version de PB : 4

; Explication du programme :
; Déplacer des fenêtres (sans barre de titre) avec accrochage entre elles et sur les bords de l'écran

EnableExplicit

Global NewList MoveWindowID.i()
Procedure MoveWindow_ChildWindowSearch(hwnd.l, lParam.l)
	Protected hWnd_Class.s, hWnd_ProcessID.i, Class.s
	Class.s = Space(50)
	GetClassName_(hwnd, @hWnd_Class, 50)
	If Left(hWnd_Class, 12) = "WindowClass_" ; Nom de l'objet rechercher
		GetWindowThreadProcessId_(hwnd, @hWnd_ProcessID)
		If hWnd_ProcessID = lParam And GetWindowLong_(hwnd, #GWL_STYLE) & #WS_VISIBLE = #WS_VISIBLE ; pour lister que les fenêtres visibles
			AddElement(MoveWindowID()) : MoveWindowID() = hwnd
		EndIf
	EndIf
	ProcedureReturn #True
EndProcedure
Procedure MoveWindow(WindowID.i, Magnetic.b = 1, CenterMouse.b = 1)
	#MoveWindow_Magnetic_Screen = 6
	#MoveWindow_Magnetic_Window = 8
	#MoveWindow_Magnetic_Step = 4
	Protected Fenetre.RECT, AutreFenetre.RECT, Numero_Ecran.l, NbEcran.l, Ecran.RECT, Deplacement_X, Deplacement_Y, Event, FenetreX, FenetreY, ProcessID, hwnd, hWnd_ProcessID, FenetreL, FenetreH
	
	; 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
	
	; Point de départ
	If CenterMouse = 0
		Deplacement_X = WindowMouseX(WindowID)
		Deplacement_Y = WindowMouseY(WindowID)
	Else ; On prend le centre la fenêtre
		Deplacement_X = WindowWidth(WindowID) / 2
		Deplacement_Y = WindowHeight(WindowID) / 2
	EndIf
	Deplacement_X + AutreFenetre\left - Fenetre\left
	Deplacement_Y + AutreFenetre\top - Fenetre\top
	
	If Magnetic
		; Recherche de toute les fenêtres visibles du programme
		GetWindowThreadProcessId_(WindowID(WindowID), @ProcessID) ; Handle du process
		hwnd = 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(MoveWindowID()) : MoveWindowID() = hwnd
			EndIf
			EnumChildWindows_(hwnd, @MoveWindow_ChildWindowSearch(), ProcessID) ; On recherche sur les fenêtres enfants
			hwnd = GetWindow_(hwnd, #GW_HWNDNEXT)
		Wend
		
		; Dimension de l'écran
		NbEcran = ExamineDesktops()
		NbEcran - 1
	EndIf
	
	Repeat
		
		Event = WaitWindowEvent(20)
		
		ForEach MoveWindowID() ; On actualise l'affichage de toute les fenêtres
			UpdateWindow_(MoveWindowID())
		Next
		
		; Position de la fenêtre
		FenetreX = DesktopMouseX() - Deplacement_X
		FenetreY = DesktopMouseY() - Deplacement_Y
		
		If Magnetic
			
			; 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
			
			For Numero_Ecran = 0 To NbEcran
				; Taille de l'écran
				Ecran\left = DesktopX(Numero_Ecran)
				Ecran\right = DesktopX(Numero_Ecran) + DesktopWidth(Numero_Ecran)
				Ecran\top = DesktopY(Numero_Ecran)
				Ecran\bottom = DesktopY(Numero_Ecran) + DesktopHeight(Numero_Ecran)
				; Accrochage sur les bords de l'écran
				If Fenetre\left - Ecran\left < (#MoveWindow_Magnetic_Step * #MoveWindow_Magnetic_Screen + #MoveWindow_Magnetic_Screen / 2) And Fenetre\left >= Ecran\left - (#MoveWindow_Magnetic_Screen / 2)
					FenetreX = (Fenetre\left - Ecran\left + (#MoveWindow_Magnetic_Screen / 2)) / #MoveWindow_Magnetic_Screen
					FenetreX * #MoveWindow_Magnetic_Screen
				ElseIf Ecran\right - Fenetre\right < (#MoveWindow_Magnetic_Step * #MoveWindow_Magnetic_Screen + #MoveWindow_Magnetic_Screen / 2) And Fenetre\right <= Ecran\right + (#MoveWindow_Magnetic_Screen / 2)
					FenetreX = (Ecran\right - Fenetre\right + #MoveWindow_Magnetic_Screen / 2) / #MoveWindow_Magnetic_Screen
					FenetreX * #MoveWindow_Magnetic_Screen
					FenetreX = Ecran\right + Fenetre\left - Fenetre\right - FenetreX
				EndIf
				If Fenetre\top - Ecran\top < (#MoveWindow_Magnetic_Step * #MoveWindow_Magnetic_Screen + #MoveWindow_Magnetic_Screen / 2) And Fenetre\top >= Ecran\top - (#MoveWindow_Magnetic_Screen / 2)
					FenetreY = (Fenetre\top - Ecran\top + (#MoveWindow_Magnetic_Screen / 2)) / #MoveWindow_Magnetic_Screen
					FenetreY * #MoveWindow_Magnetic_Screen
				ElseIf Ecran\bottom - Fenetre\bottom < (#MoveWindow_Magnetic_Step * #MoveWindow_Magnetic_Screen + #MoveWindow_Magnetic_Screen / 2) And Fenetre\bottom <= Ecran\bottom + (#MoveWindow_Magnetic_Screen / 2)
					FenetreY = (Ecran\bottom - Fenetre\bottom + (#MoveWindow_Magnetic_Screen / 2)) / #MoveWindow_Magnetic_Screen
					FenetreY * #MoveWindow_Magnetic_Screen
					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)) < (#MoveWindow_Magnetic_Window * 2)
					FenetreX = (Ecran\right + Ecran\left) / 2 - (Fenetre\right - Fenetre\left) / 2
				EndIf
				If Abs((Fenetre\bottom + Fenetre\top) - (Ecran\bottom + Ecran\top)) < (#MoveWindow_Magnetic_Window * 2)
					FenetreY = (Ecran\bottom + Ecran\top) / 2 - (Fenetre\bottom - Fenetre\top) / 2
				EndIf
			Next
			; Accrochage sur les autres fenêtres
			ForEach MoveWindowID()
				If MoveWindowID() <> WindowID(WindowID)
					GetWindowRect_(MoveWindowID(), @AutreFenetre.RECT) ; On récupère la positon de la fenêtre
					
					; Bord gauche et droit
					If (Fenetre\top >= AutreFenetre\top - #MoveWindow_Magnetic_Window And Fenetre\top <= AutreFenetre\bottom + #MoveWindow_Magnetic_Window) Or (Fenetre\bottom >= AutreFenetre\top - #MoveWindow_Magnetic_Window And Fenetre\bottom <= AutreFenetre\bottom + #MoveWindow_Magnetic_Window) Or (Fenetre\top <= AutreFenetre\top And Fenetre\bottom >= AutreFenetre\bottom)
						; Bord gauche de l'autre fenêtre
						If Abs(Fenetre\right - AutreFenetre\left) < #MoveWindow_Magnetic_Window
							FenetreX = AutreFenetre\left - (Fenetre\right - Fenetre\left)
						ElseIf Abs(Fenetre\left - AutreFenetre\left) < #MoveWindow_Magnetic_Window
							FenetreX = AutreFenetre\left
						EndIf
						; Bord droit de l'autre fenêtre
						If Abs(Fenetre\right - AutreFenetre\right) < #MoveWindow_Magnetic_Window
							FenetreX = AutreFenetre\right - (Fenetre\right - Fenetre\left)
						ElseIf Abs(Fenetre\left - AutreFenetre\right) < #MoveWindow_Magnetic_Window
							FenetreX = AutreFenetre\right
						EndIf
					EndIf
					; Bord haut et bas
					If (Fenetre\left >= AutreFenetre\left - #MoveWindow_Magnetic_Window And Fenetre\left <= AutreFenetre\right + #MoveWindow_Magnetic_Window) Or (Fenetre\right >= AutreFenetre\left - #MoveWindow_Magnetic_Window And Fenetre\right <= AutreFenetre\right + #MoveWindow_Magnetic_Window) Or (Fenetre\left <= AutreFenetre\left And Fenetre\right >= AutreFenetre\right)
						; Bord haut de l'autre fenêtre
						If Abs(Fenetre\bottom - AutreFenetre\top) < #MoveWindow_Magnetic_Window
							FenetreY = AutreFenetre\top - (Fenetre\bottom - Fenetre\top)
						ElseIf Abs(Fenetre\top - AutreFenetre\top) < #MoveWindow_Magnetic_Window
							FenetreY = AutreFenetre\top
						EndIf
						; Bord bas de l'autre fenêtre
						If Abs(Fenetre\bottom - AutreFenetre\bottom) < #MoveWindow_Magnetic_Window
							FenetreY = AutreFenetre\bottom - (Fenetre\bottom - Fenetre\top)
						ElseIf Abs(Fenetre\top - AutreFenetre\bottom) < #MoveWindow_Magnetic_Window
							FenetreY = AutreFenetre\bottom
						EndIf
					EndIf
					
				EndIf
			Next
			
		EndIf
		
		; On déplace la fenêtre
		ResizeWindow(WindowID, FenetreX, FenetreY, #PB_Ignore, #PB_Ignore)
		
	Until Event = #WM_LBUTTONUP Or Event = #WM_NCLBUTTONUP
	
	ClearList(MoveWindowID())
	
EndProcedure

DisableExplicit



; Création des fenêtres et des GadgetList
If OpenWindow(0, 100, 100, 100, 100, "Test", #PB_Window_BorderLess | #WS_SYSMENU) = 0
	End
EndIf
SetWindowColor(0, RGB(0, 0, 255))

If OpenWindow(1, 300, 100, 100, 100, "Test2", #PB_Window_BorderLess | #WS_SYSMENU, WindowID(0)) = 0
	End
EndIf
SetWindowColor(1, RGB(0, 255, 0))

If OpenWindow(2, 100, 300, 100, 150, "Test3", #PB_Window_BorderLess | #WS_SYSMENU | #WS_BORDER, WindowID(0)) = 0
	End
EndIf
SetWindowColor(2, RGB(255, 0, 0))

If OpenWindow(3, 300, 300, 150, 100, "Test4", #PB_Window_BorderLess | #WS_SYSMENU | #WS_SIZEBOX, WindowID(0)) = 0
	End
EndIf
SetWindowColor(3, RGB(255, 255, 0))

; If OpenWindow(4, 300, 500, 150, 100, "Test5", #PB_Window_SystemMenu) = 0
	; End
; EndIf
; SetWindowColor(4, RGB(0, 255, 255))


; Boucle d'évènement
Repeat
	Event = WaitWindowEvent()
	
	Select Event
		Case #WM_LBUTTONDOWN
			If EventWindow() > 1
				MoveWindow(EventWindow(), 1, 0)
			Else
				MoveWindow(EventWindow(), 1, 1)
			EndIf
	EndSelect
	
Until Event = #PB_Event_CloseWindow

End

Re: Accrochage sur les bords de l'écran et entre fenêtres

Publié : dim. 02/sept./2012 10:06
par Ar-S
Excellent. Merci LSI.
Il ne reste plus maintenant qu'à déplacer les x fenêtres en même temps (en n'en déplaçant qu'une), lorsque celles ci sont "magnétisées".

Re: Accrochage sur les bords de l'écran et entre fenêtres

Publié : dim. 02/sept./2012 10:32
par Le Soldat Inconnu
Et comment tu démagnétises ?

Ou alors déplacer les fenêtres magnétisées ensemble si on appuie sur la touche MAJ, c'est une idée.

Re: Accrochage sur les bords de l'écran et entre fenêtres

Publié : dim. 02/sept./2012 10:35
par Ar-S
Le Soldat Inconnu a écrit :Et comment tu démagnétises ?

Ou alors déplacer les fenêtres magnétisées ensemble si on appuie sur la touche MAJ, c'est une idée.
C'est vrai qu'habituellement, ce sont les fenêtres filles qui se démagnétisent lorsqu'on les bouge. Le "pack" complet se déplace avec la fenêtre mère.

tu peux voir ça avec AIMP3 (lecteur audio) et surement winamp aussi. Les playlist peuvent se coller/décoller mais lorsqu'on bouge le lecteur, la playlist collée suit la fenêtre

Re: Accrochage sur les bords de l'écran et entre fenêtres

Publié : dim. 02/sept./2012 11:11
par Le Soldat Inconnu
pigé :)