Selection graphique

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
wood51
Messages : 122
Inscription : ven. 05/juin/2009 13:04
Localisation : orléans

Selection graphique

Message par wood51 »

Bonsoir,

Pour mon petit projet , j'ai besoin de "dessiner" dans un canvasgadget et de pouvoir sélectionner les divers éléments pour pouvoir effacer , redimensionner etc ...

Pour la sélection , je crée une région pour chaque éléments dessiné puis enregistre le handle dans une liste chainée . Ensuite je parcours ma liste et vérifie avec PtInRegion si ma souris se trouve sur mon élément . Le souci c'est que çà fonctionne pour le dernier élément dessiné mais par pour les autres . Ca fait 2 jours que je cherche mais je ne vois pas :(

Code : Tout sélectionner

;{- Enumerations / DataSections
Enumeration
  #Window
EndEnumeration

Enumeration
  #ToolBar
  #StatusBar
EndEnumeration

Enumeration
  #Canvas
  #Image
EndEnumeration

Enumeration
  #ToolBar_New
  #ToolBar_Open
  #ToolBar_Save
  #ToolBar_Propiete
  #Toolbar_Info
  #Toolbar_Help
EndEnumeration

;DataSection
;  new   :     IncludeBinary "res\Icons\new.png"
;  open  :     IncludeBinary "res\Icons\open.png"
;  save  :     IncludeBinary "res\Icons\save.png"
;  propriete : IncludeBinary "res\Icons\propriete.png"
;  info  :     IncludeBinary "res\Icons\info.png"
;  help  :     IncludeBinary "res\Icons\help.png"
;EndDataSection

Structure Objet
  x.i
  y.i
  x1.i
  y1.i
  hRgn.i  
EndStructure


Define.l Event, EventWindow, EventGadget, EventType, EventMenu
;}


