Canvas ScrollArea dessin mode tablette.
Publié : mer. 29/juin/2011 9:06
bonjour à Tous
voilà, un ptit essai de dessin à la souris Canvas avec le bouton non pressé pendant le dessin, comme sur les tablettes digit.
j'avais déjà fais un truc dans le genre sans Canvas,
Alors, je me suis amuser à le refaire avec CanvasGadget.
j'en profite pour remercier Fred et son Team pour CanvasGadget, Car c'est absolument génial.
Cordialement
voilà, un ptit essai de dessin à la souris Canvas avec le bouton non pressé pendant le dessin, comme sur les tablettes digit.
j'avais déjà fais un truc dans le genre sans Canvas,
Alors, je me suis amuser à le refaire avec CanvasGadget.
j'en profite pour remercier Fred et son Team pour CanvasGadget, Car c'est absolument génial.
Cordialement
Code : Tout sélectionner
;###################################################################
;#### kernadec juin 2011 Forum français ver 4.60 b3
;#### exemple canvas de dessin avec souris bouton Gauche relaché
;#### et bouton droit annule
;###################################################################
Enumeration
#Window
#Image0
#Image1
#Scroll
#canvas
#menu0
#menu1
#menu2
#menu3
#menu4
#menu5
#menu6
#menu7
#menu8
EndEnumeration
Procedure ThickLineXY(X1.i, Y1.i, X2.i, Y2.i, Thickness.i, Color.i,rand.i)
; Procedure épaisseur de : STARGATE forum Purebasic Allemand
Protected Length.i = Sqr((X2-X1)*(X2-X1)+(Y2-Y1)*(Y2-Y1))
Protected I, DeltaX.i, DeltaY.i
If Length = 0
Circle(X1, Y1, Thickness/2, Color)
Else
For I = 0 To Length
DeltaX = (X2-X1)*I/Length
DeltaY = (Y2-Y1)*I/Length
If rand=0
Circle(X1+DeltaX, Y1+DeltaY,Thickness/2, Color)
Else
Circle(X1+DeltaX, Y1+DeltaY, Random(Thickness/2), Color)
EndIf
Next
EndIf
EndProcedure
Procedure elipse(x0,y0,x1,y1,r1,r2,a1,a2,Thickness,color,rand.i)
For i=0 To 359
r3=(Sqr(Pow(x1,2)+Pow(y1,2)))
x2.i=x0+r3*Cos(Radian(i))
y2.i=y0+r3*Sin(Radian(i))
If rand=0
Circle(X2,Y2,Thickness/2,Color)
Else
Circle(X2,Y2,Random(Thickness/2),Color)
EndIf
Next i
EndProcedure
titre$="CanvasGadget"
menu=2 ; menu defaut
CreateImage(#Image0, 2000, 2000, 24)
CreateImage(#Image1, 2000, 2000, 24)
; info doc : La taille des images est actuellement limitée à 8192x8192 pixels (si la mémoire disponible le permet)
If OpenWindow(#Window, 0, 0,650,600,titre$, #PB_Window_SystemMenu | #PB_Window_ScreenCentered| #PB_Window_MinimizeGadget | #PB_Window_SizeGadget)
ScrollAreaGadget(#Scroll, 50, 0, 600,600, 2000, 2000, 30)
CanvasGadget(#canvas, 0, 0, 2000, 2000, #PB_Canvas_ClipMouse)
SetWindowColor(#Window,#White)
SetGadgetColor(#Scroll,#PB_Gadget_BackColor,#White)
SetGadgetAttribute(#Scroll,#PB_ScrollArea_X,600)
SetGadgetAttribute(#Scroll,#PB_ScrollArea_Y,500)
If CreateMenu(#menu0, WindowID(0))
MenuTitle("Choix")
MenuItem(#menu1, "Ligne Thick Rand")
MenuItem(#menu2, "Ligne Thick")
MenuItem(#menu3, "Cercle")
MenuItem(#menu4, "Cercle vide")
MenuItem(#menu5, "Cercle vide Rand")
MenuItem(#menu6, "Box")
MenuItem(#menu7, "Point")
MenuItem(#menu8, "Point rand")
EndIf
Repeat
event=WaitWindowEvent()
X = GetGadgetAttribute(#canvas, #PB_Canvas_MouseX)
Y = GetGadgetAttribute(#canvas, #PB_Canvas_MouseY)
StartDrawing(CanvasOutput(#canvas))
If Clic_Gauche=#True
If EventType() = #PB_EventType_MouseMove
DrawImage(ImageID(#Image0), 0, 0)
DrawingMode(#PB_2DDrawing_AlphaBlend) ; transparence avec couleur RGBA
; calcul des distances pixels entre DepartX,DepartY du debut et X,Y actuel = taille de l'élipse
If x > DepartX:rx = x - DepartX:Else:rx = DepartX - x:EndIf
If y > DepartY:ry = y - DepartY:Else:ry = DepartY - y:EndIf
If menu=1
ThickLineXY(DepartX, DepartY, x, y, 25, lColor,1)
;LineXY(DepartX, DepartY, x, y, color) ; ligne simple
FinX=x:FinY=y
EndIf
If menu=2
ThickLineXY(DepartX, DepartY, x, y, 20, lColor,0)
FinX=x:FinY=y
EndIf
If menu=3
Ellipse(DepartX, DepartY, rx, ry, color)
FinX=x:FinY=y
EndIf
If menu=4
elipse(DepartX,DepartY,x-DepartX,y-DepartY,r1,r2,a1,a2,16,lcolor,0)
FinX=x:FinY=y
EndIf
If menu=5
elipse(DepartX,DepartY,x-DepartX,y-DepartY,r1,r2,a1,a2,25,lcolor,1)
FinX=x:FinY=y
EndIf
If menu=6
Box(DepartX, DepartY,x-DepartX,y-DepartY,color)
FinX=x:FinY=y
EndIf
EndIf
EndIf
If (FinX=0 And FinY=0) ; mode clic gauche appuyé
If EventType() = #PB_EventType_MouseMove
DrawingMode(#PB_2DDrawing_AlphaBlend)
Clic_Gauche=#False
If GetGadgetAttribute(#Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
If menu=7
Circle(X,Y, 5, lcolor)
EndIf
If menu=8
Circle(X,Y,Random(20), lcolor)
EndIf
EndIf
EndIf
FinX=0:FinY=0
EndIf
If EventType() = #PB_EventType_RightButtonDown And Clic_Gauche=#True
Clic_Gauche=#False ; annule fin du dessin en cours
DrawImage(ImageID(#Image1),0,0) ; restore le dessin precedent
FinX=0:FinY=0 ; remise à zero pour test fin ligne
EndIf
StopDrawing()
Select EventType()
Case #PB_EventType_LeftButtonDown
If StartDrawing(ImageOutput(#Image0))
DrawImage(GetGadgetAttribute(#canvas,#PB_Canvas_Image),0,0) ;fixe le dessin
StopDrawing()
EndIf
If Clic_Gauche=#False ; valide la fin du dessin avec le click gauche = 0
Clic_Gauche=#True ; debut du dessin avec le click gauche = 1
color= RGBA(Random(255), Random(255),Random(255),150) ; couleur aléatoire
lcolor= RGBA(Random(255), Random(255),Random(255),150/6)
titre$="CanvasGadget Color="+Str(Red(color))+"|"+Str(Green(color))+"|"+Str(Blue(color))+"|"+Str(Alpha(color))+" /6= "+Str(Alpha(lcolor))
SetWindowTitle(0,titre$)
CopyImage(#Image0,#Image1) ; copie Image pour eventuelle annulation
Else
Clic_Gauche=#False ; valide la fin du dessin avec le click gauche = 0
EndIf
DepartX = X ; coordonnée DepartX Clic_Gauche
DepartY = Y ; coordonnée DepartY Clic_Gauche
If menu=1 Or menu=2
If (FinX<>0 And FinY<>0)
Clic_Gauche=#True ; reactive le clic_Gauche pour ligne suivante
CopyImage(#Image0,#Image1) ; copie Image pour eventuelle annulation
DepartX = FinX ; transfert dernier clic_Gauche FinX vers DepartX suivant mode line chainée
DepartY = FinY ; transfert dernier clic_Gauche FinY vers DepartY suivant
EndIf
EndIf
EndSelect
Select event
Case #PB_Event_Menu
Select EventMenu()
Case #menu1: menu=1:FinX=0:FinY=0 ;FinX=0:FinY=0 mis à zero = choix clic (1 ou 2)
Case #menu2: menu=2:FinX=0:FinY=0
Case #menu3: menu=3:FinX=0:FinY=0
Case #menu4: menu=4:FinX=0:FinY=0
Case #menu5: menu=5:FinX=0:FinY=0
Case #menu6: menu=6:FinX=0:FinY=0
Case #menu7: menu=7:FinX=0:FinY=0
Case #menu8: menu=8:FinX=0:FinY=0
EndSelect
Case #PB_Event_SizeWindow ; redimensione le scroll avec la fenetre
ResizeGadget(#Scroll,#PB_Ignore,#PB_Ignore,WindowWidth(#Window)-50,WindowHeight(#Window)-20) ; -20 = scroll horizontal et menu
SetGadgetColor(#Scroll,#PB_Gadget_BackColor,#White)
Case #PB_Event_CloseWindow
quit=1
EndSelect
Until quit
EndIf