Demande conseil dessiner sélection 2D
Demande conseil dessiner sélection 2D
Bonjour,
Pour mes besoin je vais essayer de créer une procédure ou autre pour dessiner
une sélection personnalisable sur la surface voulue...
Je vais utiliser la bibliothèque standard 2D car je suis trop limité avec l'autre.
Sans parler code, comment je dois m'y prendre pour que se soit rapide ?
Si je créer une image avec par exemple des points ou des tiret a X distance
et si l'image est grande, ça risque de ramer non ?
Exemple, créer une image (Sélection) avec des points distancés de 1
pixel, sa risque de ramer grave...
Quel méthode utiliser, comment procéder ?
Pour mes besoin je vais essayer de créer une procédure ou autre pour dessiner
une sélection personnalisable sur la surface voulue...
Je vais utiliser la bibliothèque standard 2D car je suis trop limité avec l'autre.
Sans parler code, comment je dois m'y prendre pour que se soit rapide ?
Si je créer une image avec par exemple des points ou des tiret a X distance
et si l'image est grande, ça risque de ramer non ?
Exemple, créer une image (Sélection) avec des points distancés de 1
pixel, sa risque de ramer grave...
Quel méthode utiliser, comment procéder ?
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.
Re: Demande conseil dessiner sélection 2D
Salut Shadow
est ce que c'est ça que tu veux faire mais en mieux ?
ce code est fourni avec PB :
est ce que c'est ça que tu veux faire mais en mieux ?
ce code est fourni avec PB :
Code : Tout sélectionner
;
; ------------------------------------------------------------
;
; PureBasic - CanvasGadget example file
;
; (c) Fantaisie Software
;
; ------------------------------------------------------------
;
Enumeration
#IMAGE_Content ; stores the previous CanvasGadget content while the mouse is down
#IMAGE_Color
#IMAGE_LoadSave
EndEnumeration
Enumeration
#GADGET_Canvas
#GADGET_Color
#GADGET_Brush
#GADGET_Line
#GADGET_Box
#GADGET_Circle
#GADGET_Fill
#GADGET_Clear
#GADGET_Load
#GADGET_Save
EndEnumeration
Global CurrentColor, CurrentMode, StartX, StartY
; Draw the mouse action result depending on the currently selected mode and event type
;
Procedure DrawAction(x, y, EventType)
If StartDrawing(CanvasOutput(#GADGET_Canvas))
Select CurrentMode
Case #GADGET_Brush
If EventType = #PB_EventType_LeftButtonDown Or EventType = #PB_EventType_MouseMove
Circle(x, y, 5, CurrentColor)
EndIf
Case #GADGET_Line
DrawImage(ImageID(#IMAGE_Content), 0, 0)
LineXY(StartX, StartY, x, y, CurrentColor)
Case #GADGET_Box
DrawImage(ImageID(#IMAGE_Content), 0, 0)
Box(StartX, StartY, x-StartX, y-StartY, CurrentColor)
Case #GADGET_Circle
DrawImage(ImageID(#IMAGE_Content), 0, 0)
If x > StartX
rx = x - StartX
Else
rx = StartX - x
EndIf
If y > StartY
ry = y - StartY
Else
ry = StartY - y
EndIf
If GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Modifiers) & #PB_Canvas_Control
ry = rx
EndIf
Ellipse(StartX, StartY, rx, ry, CurrentColor)
Case #GADGET_Fill
If EventType = #PB_EventType_LeftButtonDown
FillArea(x, y, -1, CurrentColor)
EndIf
EndSelect
StopDrawing()
EndIf
EndProcedure
UseJPEGImageDecoder()
UseJPEGImageEncoder()
CurrentColor = $000000
CurrentMode = #GADGET_Brush
CreateImage(#IMAGE_Color, 35, 35, 24)
CreateImage(#IMAGE_Content, 380, 380, 24)
If OpenWindow(0, 0, 0, 460, 400, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(#GADGET_Canvas, 10, 10, 380, 380, #PB_Canvas_ClipMouse)
ButtonImageGadget(#GADGET_Color, 400, 10, 50, 50, ImageID(#IMAGE_Color))
ButtonGadget(#GADGET_Brush, 400, 100, 50, 25, "Brush", #PB_Button_Toggle)
ButtonGadget(#GADGET_Line, 400, 130, 50, 25, "Line", #PB_Button_Toggle)
ButtonGadget(#GADGET_Box, 400, 160, 50, 25, "Box", #PB_Button_Toggle)
ButtonGadget(#GADGET_Circle, 400, 190, 50, 25, "Circle", #PB_Button_Toggle)
ButtonGadget(#GADGET_Fill, 400, 220, 50, 25, "Fill", #PB_Button_Toggle)
ButtonGadget(#GADGET_Clear, 400, 280, 50, 25, "Clear")
ButtonGadget(#GADGET_Load, 400, 335, 50, 25, "Load")
ButtonGadget(#GADGET_Save, 400, 365, 50, 25, "Save")
SetGadgetState(#GADGET_Brush, 1)
SetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Cursor, #PB_Cursor_Cross)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
Select EventGadget()
Case #GADGET_Canvas
X = GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_MouseX)
Y = GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_MouseY)
Type = EventType()
Select EventType()
Case #PB_EventType_LeftButtonDown
;
; This stores the current content of the CanvasGadget in #IMAGE_Content,
; so it can be re-drawn while the mouse moves
;
If StartDrawing(ImageOutput(#IMAGE_Content))
DrawImage(GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Image), 0, 0)
StopDrawing()
EndIf
StartX = X
StartY = Y
DrawAction(X, Y, EventType())
Case #PB_EventType_LeftButtonUp
DrawAction(X, Y, EventType())
Case #PB_EventType_MouseMove
If GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
DrawAction(X, Y, EventType())
EndIf
EndSelect
Case #GADGET_Color
CurrentColor = ColorRequester(CurrentColor)
If StartDrawing(ImageOutput(#IMAGE_Color))
Box(0, 0, 35, 35, CurrentColor)
StopDrawing()
SetGadgetAttribute(#GADGET_Color, #PB_Button_Image, ImageID(#IMAGE_Color))
EndIf
Case #GADGET_Brush, #GADGET_Line, #GADGET_Box, #GADGET_Circle, #GADGET_Fill
EventGadget = EventGadget()
For Gadget = #GADGET_Brush To #GADGET_Fill
If Gadget = EventGadget
SetGadgetState(Gadget, 1)
Else
SetGadgetState(Gadget, 0) ; unset the state of all other gadgets
EndIf
Next Gadget
CurrentMode = EventGadget
Case #GADGET_Clear
If StartDrawing(CanvasOutput(#GADGET_Canvas))
Box(0, 0, 380, 380, $FFFFFF)
StopDrawing()
EndIf
Case #GADGET_Load
File$ = OpenFileRequester("Load Image...", "", "JPEG Images|*.jpeg|All Files|*.*", 0)
If File$
If LoadImage(#IMAGE_LoadSave, File$)
If StartDrawing(CanvasOutput(#GADGET_Canvas))
Box(0, 0, 380, 380, $FFFFFF)
DrawImage(ImageID(#IMAGE_LoadSave), 0, 0)
StopDrawing()
EndIf
FreeImage(#IMAGE_LoadSave)
Else
MessageRequester("CanvasGadget", "Cannot load image: " + File$)
EndIf
EndIf
Case #GADGET_Save
File$ = SaveFileRequester("Save Image...", File$, "JPEG Images|*.jpeg|All Files|*.*", 0)
If File$ And (FileSize(File$) = -1 Or MessageRequester("CanvasGadget", "Overwrite this file? " + File$, #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes)
If CreateImage(#IMAGE_LoadSave, 380, 380, 24) And StartDrawing(ImageOutput(#IMAGE_LoadSave))
DrawImage(GetGadgetAttribute(#GADGET_Canvas, #PB_Canvas_Image), 0, 0)
StopDrawing()
If SaveImage(#IMAGE_LoadSave, File$, #PB_ImagePlugin_JPEG) = 0
MessageRequester("CanvasGadget", "Cannot save image: " + File$)
EndIf
FreeImage(#IMAGE_LoadSave)
EndIf
EndIf
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
Re: Demande conseil dessiner sélection 2D
Salut Bernie,
Non, c'est pas ça.
Sur Rad-Maker, j'aimerais que l'utilisateur puisse personnaliser la sélection sur le Canvas.
Merci à toi.
Non, c'est pas ça.
Sur Rad-Maker, j'aimerais que l'utilisateur puisse personnaliser la sélection sur le Canvas.
Merci à toi.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.
- microdevweb
- Messages : 1802
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
Re: Demande conseil dessiner sélection 2D
Juste un conseille, rien ne t'empêche d'utilisé les deux bibliothèques (ne pas les imbriqué c'est tout)
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège
Re: Demande conseil dessiner sélection 2D
Dac.
Alors j'ai fais ça, c'est un brouillon, ça marche mais c'est une usine à gaze pour rien.
De plus, je ne gère pas l’épaisseur des point ni leur espace ! (1 et 1 ici)
Il faut que suivant la largeur et la hauteur de la sélection, que celle-ci soit homogène et bien réglé, pour pas avoir
un point à coté de l'autre ou trop loin de l’autre...
Comment faire compliquer quand ont peu faire simple
Alors j'ai fais ça, c'est un brouillon, ça marche mais c'est une usine à gaze pour rien.
De plus, je ne gère pas l’épaisseur des point ni leur espace ! (1 et 1 ici)
Il faut que suivant la largeur et la hauteur de la sélection, que celle-ci soit homogène et bien réglé, pour pas avoir
un point à coté de l'autre ou trop loin de l’autre...
Comment faire compliquer quand ont peu faire simple

Code : Tout sélectionner
Enumeration 1
#Fenetre
EndEnumeration
Global ImageSelection = 99
CreateImage(ImageSelection, 800, 600, 32, #PB_Image_Transparent)
CopyImage(ImageSelection, ImageSelectionSave)
Procedure DrawSelection(Windows.i, Gadget.i, X.i, Y.i, Largeur.i, Hauteur.i, Couleur.i, Eppaisseur.i, Type.i)
StartDrawing(ImageOutput(ImageSelection))
; Eface l'image
DrawingMode(#PB_2DDrawing_AlphaBlend)
Box(0, 0, Largeur.i, Hauteur.i, RGBA(0, 0, 0, 0))
Reste1 = Largeur - ((Largeur / 2) * 2)
Debug Reste1
; Haut
If Reste1 <> 0
For I = 1 To Largeur Step 2
Box(I, 0, 1, 1, RGBA(255, 0, 0, 255))
Next
Else
For I = 0 To Largeur Step 2
Box(I, 0, 1, 1, RGBA(255, 0, 0, 255))
Next
EndIf
; Droite
If Reste1 <> 0
For I = 2 To Hauteur Step 2
Box(Largeur, I, 1, 1, RGBA(255, 0, 0, 255))
Next
Reste2 = (Hauteur - 2) - (((Hauteur - 2) / 2) * 2)
Else
For I = 0 To Hauteur Step 2
Box(Largeur, I, 1, 1, RGBA(255, 0, 0, 255))
Next
Reste2 = Hauteur - ((Hauteur / 2) * 2)
EndIf
Debug Reste2
; Bas
If Reste1 <> 0
If Reste2 <> 0
For I = Largeur - 1 To 0 Step - 2
Box(I, Hauteur, 1, 1, RGBA(255, 0, 0, 255))
Next
Reste3 = (Largeur - 1) - (((Largeur - 1) / 2) * 2)
Else
For I = Largeur - 2 To 0 Step - 2
Box(I, Hauteur, 1, 1, RGBA(255, 0, 0, 255))
Next
Reste3 = (Largeur - 2) - (((Largeur - 2) / 2) * 2)
EndIf
Else
If Reste2 <> 0
For I = Largeur - 1 To 0 Step - 2
Box(I, Hauteur, 1, 1, RGBA(255, 0, 0, 255))
Next
Reste3 = (Largeur - 1) - (((Largeur - 1) / 2) * 2)
Else
For I = Largeur - 2 To 0 Step - 2
Box(I, Hauteur, 1, 1, RGBA(255, 0, 0, 255))
Next
Reste3 = (Largeur - 2) - (((Largeur - 2) / 2) * 2)
EndIf
EndIf
Debug Reste3
; Gauche
If Reste1 <> 0
If Reste2 <> 0
If Reste3 <> 0
For I = Hauteur - 1 To 0 Step - 2
Box(0, I, 1, 1, RGBA(255, 0, 0, 255))
Next
Else
For I = Hauteur - 2 To 0 Step - 2
Box(0, I, 1, 1, RGBA(255, 0, 0, 255))
Next
EndIf
Else
If Reste3 <> 0
For I = Hauteur - 1 To 0 Step - 2
Box(0, I, 1, 1, RGBA(255, 0, 0, 255))
Next
Else
For I = Hauteur - 1 To 0 Step - 2
Box(0, I, 1, 1, RGBA(255, 0, 0, 255))
Next
EndIf
EndIf
Else
If Reste2 <> 0
If Reste3 <> 0
For I = Hauteur - 1 To 0 Step - 2
Box(0, I, 1, 1, RGBA(255, 0, 0, 255))
Next
Else
For I = Hauteur - 1 To 0 Step - 2
Box(0, I, 1, 1, RGBA(255, 0, 0, 255))
Next
EndIf
Else
If Reste3 <> 0
For I = Hauteur - 1 To 0 Step - 2
Box(0, I, 1, 1, RGBA(255, 0, 0, 255))
Next
Else
For I = Hauteur - 2 To 0 Step - 2
Box(0, I, 1, 1, RGBA(255, 0, 0, 255))
Next
EndIf
EndIf
EndIf
StopDrawing()
If IsWindow(Windows)
StartDrawing(WindowOutput(Windows))
ElseIf IsGadget(Gadget)
StartDrawing(CanvasOutput(Gadget))
EndIf
DrawAlphaImage(ImageID(ImageSelection), 0, 0, 255)
StopDrawing()
EndProcedure
Procedure Ma_Fenetre()
If OpenWindow(#Fenetre, 327, 177, 1000, 800, "Fenetre windows", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
CanvasGadget(#Fenetre + 1, 1, 1, 798, 598)
DrawSelection(-1, #Fenetre + 1, 10, 10, 99, 199, RGB(255, 0, 0), 10, 0)
Repeat ; D part des v nements de boucle
Event = WaitWindowEvent(1) ; Cette ligne attend pendent (Minuteur) qu'un v nement soit recus par la fen tre
Select Event
Case #PB_Event_Gadget
Select EventGadget
Case 0
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow ; Fin des v nements de boucle
EndIf
EndProcedure
Ma_Fenetre()
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.
Re: Demande conseil dessiner sélection 2D
Dans mes archive j'ai retrouver un code de Microdevweb qui permet de dessiner un rectangle et de le deplacer sur le canvas
Code : Tout sélectionner
;**********************************************************************************************************
; Author : MicordevWeb
; Name : EasyDraw
; Date : 2015/10/17
; Version: B 0.1
; Pb: 5.40 lst
;**********************************************************************************************************
EnableExplicit
UseSQLiteDatabase()
Enumeration
#Font
#MainForm
#MainMenu
#New
#Open
#Save
#SaveAs
#Close
#Exit
#PropertieForm
#SpW
#SpH
#BtSubmit
#BtChancel
#ScrollArea
#Canvas
#NewBox
#NewCircle
EndEnumeration
Enumeration
#ModeSelect
#MdNewBox
#MdNewCircle
EndEnumeration
Enumeration
#ObBox
#ObCircle
EndEnumeration
Structure Pos
X.d
Y.d
W.d
H.d
EndStructure
Global myPos.Pos,myOldPos.Pos,UL.Pos,UM.Pos,UR.Pos,
DL.Pos,DM.Pos,DR.Pos,LM.Pos,RM.Pos,newPos.Pos,
gDb,gMotherForm,gModeNew.b,gExt$,gDrawW,gDrawH,
gModeDraw=#ModeSelect,gMouseX,gMouseY,gClicOn.b=#False,
gImgTmp,gActiOn.b,gId=-1,gObj,gCurrentHandle$,gSelected
LoadFont(#Font,"Arial",12,#PB_Font_HighQuality)
Declare OpenDrawPropertie()
Declare CloseForm()
Declare ManageCanvas()
Declare DrawCanvas()
Procedure DbQuey(query$)
If DatabaseQuery(gDb,query$)=0
MessageRequester("DbQuey Error",DatabaseError())
ProcedureReturn #False
EndIf
ProcedureReturn #True
EndProcedure
Procedure DbUpdate(query$)
If DatabaseUpdate(gDb,query$)=0
MessageRequester("DbUpdate Error",DatabaseError())
ProcedureReturn #False
EndIf
ProcedureReturn #True
EndProcedure
Macro mAddTable(Table)
query$= "CREATE TABLE "+Table+"("
For N=0 To ArraySize(Column$(),1)
If N>0
query$+","
EndIf
query$+Column$(N,0)+" "+Column$(N,1)
Next
query$+")"
If Not DbUpdate(query$):End:EndIf
EndMacro
Procedure BuildMemorisDb()
gDb=OpenDatabase(#PB_Any,":memory:","","")
If gDb=0
MessageRequester("BuildMemorisDb Error","Can not open DataBase")
ProcedureReturn #False
EndIf
Protected query$,N
Dim Column$(7,1)
Column$(0,0)="id":Column$(1,0)="x":Column$(2,0)="y":Column$(3,0)="w":Column$(4,0)="h"
Column$(5,0)="fgcolor":Column$(6,0)="bgcolor":Column$(7,0)="filled"
Column$(0,1)="INTEGER PRIMARY KEY"
For N=1 To 7 :Column$(N,1)="INTEGER":Next
mAddTable("box")
mAddTable("circle")
EndProcedure
Procedure NewDraw()
gModeNew=#True
OpenDrawPropertie()
SetActiveGadget(#spW)
EndProcedure
Procedure OpenDraw()
EndProcedure
Procedure SaveDraw()
EndProcedure
Procedure SaveAsDraw()
EndProcedure
Procedure CloseDraw()
EndProcedure
Procedure Exit()
CloseDatabase(gDb)
End
EndProcedure
Procedure EventResize()
ManageCanvas()
EndProcedure
Procedure HoverToForm()
Protected query$
query$="SELECT * FROM box WHERE (X<="+Str(gMouseX)+" AND "+
"(X+W)>="+Str(gMouseX)+")"+
"AND (Y<="+Str(gMouseY)+" AND (Y+H)>="+Str(gMouseY)+")"
If Not DbQuey(query$):End:EndIf
gId=-1
If FirstDatabaseRow(gDb)
gId=GetDatabaseLong(gDb,0)
gObj=#ObBox
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure PreDrawBox()
gActiOn=#True
With myPos
\W=gMouseX-\X
\H=gMouseY-\Y
StartVectorDrawing(CanvasVectorOutput(#Canvas))
DrawVectorImage(ImageID(gImgTmp))
AddPathBox(\X,\Y,\W,\H)
VectorSourceColor(RGBA(211,211,211,255))
DotPath(2,4)
StopVectorDrawing()
EndWith
EndProcedure
Procedure AddBox()
Protected query$
query$="INSERT INTO box (x,y,w,h,fgcolor,bgcolor) VALUES ("
With myPos
query$+Str(\X)+","+Str(\Y)+","+Str(\W)+","+Str(\H)+","+
Str(RGBA(0,0,0,255))+","+Str(RGBA(0,0,0,255))+")"
If Not DbUpdate(query$) :End:EndIf
EndWith
gModeDraw=#ModeSelect
gActiOn=#False
DrawCanvas()
EndProcedure
Procedure DrawCanvas()
Protected query$
StartVectorDrawing(ImageVectorOutput(gImgTmp))
; Efface le dessin
AddPathBox(0,0,ImageWidth(gImgTmp),ImageHeight(gImgTmp))
VectorSourceColor(RGBA(255,255,255,255))
FillVectorOutput()
;{ Les box
query$="SELECT * FROM box"
If Not DbQuey(query$):End:EndIf
While NextDatabaseRow(gDb)
AddPathBox(GetDatabaseLong(gDb,1),GetDatabaseLong(gDb,2),GetDatabaseLong(gDb,3),GetDatabaseLong(gDb,4))
VectorSourceColor(GetDatabaseLong(gDb,5))
StrokePath(2)
Wend
FinishDatabaseQuery(gDb)
;}
StopVectorDrawing()
StartVectorDrawing(CanvasVectorOutput(#Canvas))
DrawVectorImage(ImageID(gImgTmp))
StopVectorDrawing()
EndProcedure
Procedure PreDrawEdit()
Protected X,Y,W,H,DepX,DepY
DepX=gMouseX-myPos\X
DepY=gMouseY-myPos\Y
Select gObj
Case #ObBox
gActiOn=#True
With myOldPos
Select gCurrentHandle$
Case ""
X=\X+DepX
Y=\Y+DepY
W=\W
H=\H
Case "UL"
X=\X+DepX
Y=\Y+DepY
W=\W-DepX
H=\H-DepY
Case "UR"
X=\X
Y=\Y+DepY
W=\W+DepX
H=\H-DepY
Case "UM"
X=\X
Y=\Y+DepY
W=\W
H=\H-DepY
Case "DL"
X=\X+DepX
Y=\Y
W=\W-DepX
H=\H+DepY
Case "DR"
X=\X
Y=\Y
W=\W+DepX
H=\H+DepY
Case "DM"
X=\X
Y=\Y
W=\W
H=\H+DepY
Case "LM"
X=\X+DepX
Y=\Y
W=\W-DepX
H=\H
Case "RM"
X=\X
Y=\Y
W=\W+DepX
H=\H
EndSelect
EndWith
EndSelect
StartVectorDrawing(CanvasVectorOutput(#Canvas))
DrawVectorImage(ImageID(gImgTmp))
AddPathBox(X,Y,W,H)
With newPos
\X=X
\Y=Y
\W=W
\H=H
EndWith
VectorSourceColor(RGBA(211,211,211,255))
DotPath(2,4)
StopVectorDrawing()
EndProcedure
Procedure DrawHandle()
Protected X,Y,W=8
StartVectorDrawing(ImageVectorOutput(gImgTmp))
With myOldPos
Select gObj
Case #ObBox
; Poignée Haut gauche
X=\X-(W/2)
Y=\Y-(W/2)
AddPathBox(X,Y,W,W)
UL\X=X
UL\Y=Y
UL\W=W
; Poignée Haut droite
X=(\X+\W)-(W/2)
Y=\Y-(W/2)
AddPathBox(X,Y,W,W)
UR\X=X
UR\Y=Y
UR\W=W
; Poignée bas gauche
X=\X-(W/2)
Y=(\Y+\H)-(W/2)
AddPathBox(X,Y,W,W)
DL\X=X
DL\Y=Y
DL\W=W
; Poignée Bas droite
X=(\X+\W)-(W/2)
Y=(\Y+\H)-(W/2)
AddPathBox(X,Y,W,W)
DR\X=X
DR\Y=Y
DR\W=W
; Poignée milieu gauche
X=\X-(W/2)
Y=(\Y+(\H/2))-(W/2)
AddPathBox(X,Y,W,W)
LM\X=X
LM\Y=Y
LM\W=W
; Poignée Milieu droite
X=(\X+\W)-(W/2)
Y=(\Y+(\H/2))-(W/2)
AddPathBox(X,Y,W,W)
RM\X=X
RM\Y=Y
RM\W=W
; Poignée Haut Milieu
X=(\X+(\W/2))-(W/2)
Y=\Y-(W/2)
AddPathBox(X,Y,W,W)
UM\X=X
UM\Y=Y
UM\W=W
; Poignée bas milieu
X=(\X+(\W/2))-(W/2)
Y=(\Y+\H)-(W/2)
AddPathBox(X,Y,W,W)
DM\X=X
DM\Y=Y
DM\W=W
VectorSourceColor(RGBA(105,105,105,255))
FillPath()
EndSelect
EndWith
StopVectorDrawing()
StartVectorDrawing(CanvasVectorOutput(#Canvas))
DrawVectorImage(ImageID(gImgTmp))
StopVectorDrawing()
EndProcedure
Procedure HoverHandle()
With UL
If (gMouseX>=\X And gMouseX<=(\X+\W)) And (gMouseY>=\Y And gMouseY<=(\Y+\W))
gCurrentHandle$="UL"
SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_LeftUpRightDown)
ProcedureReturn #True
EndIf
EndWith
With UM
If (gMouseX>=\X And gMouseX<=(\X+\W)) And (gMouseY>=\Y And gMouseY<=(\Y+\W))
gCurrentHandle$="UM"
SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_UpDown)
ProcedureReturn #True
EndIf
EndWith
With UR
If (gMouseX>=\X And gMouseX<=(\X+\W)) And (gMouseY>=\Y And gMouseY<=(\Y+\W))
gCurrentHandle$="UR"
SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_LeftDownRightUp)
ProcedureReturn #True
EndIf
EndWith
With DL
If (gMouseX>=\X And gMouseX<=(\X+\W)) And (gMouseY>=\Y And gMouseY<=(\Y+\W))
gCurrentHandle$="DL"
SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_LeftDownRightUp)
ProcedureReturn #True
EndIf
EndWith
With DM
If (gMouseX>=\X And gMouseX<=(\X+\W)) And (gMouseY>=\Y And gMouseY<=(\Y+\W))
gCurrentHandle$="DM"
SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_UpDown)
ProcedureReturn #True
EndIf
EndWith
With DR
If (gMouseX>=\X And gMouseX<=(\X+\W)) And (gMouseY>=\Y And gMouseY<=(\Y+\W))
gCurrentHandle$="DR"
SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_LeftUpRightDown)
ProcedureReturn #True
EndIf
EndWith
With LM
If (gMouseX>=\X And gMouseX<=(\X+\W)) And (gMouseY>=\Y And gMouseY<=(\Y+\W))
gCurrentHandle$="LM"
SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_LeftRight)
ProcedureReturn #True
EndIf
EndWith
With RM
If (gMouseX>=\X And gMouseX<=(\X+\W)) And (gMouseY>=\Y And gMouseY<=(\Y+\W))
gCurrentHandle$="RM"
SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_LeftRight)
ProcedureReturn #True
EndIf
EndWith
gCurrentHandle$=""
ProcedureReturn #False
EndProcedure
Procedure ChangePosition()
Protected query$
With newPos
Select gObj
Case #ObBox
query$="UPDATE box SET "+
"x="+Str(\X)+",y="+Str(\Y)+",w="+Str(\W)+",h="+Str(\H)
myOldPos\X=\X
myOldPos\Y=\Y
myOldPos\W=\W
myOldPos\H=\H
EndSelect
EndWith
If Not DbUpdate(query$):End:EndIf
DrawCanvas()
DrawHandle()
EndProcedure
Procedure EventCanvas()
Select EventType()
Case #PB_EventType_MouseMove
gMouseX=GetGadgetAttribute(#Canvas,#PB_Canvas_MouseX)
gMouseY=GetGadgetAttribute(#Canvas,#PB_Canvas_MouseY)
Select gModeDraw
Case #MdNewBox,#MdNewCircle
SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_Cross)
If gClicOn
PreDrawBox()
EndIf
Case #ModeSelect
If gId<>-1 And gClicOn
PreDrawEdit()
EndIf
If Not gClicOn
If HoverHandle()
ProcedureReturn
EndIf
If HoverToForm()
If gSelected
SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_Arrows)
Else
SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_Hand)
EndIf
ProcedureReturn
EndIf
SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_Default)
EndIf
EndSelect
Case #PB_EventType_LeftButtonDown
If Not gClicOn
myPos\X=gMouseX
myPos\Y=gMouseY
If gId<>-1
If gSelected=#True
gActiOn=#True
EndIf
Select gObj
Case #ObBox
myOldPos\X=GetDatabaseLong(gDb,1)
myOldPos\Y=GetDatabaseLong(gDb,2)
myOldPos\W=GetDatabaseLong(gDb,3)
myOldPos\H=GetDatabaseLong(gDb,4)
DrawHandle()
gSelected=#True
EndSelect
Else
gSelected=#False
DrawCanvas()
EndIf
EndIf
gClicOn=#True
Case #PB_EventType_LeftButtonUp
If gActiOn
Select gModeDraw
Case #MdNewBox
AddBox()
Case #ModeSelect
ChangePosition()
EndSelect
EndIf
gClicOn=#False
EndSelect
EndProcedure
Procedure ManageCanvas()
UseGadgetList(WindowID(#MainForm))
If gDrawW>WindowWidth(#MainForm) Or gDrawH>(WindowHeight(#MainForm)-MenuHeight())
If IsGadget(#ScrollArea)=0
ScrollAreaGadget(#ScrollArea,0,0,WindowWidth(#MainForm),(WindowHeight(#MainForm)-MenuHeight()),
gDrawW,gDrawH,10)
Else
ResizeGadget(#ScrollArea,#PB_Ignore,#PB_Ignore,WindowWidth(#MainForm),(WindowHeight(#MainForm)-MenuHeight()))
SetGadgetAttribute(#ScrollArea,#PB_ScrollArea_InnerWidth,gDrawW)
SetGadgetAttribute(#ScrollArea,#PB_ScrollArea_InnerHeight,gDrawH)
OpenGadgetList(#ScrollArea)
EndIf
Else
If IsGadget(#ScrollArea)<>0
FreeGadget(#ScrollArea)
EndIf
EndIf
If IsGadget(#Canvas)=0
CanvasGadget(#Canvas,0,0,gDrawW,gDrawH,#PB_Canvas_Keyboard)
gImgTmp=CreateImage(#PB_Any,gDrawW,gDrawH)
StartDrawing(ImageOutput(gImgTmp))
Box(0,0,ImageWidth(gImgTmp),ImageHeight(gImgTmp),$FFFFFF)
StopDrawing()
BindGadgetEvent(#Canvas,@EventCanvas())
Else
ResizeGadget(#Canvas,#PB_Ignore,#PB_Ignore,gDrawW,gDrawH)
ResizeImage(gImgTmp,gDrawW,gDrawH)
EndIf
If IsGadget(#ScrollArea)<>0
CloseGadgetList()
EndIf
EndProcedure
Procedure SavePropertie()
gDrawW=GetGadgetState(#spW)
gDrawH=GetGadgetState(#spH)
CloseForm()
ManageCanvas()
EndProcedure
Procedure CloseForm()
If gMotherForm<>-1
DisableWindow(gMotherForm,#False)
EndIf
CloseWindow(EventWindow())
EndProcedure
Procedure OpenDrawPropertie()
Protected title$
Protected M=10,X=M,Y=M,W=180,H=30
Protected WF=(W*1)+(M*2),HF=(H*5)+(M*4)
Protected Flag=#PB_Window_ScreenCentered|#PB_Window_SystemMenu
Protected tmp
gExt$=" pxl"
If gModeNew
title$="Nouveau document"
Else
title$="Propriété du document"
EndIf
gMotherForm=#MainForm
DisableWindow(gMotherForm,#True)
OpenWindow(#PropertieForm,0,0,WF,HF,title$,Flag,WindowID(#MainForm))
tmp=TextGadget(#PB_Any,X,Y,W,H,"Largeur:")
SetGadgetFont(tmp,FontID(#Font))
Y+H
SpinGadget(#spW,X,Y,W,H,0,2500,#PB_Spin_Numeric)
SetGadgetFont(#spW,FontID(#Font))
Y+H+M
tmp=TextGadget(#PB_Any,X,Y,W,H,"Hauteur:")
SetGadgetFont(tmp,FontID(#Font))
Y+H
SpinGadget(#spH,X,Y,W,H,0,2500,#PB_Spin_Numeric)
SetGadgetFont(#spH,FontID(#Font))
Y+H+M
W=(W/2)-M
ButtonGadget(#BtSubmit,X,Y,W,H,"Valider")
SetGadgetFont(#BtSubmit,FontID(#Font))
BindGadgetEvent(#BtSubmit,@SavePropertie())
X+W+M
ButtonGadget(#BtChancel,X,Y,W,H,"Annuler")
SetGadgetFont(#BtChancel,FontID(#Font))
BindGadgetEvent(#BtChancel,@CloseForm())
BindEvent(#PB_Event_CloseWindow,@CloseForm(),#PropertieForm)
EndProcedure
Procedure NewBox()
gActiOn=#False
gModeDraw=#MdNewBox
EndProcedure
Procedure OpenMainForm()
Protected Flag=#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_Maximize|#PB_Window_MaximizeGadget
Flag|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget
OpenWindow(#MainForm,0,0,800,600,"Easy Draw",Flag)
CreateMenu(#MainMenu,WindowID(#MainForm))
MenuTitle("Fichier")
MenuItem(#New,"Nouveau "+Chr(9)+"ALT N")
AddKeyboardShortcut(#MainForm,#PB_Shortcut_Alt|#PB_Shortcut_N,#New)
BindMenuEvent(#MainMenu,#New,@NewDraw())
MenuItem(#Open,"Ouvrir "+Chr(9)+"ALT O")
AddKeyboardShortcut(#MainForm,#PB_Shortcut_Alt|#PB_Shortcut_N,#Open)
BindMenuEvent(#MainMenu,#Open,@OpenDraw())
MenuItem(#Save,"Sauver "+Chr(9)+"CTRL S")
AddKeyboardShortcut(#MainForm,#PB_Shortcut_Control|#PB_Shortcut_N,#Save)
BindMenuEvent(#MainMenu,#Save,@SaveDraw())
MenuItem(#SaveAs,"Sauver sous ")
BindMenuEvent(#MainMenu,#SaveAs,@SaveAsDraw())
MenuItem(#Close,"Fermer ")
BindMenuEvent(#MainMenu,#Close,@CloseDraw())
MenuBar()
MenuItem(#Exit,"Quitter ")
BindMenuEvent(#MainMenu,#Exit,@Exit())
MenuTitle("Nouvelle forme")
MenuItem(#NewBox,"Rectangle "+Chr(9)+"ALT B")
AddKeyboardShortcut(#MainForm,#PB_Shortcut_Alt|#PB_Shortcut_B,#NewBox)
BindMenuEvent(#MainMenu,#NewBox,@NewBox())
BindEvent(#PB_Event_CloseWindow,@Exit(),#MainForm)
BindEvent(#PB_Event_SizeWindow,@EventResize(),#MainForm)
EndProcedure
BuildMemorisDb()
OpenMainForm()
gDrawW=WindowWidth(#MainForm)
gDrawH=WindowHeight(#MainForm)-MenuHeight()
ManageCanvas()
Global gEvent
Repeat:gEvent=WaitWindowEvent():ForEver
Re: Demande conseil dessiner sélection 2D
Belle exemple mais va être dure de comprendre le code
Bien que cet exemple va m’être utile plus tard pour mon Rad, ici non.
Merci Bernie, Micro.

Bien que cet exemple va m’être utile plus tard pour mon Rad, ici non.
Merci Bernie, Micro.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.
Re: Demande conseil dessiner sélection 2D
de rienShadow a écrit :Belle exemple mais va être dure de comprendre le code![]()
Bien que cet exemple va m’être utile plus tard pour mon Rad, ici non.
Merci Bernie, Micro.
- microdevweb
- Messages : 1802
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
Re: Demande conseil dessiner sélection 2D
Honnêtement Shadow, je comprend pas ton code 200 lgn pour afficher un rectangle? Que cherches tu réellement à faire?
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège
Re: Demande conseil dessiner sélection 2D
Une sélection que diable, une sélection, pour mon Rad !
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.
Re: Demande conseil dessiner sélection 2D
c'est ça que tu veux ?
Code : Tout sélectionner
Enumeration
#Fenetre =0
; gadgets
#Canvas = 0
EndEnumeration
Procedure UpdateDraw(Gad.i, X.i, Y.i, w.i, h.i)
If StartVectorDrawing(CanvasVectorOutput(Gad))
; Eface l'image
AddPathBox(0, 0, GadgetWidth(Gad),GadgetHeight(Gad))
VectorSourceColor(RGBA(0, 0, 0, 0))
FillPath()
; on dessine un fond si besoin
AddPathBox(0, 0, GadgetWidth(Gad),GadgetHeight(Gad))
VectorSourceColor(RGBA(180,180,180,255))
FillPath()
; on dessine des trucs (tes autres objets)
; puis on dessine le cadre sélection
AddPathBox(x, y, w, h)
VectorSourceColor(RGBA(255, 0, 0, 255))
DashPath(1,5)
StopVectorDrawing()
EndIf
EndProcedure
Procedure Ma_Fenetre()
If OpenWindow(#Fenetre, 0, 0, 1200, 800, "Fenetre windows", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
CanvasGadget(#Canvas, 0, 0, 800, 600)
UpdateDraw(#Canvas, 10, 10, 99, 199)
Repeat ; D part des v nements de boucle
Event = WaitWindowEvent(1) ; Cette ligne attend pendent (Minuteur) qu'un v nement soit recus par la fen tre
Select Event
Case #PB_Event_Gadget
Select EventGadget
Case 0
If EventType() = #PB_EventType_LeftButtonDown
x = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
y = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)
UpdateDraw(#CAnvas, x,y,0,0)
ElseIf (EventType() = #PB_EventType_MouseMove And
GetGadgetAttribute(#Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
x1 = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
y1 = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)
w = x1-x
h = y1-y
UpdateDraw(#Canvas, x,y,w,h)
EndIf
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow ; Fin des v nements de boucle
EndIf
EndProcedure
Ma_Fenetre()
http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Re: Demande conseil dessiner sélection 2D
Mais c'est magnifique ça blendman
Oui c'est ça que je veux !
Milles merci !
Edit, ha bha non en faite
C'était trop beau pour être vraie snif.
En faite c'est ça que je veux oui mais
je veux faire ça avec la bibliothèque classique 2D.
Pourquoi, dis-tu ?
Parce que le soucis avec la bibliothèque Vector
c'est qu’on peut pas faire 1 d’épaisseur
C'est flou sinon et j'aime pas ça et je veux pas ça.
C'est le seule soucis avec cette superbe lib pour moi.
Merci quand même

Oui c'est ça que je veux !
Milles merci !
Edit, ha bha non en faite

C'était trop beau pour être vraie snif.
En faite c'est ça que je veux oui mais
je veux faire ça avec la bibliothèque classique 2D.
Pourquoi, dis-tu ?
Parce que le soucis avec la bibliothèque Vector
c'est qu’on peut pas faire 1 d’épaisseur

C'est flou sinon et j'aime pas ça et je veux pas ça.
C'est le seule soucis avec cette superbe lib pour moi.
Merci quand même

Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.
Re: Demande conseil dessiner sélection 2D
Pour windows, tu as ça :
Sinon, tu peux utiliser la procédure UpdateDraw(Gad.i, X.i, Y.i, w.i, h.i) (fonctionne avec la lib 2D normal).
Code : Tout sélectionner
Enumeration
#Fenetre =0
; gadgets
#Canvas = 0
EndEnumeration
Procedure DrawSelector( Window,MouseX,MouseY,State=2,Pen =3,PenColor =$E2B256 )
; code by mestnyi
; changer le State pour voir les différent points tillés
Static .i lastX, lastY, MoveMouseX, MoveMouseY
Protected hDC
If State
hDC = StartDrawing(WindowOutput(Window))
If hDC
DrawingMode(#PB_2DDrawing_XOr|#PB_2DDrawing_Outlined)
SetBkMode_(hDC, #TRANSPARENT)
Protected hPen = CreatePen_(Pen, 0, PenColor);
Protected hPenold = SelectObject_(hDC, hPen) ;
Rectangle_(hDC, lastX, lastY, MoveMouseX, MoveMouseY)
lastX = MouseX :MoveMouseX = WindowMouseX(Window)
lastY = MouseY :MoveMouseY = WindowMouseY(Window)
Rectangle_(hDC, lastX, lastY, MoveMouseX, MoveMouseY)
StopDrawing()
ProcedureReturn State
EndIf
EndIf
EndProcedure
Procedure UpdateDraw(Gad.i, X.i, Y.i, w.i, h.i)
If StartDrawing(CanvasOutput(Gad))
; Eface l'image
; Box(0, 0, GadgetWidth(Gad),GadgetHeight(Gad), RGBA(0, 0, 0, 0))
; on dessine un fond si besoin
Box(0, 0, GadgetWidth(Gad),GadgetHeight(Gad),RGBA(180,180,180,255))
; on dessine des trucs (tes autres objets)
; puis on dessine le cadre sélection
DrawingMode(#PB_2DDrawing_Outlined|#PB_2DDrawing_AlphaBlend)
Box(x, y, w, h,RGBA(255, 0, 0, 255))
StopDrawing()
EndIf
EndProcedure
Procedure Ma_Fenetre()
If OpenWindow(#Fenetre, 0, 0, 1200, 800, "Fenetre windows", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
CanvasGadget(#Canvas, 0, 0, 800, 600)
; UpdateDraw(#Canvas, 10, 10, 99, 199)
Repeat ; D part des v nements de boucle
Event = WaitWindowEvent(1) ; Cette ligne attend pendent (Minuteur) qu'un v nement soit recus par la fen tre
Select Event
Case #PB_Event_Gadget
Select EventGadget
Case 0
If EventType() = #PB_EventType_LeftButtonDown
x = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
y = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)
;UpdateDraw(#CAnvas, x,y,0,0)
DrawSelector( #Fenetre,X,Y)
ElseIf (EventType() = #PB_EventType_MouseMove And
GetGadgetAttribute(#Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
x1 = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
y1 = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)
w = x1-x
h = y1-y
;UpdateDraw(#Canvas, x,y,w,h)
DrawSelector( #Fenetre,X,Y,1,2,RGB(255,0,0))
EndIf
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow ; Fin des v nements de boucle
EndIf
EndProcedure
Ma_Fenetre()
Sinon, tu peux utiliser la procédure UpdateDraw(Gad.i, X.i, Y.i, w.i, h.i) (fonctionne avec la lib 2D normal).
http://blendman.blogspot.com/
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Forum PB fr : http://www.purebasic.fr/french - Forum PB Eng : http://www.purebasic.fr/english
Re: Demande conseil dessiner sélection 2D
Merci blendman, mais ça ne me conviens pas non plus
J'vé essayer de faire ça en 2d classique pour avoir un max de contrôle sur la sélection.

J'vé essayer de faire ça en 2d classique pour avoir un max de contrôle sur la sélection.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.
Re: Demande conseil dessiner sélection 2D
Voilà le premier Jet, c'est opérationnel pour des petit points.
J'aimerais savoir comment optimiser un max la procédure sélection svp
Comment ferriez vous, vous ?
J'aimerais savoir comment optimiser un max la procédure sélection svp

Comment ferriez vous, vous ?
Code : Tout sélectionner
Procedure DrawSelection(X.i, Y.i, Largeur.i, Hauteur.i, Couleur.i, Eppaisseur.i, Type.i)
Reste1 = Largeur - ((Largeur / 2) * 2)
; Haut
For I = 0 To Largeur Step 2
Box(X + I, Y, 1, 1, RGBA(255, 0, 0, 255))
Next
; Droite
If Reste1 <> 0
For I = 1 To Hauteur Step 2
Box(X + Largeur, I + Y, 1, 1, RGBA(255, 0, 0, 255))
Next
Reste2 = Hauteur - ((Hauteur / 2) * 2)
Else
For I = 0 To Hauteur Step 2
Box(X + Largeur, I + Y, 1, 1, RGBA(255, 0, 0, 255))
Next
Reste2 = Hauteur - ((Hauteur / 2) * 2)
EndIf
; Bas
If Reste1 <> 0
If Reste2 <> 0
For I = Largeur - 2 To 0 Step - 2
Box(X + I, Hauteur + Y, 1, 1, RGBA(255, 0, 0, 255))
Next
Reste3 = (Largeur - 2) - (((Largeur - 2) / 2) * 2)
Else
For I = Largeur - 1 To 0 Step - 2
Box(X + I, Hauteur + Y, 1, 1, RGBA(255, 0, 0, 255))
Next
Reste3 = (Largeur - 1) - (((Largeur - 1) / 2) * 2)
EndIf
Else
If Reste2 <> 0
For I = Largeur - 1 To 0 Step - 2
Box(X + I, Hauteur + Y, 1, 1, RGBA(255, 0, 0, 255))
Next
Reste3 = (Largeur - 1) - (((Largeur - 1) / 2) * 2)
Else
For I = Largeur - 2 To 0 Step - 2
Box(X + I, Hauteur + Y, 1, 1, RGBA(255, 0, 0, 255))
Next
Reste3 = (Largeur - 2) - (((Largeur - 2) / 2) * 2)
EndIf
EndIf
; Gauche
If Reste1 <> 0
If Reste2 <> 0
If Reste3 <> 0
For I = Hauteur - 1 To 0 Step - 2
Box(X, I + Y, 1, 1, RGBA(255, 0, 0, 255))
Next
Else
For I = Hauteur - 2 To 0 Step - 2
Box(X, I + Y, 1, 1, RGBA(255, 0, 0, 255))
Next
EndIf
Else
If Reste3 <> 0
For I = Hauteur - 1 To 0 Step - 2
Box(X, I + Y, 1, 1, RGBA(255, 0, 0, 255))
Next
Else
For I = Hauteur - 2 To 0 Step - 2
Box(X, I + Y, 1, 1, RGBA(255, 0, 0, 255))
Next
EndIf
EndIf
Else
If Reste2 <> 0
For I = Hauteur - 1 To 0 Step - 2
Box(X, I + Y, 1, 1, RGBA(255, 0, 0, 255))
Next
Else
If Reste3 <> 0
For I = Hauteur - 1 To 0 Step - 2
Box(X, I + Y, 1, 1, RGBA(255, 0, 0, 255))
Next
Else
For I = Hauteur - 2 To 0 Step - 2
Box(X, I + Y, 1, 1, RGBA(255, 0, 0, 255))
Next
EndIf
EndIf
EndIf
EndProcedure
Enumeration
#Fenetre
#Canvas
EndEnumeration
Procedure Ma_Fenetre()
If OpenWindow(#Fenetre, 0, 0, 1200, 800, "Fenetre windows", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
CanvasGadget(#Canvas, 0, 0, 800, 600)
Repeat
Event = WaitWindowEvent(1)
EventGadget = EventGadget()
Select Event
Case #PB_Event_Gadget
Select EventGadget
Case #Canvas
If EventType() = #PB_EventType_LeftButtonDown
X.i = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
Y.i = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)
ElseIf (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(#Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
x1 = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
y1 = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)
Largeur.i = x1-x
Hauteur.i = y1-y
Couleur.i = RGB(255, 0, 0)
StartDrawing(CanvasOutput(#Canvas))
Box(0, 0, GadgetWidth(#Canvas), GadgetHeight(#Canvas), RGB(255, 255, 255))
DrawSelection(X.i-2, Y.i-2, Largeur.i, Hauteur.i, Couleur.i, Eppaisseur.i, Type.i)
StopDrawing()
EndIf
Default
Debug EventGadget
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
EndProcedure
Ma_Fenetre()
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.