Procedure OpenWindow_MainWindow()
  If OpenWindow(#Window, 0, 00, 700, 600, "Report Creator", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
    If CreateToolBar(#ToolBar,WindowID(#Window))
      ;ToolBarImageButton(#ToolBar_New,ImageID(CatchImage(#PB_Any,?new)))
      ;ToolBarImageButton(#ToolBar_Open,ImageID(CatchImage(#PB_Any,?open)))
      ;ToolBarImageButton(#ToolBar_Save,ImageID(CatchImage(#PB_Any,?save)))
      ;ToolBarSeparator()
      ;ToolBarImageButton(#ToolBar_Propiete,ImageID(CatchImage(#PB_Any,?propriete)))
      ;ToolBarSeparator()
      ;ToolBarImageButton(#Toolbar_Info,ImageID(CatchImage(#PB_Any,?info)))
      ;ToolBarImageButton(#Toolbar_Help,ImageID(CatchImage(#PB_Any,?help)))
    EndIf
    
    If CreateStatusBar(#StatusBar, WindowID(#Window))
      AddStatusBarField(#PB_Ignore)
      AddStatusBarField(#PB_Ignore)
    EndIf
    CanvasGadget(#Canvas, 0, ToolBarHeight(#ToolBar), 700, 600 - ToolBarHeight(#ToolBar) - StatusBarHeight(#StatusBar),#PB_Canvas_ClipMouse|#PB_Canvas_Keyboard)
    CreateImage(#Image,700,600 - StatusBarHeight(#StatusBar))
  EndIf
EndProcedure

Procedure DrawCellTxt(x.i,y.i,width.i,height.i,txt.s)
  x_txt.i = (width-TextWidth(txt))/2
  y_txt.i = (height-TextHeight(txt))/2
  
  DrawingMode(#PB_2DDrawing_Outlined)
  
  Line(x,y,width,1,RGB(0,0,0)) ; haut
  Line(x+width,y,1,height,RGB(0,0,0)) ;droite
  Line(x+width,y+height,-width,1,RGB(0,0,0)) ;bas
  Line(x,y+height,1,-height,RGB(0,0,0)) ;gauche
  
  
  
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(x_txt+x,y_txt+y,txt,RGB(0,0,0))
  
EndProcedure

UsePNGImageDecoder()
OpenWindow_MainWindow()
NewList Obj.Objet()
snapX=10
snapY=10
StartDrawing(CanvasOutput(#Canvas))
For i = 0 To (700/snapX)-1
  For j = 0 To ((600 - ToolBarHeight(#ToolBar) - StatusBarHeight(#StatusBar))/snapY)
    Plot(i*snapX,j*snapY,$ff0000)
  Next j
Next i
StopDrawing()



;{- Event loop
Repeat
  Event = WaitWindowEvent()
  Select Event
      ; ///////////////////
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #Canvas
        If EventType = #PB_EventType_LeftButtonDown
          AddElement(Obj())
          
          Drag.i = 1
          XStart =  GetGadgetAttribute(#Canvas,#PB_Canvas_MouseX)
          YStart =  GetGadgetAttribute(#Canvas,#PB_Canvas_MouseY) 
          
          XStart=(XStart/snapX)*snapX
          YStart=(YStart/snapY)*snapY
          
          Obj()\x = XStart
          Obj()\y = YStart
          
          StartDrawing(ImageOutput(#Image))
          DrawImage(GetGadgetAttribute(#Canvas,#PB_Canvas_Image),0,0)
          StopDrawing()
          
        EndIf
        
        If EventType = #PB_EventType_LeftButtonUp
          Drag.i = 0
          
          Obj()\hRgn=CreateRectRgn_(Obj()\x,Obj()\y,Obj()\x1,Obj()\y1)
          ForEach Obj()
          Debug Obj()\hRgn  
          Next
          
          
          
          
          
        EndIf
        
        If EventType = #PB_EventType_MouseMove  
          
          x = GetGadgetAttribute(#Canvas,#PB_Canvas_MouseX) ; coordonnées x sur le canvas 
          y = GetGadgetAttribute(#Canvas,#PB_Canvas_MouseY) ; coordonnées y sur le canvas
          
          x=(x/snapX)*snapX
          y=(y/snapY)*snapY
          
          
          StatusBarText(#StatusBar,0,StrF(x,0) + ";" +StrF(y,0),#PB_StatusBar_Center) ; affiche les coordonées en pixel
          
          If Drag
            Obj()\x1=x
          Obj()\y1=y
          
            StartDrawing(CanvasOutput(#Canvas))
            DrawingMode(#PB_2DDrawing_Outlined)
            DrawImage(ImageID(#Image),0,0)
            DrawCellTxt(XStart,YStart,x-XStart,y-YStart,"Azerty")
            StopDrawing()
          EndIf
          
          ForEach Obj()
            If PtInRegion_(Obj()\hRgn,x,y)
              StatusBarText(#StatusBar,1,"OK")
              
            Else
              StatusBarText(#StatusBar,1,"NO OK")
              
            EndIf
            
          Next
          
          
          
        EndIf  
        
      EndIf
      ; ////////////////////////
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window
        CloseWindow(#Window)
        Break
        EndIf
    EndSelect
  ForEver
  ;
  ;}
 
Si vous avez une idée , je suis preneurs :lol: . Si vous avez des critiques sur mon code , ou des idées d'amélioration n'hésitez pas comme je suis débutant , je dois coder des choses pas très catholique .

@+ David
Compétences : Bricoleur PureBasic du dimanche
Crâmage de cerveau en cours 100% :D
Projet en cours : http://purepicbasic.frenchboard.com/
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: Selection graphique

Message par case »

il faut sortir de la boucle de test des que la bonne region est trouvée.
sinon le programme continue de parcourir la list et comme la souris n'est pas dans les regions suivante cela affiche "no ok"

Code : Tout sélectionner

         
          ForEach Obj()
            If PtInRegion_(Obj()\hRgn,x,y)
              StatusBarText(#StatusBar,1,"OK")
              Break
            Else
              StatusBarText(#StatusBar,1,"NO OK")
            EndIf
          Next
         
ImageImage
Avatar de l’utilisateur
wood51
Messages : 122
Inscription : ven. 05/juin/2009 13:04
Localisation : orléans

Selection graphique

Message par wood51 »

Merci case j'essaie ça ce soir
Compétences : Bricoleur PureBasic du dimanche
Crâmage de cerveau en cours 100% :D
Projet en cours : http://purepicbasic.frenchboard.com/
Avatar de l’utilisateur
wood51
Messages : 122
Inscription : ven. 05/juin/2009 13:04
Localisation : orléans

Selection graphique

Message par wood51 »

Salut j'ai essayé , ça fonctionne sauf quand 2 ou 3 rectangles se chevauche ... À suivre je regarderais demain ... Merci merci
Compétences : Bricoleur PureBasic du dimanche
Crâmage de cerveau en cours 100% :D
Projet en cours : http://purepicbasic.frenchboard.com/
Avatar de l’utilisateur
wood51
Messages : 122
Inscription : ven. 05/juin/2009 13:04
Localisation : orléans

Re: Selection graphique

Message par wood51 »

Bonjour,
Je n'y arrive toujours pas , auriez vous une autre façon de procéder pour sélectionner ?
En fait je n'arrive pas a savoir comment gérer deux dessins qui sont imbriqués ou qui se croisent
Compétences : Bricoleur PureBasic du dimanche
Crâmage de cerveau en cours 100% :D
Projet en cours : http://purepicbasic.frenchboard.com/
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Selection graphique

Message par Ar-S »

Salut,
Fais une petite recherche, il me semble que quelqu'un a déjà posté un petit code du genre avec gestion de calques. C'est ce qu'il te faut.
(désolé je ne me souviens plus de qui...)
~~~~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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Selection graphique

Message par Backup »

en fait c'est un peu normal , tu ne sépare rien ...

j'ai légèrement changé ton listing , pour qu'on puisse dessiner avec le bouton GAUCHE

et selectionner avec le bouton DROIT ...
j'en ai profité pour ajouter un petit effet de couleur rouge a l'objet sélectionné ...
comme tu vas le voir , je selectionne l'objet , je ressort son "ID"
et je redessine tout les autres en noir ....
en programmation , il faut séparer les actions , un ordinateur c'est con , il faut lui demander les choses une par une ...
( comme moi du reste :) )
on est sur PC ( la plupart ) et on a une souris avec 2 boutons , faut les utiliser ;)

si tu ne sépare pas les actions , comment veux tu savoir, si le gus, il dessine un objet, ou s'il désire le sélectionner ....???
si 2 objet se chevauche , et que tu clique sur le chevauchement , les 2 objets seront selectionné ... apres tout , c'est normal non ?

bien sur tu peux décider arbitrairement d'en selectionner qu'un seul



apprenez a structurer vos codes ...
je veux dire , qu'il faut bien séparer les actions , se mettre a la place de l'ordinateur
et se dire , qu'est ce qu'il me veux (encore) cet utilisateur ?

ha .. il clique avec le bouton gauche ... voyons , ce que j'ai a lui proposer comme action ... (une seule action a la fois , si possible ;) ))

Code : Tout sélectionner

;{- Enumerations / DataSections
Enumeration
	#Window
EndEnumeration

Enumeration
	#ToolBar
	#StatusBar
EndEnumeration

Enumeration
	#Canvas
	#Image
EndEnumeration

Enumeration
	#ToolBar_New
	#ToolBar_Open
	#ToolBar_Save
	#ToolBar_Propiete
	#Toolbar_Info
	#Toolbar_Help
EndEnumeration

;DataSection
;  new   :     IncludeBinary "res\Icons\new.png"
;  open  :     IncludeBinary "res\Icons\open.png"
;  save  :     IncludeBinary "res\Icons\save.png"
;  propriete : IncludeBinary "res\Icons\propriete.png"
;  info  :     IncludeBinary "res\Icons\info.png"
;  help  :     IncludeBinary "res\Icons\help.png"
;EndDataSection

Structure Objet
	x.i
	y.i
	x1.i
	y1.i
	hRgn.i 
EndStructure


Define.l Event, EventWindow, EventGadget, EventType, EventMenu
;}

Declare  OpenWindow_MainWindow()
Declare  DrawCellTxt(x.i,y.i,width.i,height.i,txt.s)



UsePNGImageDecoder()
OpenWindow_MainWindow()
NewList Obj.Objet()
snapX=10
snapY=10
StartDrawing(CanvasOutput(#Canvas))
	For i = 0 To (700/snapX)-1
		For j = 0 To ((600 - ToolBarHeight(#ToolBar) - StatusBarHeight(#StatusBar))/snapY)
			Plot(i*snapX,j*snapY,$ff0000)
		Next j
	Next i
StopDrawing()



;{- Event loop
Repeat
	Event = WaitWindowEvent()
	Select Event
		; ///////////////////
		Case #PB_Event_Gadget
		EventGadget = EventGadget()
		EventType = EventType()
		If EventGadget = #Canvas
			If EventType = #PB_EventType_LeftButtonDown
				AddElement(Obj())
				
				Drag.i = 1
				XStart =  GetGadgetAttribute(#Canvas,#PB_Canvas_MouseX)
				YStart =  GetGadgetAttribute(#Canvas,#PB_Canvas_MouseY)
				
				XStart=(XStart/snapX)*snapX
				YStart=(YStart/snapY)*snapY
				
				Obj()\x = XStart
				Obj()\y = YStart
				
				StartDrawing(ImageOutput(#Image))
					DrawImage(GetGadgetAttribute(#Canvas,#PB_Canvas_Image),0,0)
				StopDrawing()
				
			EndIf
			
			If EventType = #PB_EventType_LeftButtonUp
				Drag.i = 0
				
				Obj()\hRgn=CreateRectRgn_(Obj()\x,Obj()\y,Obj()\x1,Obj()\y1)
				ForEach Obj()
					Debug Obj()\hRgn 
				Next
				
				
				
				
				
			EndIf
			
			; ******************* Selection bouton droit de la souris ****************************
			
			if and EventType =#PB_EventType_rightButtonDown
				ForEach Obj()
					If PtInRegion_(Obj()\hRgn,x,y) 
						StatusBarText(#StatusBar,1,"ID =" +str(Obj()\hRgn))
						
						StartDrawing(CanvasOutput(#Canvas))
							DrawingMode(#PB_2DDrawing_Outlined )
							
							box (Obj()\x,Obj()\y,Obj()\x1-Obj()\x,Obj()\y1-Obj()\y,255)
						StopDrawing()
						
						;break
						Else
						
						StartDrawing(CanvasOutput(#Canvas))
							DrawingMode(#PB_2DDrawing_Outlined )
							box (Obj()\x,Obj()\y,Obj()\x1-Obj()\x,Obj()\y1-Obj()\y,rgb(125,125,125))
							DrawCellTxt(Obj()\x,Obj()\y,Obj()\x1-Obj()\x,Obj()\y1-Obj()\y,"Azerty")
						StopDrawing()
					EndIf
				Next
			endif
			; ********************************************************************************
			
			If EventType = #PB_EventType_MouseMove 
				
				x = GetGadgetAttribute(#Canvas,#PB_Canvas_MouseX) ; coordonnées x sur le canvas
				y = GetGadgetAttribute(#Canvas,#PB_Canvas_MouseY) ; coordonnées y sur le canvas
				
				x=(x/snapX)*snapX
				y=(y/snapY)*snapY
				
				
				StatusBarText(#StatusBar,0,StrF(x,0) + ";" +StrF(y,0),#PB_StatusBar_Center) ; affiche les coordonées en pixel
				
				If Drag
					Obj()\x1=x
					Obj()\y1=y
					
					StartDrawing(CanvasOutput(#Canvas))
						DrawingMode(#PB_2DDrawing_Outlined)
						DrawImage(ImageID(#Image),0,0)
						DrawCellTxt(XStart,YStart,x-XStart,y-YStart,"Azerty")
					StopDrawing()
				EndIf       
				
			EndIf 
			
		EndIf
		; ////////////////////////
		Case #PB_Event_CloseWindow
		EventWindow = EventWindow()
		If EventWindow = #Window
			CloseWindow(#Window)
			Break
		EndIf
	EndSelect
ForEver
;




; ************** zone des procedures *****************************
Procedure OpenWindow_MainWindow()
	If OpenWindow(#Window, 0, 00, 700, 600, "Report Creator", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
		If CreateToolBar(#ToolBar,WindowID(#Window))
			;ToolBarImageButton(#ToolBar_New,ImageID(CatchImage(#PB_Any,?new)))
			;ToolBarImageButton(#ToolBar_Open,ImageID(CatchImage(#PB_Any,?open)))
			;ToolBarImageButton(#ToolBar_Save,ImageID(CatchImage(#PB_Any,?save)))
			;ToolBarSeparator()
			;ToolBarImageButton(#ToolBar_Propiete,ImageID(CatchImage(#PB_Any,?propriete)))
			;ToolBarSeparator()
			;ToolBarImageButton(#Toolbar_Info,ImageID(CatchImage(#PB_Any,?info)))
			;ToolBarImageButton(#Toolbar_Help,ImageID(CatchImage(#PB_Any,?help)))
		EndIf
		
		If CreateStatusBar(#StatusBar, WindowID(#Window))
			AddStatusBarField(#PB_Ignore)
			AddStatusBarField(#PB_Ignore)
		EndIf
		CanvasGadget(#Canvas, 0, ToolBarHeight(#ToolBar), 700, 600 - ToolBarHeight(#ToolBar) - StatusBarHeight(#StatusBar),#PB_Canvas_ClipMouse|#PB_Canvas_Keyboard)
		CreateImage(#Image,700,600 - StatusBarHeight(#StatusBar))
	EndIf
EndProcedure

Procedure DrawCellTxt(x.i,y.i,width.i,height.i,txt.s)
	x_txt.i = (width-TextWidth(txt))/2
	y_txt.i = (height-TextHeight(txt))/2
	
	DrawingMode(#PB_2DDrawing_Outlined)
	
	Line(x,y,width,1,RGB(0,0,0)) ; haut
	Line(x+width,y,1,height,RGB(0,0,0)) ;droite
	Line(x+width,y+height,-width,1,RGB(0,0,0)) ;bas
	Line(x,y+height,1,-height,RGB(0,0,0)) ;gauche
	
	
	
	DrawingMode(#PB_2DDrawing_Transparent)
	DrawText(x_txt+x,y_txt+y,txt,RGB(0,0,0))
	
EndProcedure
;}


; EPB

Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Selection graphique

Message par falsam »

Une base de travail. Tu peux redimensionner et déplacer.

Code : Tout sélectionner

EnableExplicit

Enumeration
  #FontApp
	#Mainform
	#Design
EndEnumeration

Structure DefineGadget
	Left.i
	Top.i
	Width.i
	Height.i
	Text.s
EndStructure

Global NewList Gadget.DefineGadget()

Global DeltaX.i, DeltaY.i
Global DesignWidth.i, DesignHeight.i


Procedure AddEntity(Value.i)
  AddElement(Gadget())
  
	Gadget()\Left = Random(500)
	Gadget()\Top = Random(500)
	Gadget()\Width = 100
	Gadget()\Height = 20
	Gadget()\text = "Entity "+Str(Value)
	
EndProcedure

;Update Design Contents - Mise à jour du Design
Procedure DesignUpdateContent()
  StartDrawing(CanvasOutput(#Design))
  DrawingFont(FontID(#FontApp))
  
  ;Draw BackGround - Dessine l'arriere plan
  Box(0, 0, DesignWidth, DesignHeight, RGB(240, 240, 240))
    
  ;Draw each gadget - Dessine chaque gadget
  ForEach Gadget()
    With Gadget()
      RoundBox(\Left, \Top, \width, \Height, 3, 3, RGB(105, 105, 105))
      RoundBox(\left+1, \Top+1, \Width-2, \Height-2, 3, 3, RGB(237, 252, 195))
      If TextHeight(\Text) < \Height-2 And TextWidth(\Text) < \Width-5
        DrawText(\left+5, \Top+2, \Text, RGB(0, 0, 0), RGB(237, 252, 195))
      EndIf
      
		EndWith
	Next
		
	StopDrawing()
EndProcedure


;Resize design
Procedure DesignResize()
  DesignWidth = WindowWidth(#Mainform)
  DesignHeight = WindowHeight(#Mainform) 
  ResizeGadget(#Design, 0, 0, DesignWidth, DesignHeight)
  DesignUpdateContent()
EndProcedure


;Examine canvas events - Examine les évenements du canvas gadget
Procedure ExamineEvent(EventType.i)
  Static Mode = -1
  Static *ActiveGadget.DefineGadget
  Protected *CurrentGadget.DefineGadget
	Protected MouseX.i, MouseY.i 
	Protected GadgetX.i, GadgetY.i, GadgetWidth.i, GadgetHeight.i
	
	MouseX = GetGadgetAttribute(#Design, #PB_Canvas_MouseX)
	MouseY = GetGadgetAttribute(#Design, #PB_Canvas_MouseY)
		
	If *ActiveGadget = #Null
		ForEach Gadget()
			With Gadget()
				GadgetX = \Left
				GadgetY = \Top
				GadgetWidth = \Width
				GadgetHeight = \Height
				
				If MouseX > GadgetX And MouseX < GadgetX+GadgetWidth And MouseY > GadgetY And MouseY < GadgetY+GadgetHeight
				  *CurrentGadget = @gadget()
				  Mode=0 ;Move gadget
				  SetGadgetAttribute(#Design, #PB_Canvas_Cursor, #PB_Cursor_Arrows)
				  
					If MouseY < GadgetY+4
					  Mode = 1 ;Anchor North
					  SetGadgetAttribute(#Design, #PB_Canvas_Cursor, #PB_Cursor_UpDown)
					  
					ElseIf MouseY > GadgetY+GadgetHeight-4
					  Mode = 2 ;Anchor South
					  SetGadgetAttribute(#Design, #PB_Canvas_Cursor, #PB_Cursor_UpDown)
					  
					ElseIf MouseX < GadgetX+4
					  Mode = 3 ;Anchor West
					  SetGadgetAttribute(#Design, #PB_Canvas_Cursor, #PB_Cursor_LeftRight)
					  
					ElseIf MouseX >	 GadgetX+GadgetWidth-4
					  Mode = 4 ;Anchor East
					  SetGadgetAttribute(#Design, #PB_Canvas_Cursor, #PB_Cursor_LeftRight)
					EndIf
				EndIf
			EndWith
		Next
		
		If Not *CurrentGadget
		  SetGadgetAttribute(#Design, #PB_Canvas_Cursor, #PB_Cursor_Default)  
    EndIf
	EndIf
	
	Select EventType
	    
	  Case #PB_EventType_RightButtonDown
	    *ActiveGadget = #Null
	    SetGadgetAttribute(#Design, #PB_Canvas_Cursor, #PB_Cursor_Default) 
	    
	  Case #PB_EventType_LeftButtonUp
	    *ActiveGadget = #Null
	    
	  Case #PB_EventType_LeftButtonDown
	    If *CurrentGadget
		    *ActiveGadget = *CurrentGadget
		    DeltaX=MouseX-*ActiveGadget\Left
		    DeltaY=MouseY-*ActiveGadget\Top
	    EndIf
	    
	    
	  Case 	#PB_EventType_MouseMove
	    If *ActiveGadget 
	      Select Mode
	          
	        Case 0 ;Move Gadget
	          *ActiveGadget\Top=MouseY-DeltaY
		        *ActiveGadget\Left=MouseX-DeltaX
		    
		      Case 1 ;Resize Anchor North
		        If *ActiveGadget\Height+(*ActiveGadget\Top-MouseY) > 2
		          *ActiveGadget\Height = *ActiveGadget\Height+(*ActiveGadget\Top-MouseY)
		          *ActiveGadget\Top = MouseY
		        EndIf
		    		    
		      Case 2 ;Resize Anchor South
		        If MouseY-*ActiveGadget\Top > 2
		          *ActiveGadget\Height=MouseY-*ActiveGadget\Top
		        EndIf
		        
		    
		      Case 3 ;Resize Anchor West
		        If *ActiveGadget\Width + (*ActiveGadget\Left-MouseX) > 2
		          *ActiveGadget\Width = *ActiveGadget\Width + (*ActiveGadget\Left-MouseX) 
		          *ActiveGadget\Left=MouseX
		        EndIf
        
		      Case 4 ;Resize Anchor East
		        If MouseX - *ActiveGadget\Left > 2
		          *ActiveGadget\Width = MouseX - *ActiveGadget\Left
		        EndIf
            
        EndSelect ;End Mode
        
        ;Redraws all gadgets
        DesignUpdateContent()
      EndIf ;End *ActiveGadget  
  EndSelect ;End EventType
  
EndProcedure

Procedure Open_Design()
  Protected Buffer.s, i.i
  
  LoadFont(#FontApp,"Arial", 9)  
  
  OpenWindow(#Mainform, 0, 0, 600, 500, "Canvas Test", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget)
  CanvasGadget(#Design, 0, 0, 600, 500)
  
  For i = 1 To 10
    AddEntity(i)
  Next
  
  DesignUpdateContent()
EndProcedure

Open_Design()

Repeat
  Select WaitWindowEvent()
      
    Case #PB_Event_Menu
			
		Case #PB_Event_Gadget
			Select EventGadget()
			  Case #Design
			    ExamineEvent(EventType())        
			EndSelect
			
		Case #PB_Event_SizeWindow
		  DesignResize()
		  
		Case #PB_Event_CloseWindow
		  End
	    	  
	EndSelect	 	
ForEver
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
wood51
Messages : 122
Inscription : ven. 05/juin/2009 13:04
Localisation : orléans

Re: Selection graphique

Message par wood51 »

Quand je serais grand .... Je serais programmeur :lol: !!!! Un GRAND Merci .
Je étudier tous çà histoire de bien comprendre .

Falsam :
Tu parle d'une base de travail , super ton code merci !!!

Dobro : C'est exactement ce que je voulais merci
apprenez a structurer vos codes ...
Tu tout a fait raison . Le problème est que je suis bordélique et du coup j'ai pas de vision globale de mon code .
Les commentaire c'est comme une rédaction , c'est feuille blanche , je sais pas quoi écrire .
J'ai failli ouvrir un sujet pour savoir et comprendre comment vous (programmeur :) ) faite pour mener un projet jusque au bout , votre organisation , mais je voulais pas faire le boulet .

En tous cas super ! Ça fait du bien de savoir qu'on est pas tout seul derrière l'écran

Dobro si tu veut avoir des sueurs blanches tu peut essayer la première version de mon petit logiciel mais attention au cauchemars parce que le code c'est vraiment le bordel :mrgreen:

http://bl.microtuning.fr/
Compétences : Bricoleur PureBasic du dimanche
Crâmage de cerveau en cours 100% :D
Projet en cours : http://purepicbasic.frenchboard.com/
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Selection graphique

Message par Backup »

wood51 a écrit : J'ai failli ouvrir un sujet pour savoir et comprendre comment vous (programmeur :) ) faite pour mener un projet jusque au bout , votre organisation ,

nous avions commencé un sujet ici :
http://www.purebasic.fr/french/viewtopic.php?f=1&t=8982
:)

pour les commentaires dans un code , ben c'est assez simple , tu note tout ce qui pourrai te faire rappeler a quoi sert la partie de code en question
l'essentiel , c'est que TOI , tu t'y retrouve :)

bien sur c'est un peu plus précis , lorsqu'il s'agit d'expliquer a d'autres , ou tu veux en venir , (pour un TUTO par exemple )

lorsque je parlais de "Structurer" le code , il ne s'agissait pas vraiment de la Structure ( l'architecture ) de ton code

mais de "Décomposition" des Actions ...



lorsque je code , j'essaie de me mettre a la place d'un utilisateur lambda , et j'essaie , d'entrevoir toute les "conneries"
que le Gus va faire .... :)

je me pose ensuite les questions :

comment empecher le mec, de cliquer en dehors de l'endroit voulu ,
comment ,l'obliger a utiliser le bouton droit , puis le bouton gauche .. etc ...

de sorte que l'utilisateur doit pourvoir utiliser le programme de façon "naturel" sans lire 3000 lignes de DOC :)

c'est tres souvent que j'essaie des Codes ici , qui sont tres bien conçut ( puisqu'il fonctionnent ;) )
mais dont l'ergonomie est a mourir de rire :)

tout ça pour un simple détail , le programmeur, n'a pas pensé que l'utilisateur, ne sais pas comment est conçut le programme
il existe des "codes" d'utilisations de programme , par exemple on n'utilise pas le meme bouton de souris , pour effectuer a la suite 2 actions différentes..

en general , le bouton de gauche sert au Dessin , et celui de droite , donne une alternative a cette action ...
etc... bref , le bon sens :)

si l'on veux donner une alternative et garder le bouton de gauche , on utilise alors une touche de clavier , ALT ( Alternate , Alternative Tiens...tiens ...)
Control servira pour ajouter un control du Curseur , un Snap par exemple ...
Shift , pourrai alors servir pour changer le mode de Dessin , ( BOLD ou outlined , par exemple ) etc ...

du coup le bouton de droit serai libre pour autre chose :) (changement d'interface par exemple ) on passerai de l'interface de choix des options, a celui de la page de dessin ...


bref , de l'ergonomie de base , qu'on retrouve sous plein d'applications ... ( heureusement d'ailleurs )

mais quelque fois on tombe sur des prg qui sont fait justement par des programmeurs , sans sens pratique .. :)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Selection graphique

Message par Backup »

je viens de regarder vite fait ton code

bon , on est d'accord , l'essentiel , c'est qu'il fonctionne .. mais

perso , j'aurai mis les Data a la fin du listing ,
au dessus , j'aurai collé toutes les procedures

le Todo , je l'aurai mis tout en haut

de sorte, que lorsque tu ouvre ton code, tu vois tout de suite ce qu'il faut faire

et tu accèdes rapidement a ta boucle principale , sans avoir a scroller le code pour passer toutes les procedures qui se trouvent en haut de listing ...
( n'oublie pas qu'une procedure mis en fin de listing , doit etre declaré :) )

et puis dans ton code evite ce genre de truc ignoble :

Code : Tout sélectionner

Repeat
  Event = WaitWindowEvent()
  Select Event
    ;{ /////////////////// Gadget
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #Tree_Machines &  #PB_EventType_LeftClick 
        Charge_Caracteristique_Machine()
      ElseIf EventGadget = #Button_Machines_Ajouter
        OpenWindow_Window_Fille_Ajout_Machine()
      ElseIf EventGadget = #Button_Machines_Editer
        Charge_Edite_Machine()
      ElseIf EventGadget = #Button_Machine_Supprimer
        Efface_Machine()
      ElseIf EventGadget = #Editor_Machines
      ElseIf EventGadget = #String_Creation_Machine_Type
      ElseIf EventGadget = #String_Creation_Machine_Modele
      ElseIf EventGadget = #CheckBox_Creation_Machine_Optelec
      ElseIf EventGadget = #String_Creation_Machine_Noencours
      ElseIf EventGadget = #String_Creation_Machine_Bareme
      ElseIf EventGadget = #Button_Creation_Machine_Valider

utilise les Select // Case
( meme imbriquée, ça reste plus clair que Elseif )

voila , sinon , le reste me parait tres bien :)

ps : n'hesite pas a utiliser ";- Loop" pour avoir le signet qui apparait dans l'onglet de coté ..
de sorte que si tu clique sur le signet, tu vas directement scroller a cet endroit ... pratique pour se deplacer rapidement dans le code :)
Avatar de l’utilisateur
wood51
Messages : 122
Inscription : ven. 05/juin/2009 13:04
Localisation : orléans

Re: Selection graphique

Message par wood51 »

Dobro ,je te remercie des conseils :)
Compétences : Bricoleur PureBasic du dimanche
Crâmage de cerveau en cours 100% :D
Projet en cours : http://purepicbasic.frenchboard.com/
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Selection graphique

Message par Backup »

bah , les conseilleurs , ne sont pas les payeurs ..comme on dit :)
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Selection graphique

Message par dayvid »

Falsam, super ton code :D
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Selection graphique

Message par Kwai chang caine »

dayvid a écrit :Falsam, super ton code :D
Je dirais même splendide...
Merci 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre