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

Programmation d'applications complexes
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

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

Message 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
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
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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
Image
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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.

:!:
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

oups j'avais prévu de le préciser... g zappé :oops:
Image
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
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)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

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

Message 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
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
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message 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".
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

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

Message 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.
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
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message 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
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

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

Message par Le Soldat Inconnu »

pigé :)
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)]
Répondre