Page 1 sur 1

Déplacer des fenêtres en synchro / les organiser

Publié : mer. 13/mars/2013 22:39
par graph100
un petit utilitaire sympa, ni fini, ni joli, mais il fait le job.
En ce moment je bosse avec un soft qui génère plein de fenêtre nommées plus ou moins pareil, et bien sur elle ne sont pas bien arrangé, donc c'est pas pratique... (MatLab pour ne pas le nommer)

Et, j'en ai eu marre :twisted:

Donc, en récapitulatif, on indique une partie du titre qui va être cherché sur les fenêtres,
leurs tailles, éventuellement la manière dont on veux qu'elles s'arrangent, et puis on sélectionne celle qui va guider les autres.

Code : Tout sélectionner

Enumeration
	#Listview_0
	#Button_1
	#Text_0
	#String_0
	#String_1
	#String_2
	#String_3
	#String_4
	#Text_1
	#Text_2
	#Text_3
	#Text_4
	#Button_2_RedimAll
	#Button_3_CollerSelection
	#Button_4_CollerSelection
EndEnumeration

Structure fen
	name.s
	hwnd.l
	
	num_matlab.l
EndStructure

Global NewList liste_des_figures.fen()


Procedure Window(Win_Name.s, List fen.fen())
	NewList list_fen.fen()
	modif.b = #False
	
	hwnd.l = FindWindow_( 0, 0 )
	While hwnd <> 0
		If GetWindowLong_(hwnd, #GWL_STYLE) & #WS_VISIBLE = #WS_VISIBLE
			; If GetwindowLong_(Hwnd, #GWL_EXSTYLE) & #WS_EX_TOOLWINDOW <> #WS_EX_TOOLWINDOW
			txt.s = Space(256)
			GetWindowText_(hwnd, txt, 256)
			If txt <> ""
				If FindString(txt, Win_Name)
					AddElement(list_fen())
					
					list_fen()\hwnd = hwnd
					list_fen()\name = txt
					
					If modif = #False
						trouve.b = #False
						
						ForEach fen()
							If fen()\name = txt
								trouve = #True
								Break
							EndIf
						Next
						
						If trouve = #False
							modif = #True
						EndIf
					EndIf
					
				EndIf
			EndIf
			; EndIf
		EndIf
		hwnd = GetWindow_(hwnd, #GW_HWNDNEXT)
	Wend
	
	
	If modif Or ListSize(fen()) <> ListSize(list_fen())
		CopyList(list_fen(), fen())
		
		ForEach fen()
			fen()\num_matlab = Val(ReplaceString(fen()\name, "Figure ", ""))
		Next
		
		SortStructuredList(fen(), #PB_Sort_Ascending, OffsetOf(fen\name), #PB_Sort_String)
		SortStructuredList(fen(), #PB_Sort_Ascending, OffsetOf(fen\num_matlab), #PB_Sort_Long)
		
		ClearGadgetItems(#Listview_0)
		
		ForEach fen()
			AddGadgetItem(#Listview_0, -1, fen()\name)
		Next
		
	EndIf
	
	FreeList(list_fen())
EndProcedure 

Procedure Arranger()
	Static old_rect.RECT
	
	state = GetGadgetState(#Listview_0)
	
	If state > -1
		*fen_select.fen = SelectElement(liste_des_figures(), state)
		
		rect.RECT
		GetWindowRect_(*fen_select\hwnd, @rect)
		
		If rect\left = old_rect\left And rect\top = old_rect\top And rect\bottom = old_rect\bottom And rect\right = old_rect\right
			ProcedureReturn 
		EndIf
		
		CopyStructure(rect, old_rect, RECT)
		
		rect\right = Val(GetGadgetText(#String_0))
		rect\bottom = Val(GetGadgetText(#String_1))
		
		
		SetWindowPos_(liste_des_figures()\hwnd, 0, rect\left, rect\top, rect\right, rect\bottom, 0)
		
		
		H = Val(GetGadgetText(#String_2))
		V = Val(GetGadgetText(#String_3))
		
		ResetList(liste_des_figures())
		For y = 0 To V - 1
			For x = 0 To H - 1
				If NextElement(liste_des_figures()) = 0 : Break	2 : EndIf
				
				If liste_des_figures() = *fen_select
					If NextElement(liste_des_figures()) = 0 : Break	2 : EndIf
				EndIf
				
				If x = 0 And y = 0 : x = 1 : EndIf
				
				SetWindowPos_(liste_des_figures()\hwnd, 0, rect\left + rect\right * x, rect\top + rect\bottom * y, rect\right, rect\bottom, 0)
				
			Next
		Next
	EndIf
EndProcedure



If OpenWindow(0, 0, 0, 370, 200, "REDIM windows", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	
	TextGadget(#Text_4, 10, 12, 70, 20, "Nom fenêtre =")
	StringGadget(#String_4, 90, 10, 70, 20, "Figure ")
	
	ListViewGadget(#Listview_0, 10, 40, 150, 150)
	
	ButtonGadget(#Button_1, 170, 110, 180, 20, "Redimensionner")
	ButtonGadget(#Button_2_RedimAll, 170, 130, 180, 20, "Redimensionner Tout")
	ButtonGadget(#Button_3_CollerSelection, 170, 150, 180, 20, "Arranger autour de celle sélectionnée")
	ButtonGadget(#Button_4_CollerSelection, 170, 170, 180, 20, "Arrangement auto", #PB_Button_Toggle)
	
	TextGadget(#Text_0, 170, 12, 90, 20, "Largueur =")
	StringGadget(#String_0, 260, 10, 90, 20, "500")
	TextGadget(#Text_1, 170, 32, 90, 20, "Hauteur =")
	StringGadget(#String_1, 260, 30, 90, 20, "500")
	
	TextGadget(#Text_2, 170, 62, 90, 20, "NB_cellule H =")
	StringGadget(#String_2, 260, 60, 90, 20, "3")
	TextGadget(#Text_3, 170, 82, 90, 20, "NB_cellule V =")
	StringGadget(#String_3, 260, 80, 90, 20, "2")
EndIf

AddWindowTimer(0, 0, 100)




Repeat
	event = WaitWindowEvent()
	
	If event = #PB_Event_Gadget
		Select EventGadget()
			Case #Button_1
				state = GetGadgetState(#Listview_0)
				
				If state > -1
					SelectElement(liste_des_figures(), state)
					
					rect.RECT
					GetWindowRect_(liste_des_figures()\hwnd, @rect)
					
					SetWindowPos_(liste_des_figures()\hwnd, 0, rect\left, rect\top, Val(GetGadgetText(#String_0)), Val(GetGadgetText(#String_1)), 0)
				EndIf
				
			Case #Button_2_RedimAll
				rect.RECT
				ForEach liste_des_figures()
					GetWindowRect_(liste_des_figures()\hwnd, @rect)
					
					SetWindowPos_(liste_des_figures()\hwnd, 0, rect\left, rect\top, Val(GetGadgetText(#String_0)), Val(GetGadgetText(#String_1)), 0)
				Next
				
			Case #Button_3_CollerSelection
				Arranger()
				
			Case #Button_4_CollerSelection
				If GetGadgetState(#Button_4_CollerSelection)
					AddWindowTimer(0, 1, 50)
				Else
					RemoveWindowTimer(0, 1)
				EndIf
				
				
		EndSelect
	EndIf
	
	If event = #PB_Event_Timer
		Select EventTimer()
			Case 0
				Window(GetGadgetText(#String_4), liste_des_figures())
				
			Case 1
				Arranger()
				
		EndSelect
		
	EndIf
	
	
Until event = #PB_Event_CloseWindow

End

Re: Déplacer des fenêtres en synchro / les organiser

Publié : jeu. 14/mars/2013 9:42
par Kwai chang caine
Bonne idée et marche niquel
J'en ai pas l'utilité immédiate (J'aime pas les math :( ), mais on sait jamais
Merci 8)