j'ai pas encore regarder ton dernier code, je vais le faire en attendant ...
j t'en ai fais un à l'arrache, car avec drawalphaimage c'est difficle..
je suis reparti de mon truc de dessin canvas, mais j'ai encore quelque saut de coordonnées.
mais si cela peut t'aider et si tu trouve mes erreurs pour les ptits sauts ce serais cool...
je n'ai pas géré le clavier pour le moment par urgent, tu déplace avec le clic droit et pour le dessin clic gauche
j'ai aussi un soucis de coupe d'image déjà vu dans les remarques du dernier post.. j' travail
peut être le scrollarea et sa zone interne dans le resize couplé avec le canvas et ensemble,
j'ai peut être des soucis pour comprendre comment il cohabite.
peut être aussi, que l'on est dans la partie mémoire écran de Windows qui se gère en API BLTBlK
pas évident de le faire sans Api..
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
#Image2
#Scroll
#canvas
#Imagegadget0
#Imagegadget1
#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
image_Lg=800
image_Ht=800
Window_Lg=800
Window_Ht=800
CreateImage(#Image0,image_Lg,image_Ht, 24)
CreateImage(#Image1,image_Lg,image_Ht, 24)
CreateImage(#Image2,image_Lg,image_Ht, 24)
If OpenWindow(#Window, 0, 0,Window_Lg,Window_Ht,titre$, #PB_Window_SystemMenu | #PB_Window_ScreenCentered| #PB_Window_MinimizeGadget | #PB_Window_SizeGadget)
ScrollAreaGadget(#Scroll, 0, 0, Window_Lg,Window_Ht, image_Lg,image_Ht, 30)
CanvasGadget(#canvas,-800,800,image_Lg*2,image_Ht*2,#PB_Canvas_DrawFocus| #PB_Canvas_GrabMouse|#PB_Canvas_Keyboard)
SetWindowColor(#Window,#White)
SetGadgetColor(#Scroll,#PB_Gadget_BackColor,#White)
SetGadgetAttribute(#Scroll,#PB_ScrollArea_X,200)
SetGadgetAttribute(#Scroll,#PB_ScrollArea_Y,200)
ImageGadget(#Imagegadget0,0,0,image_Lg,image_Ht,ImageID(#Image0))
ImageGadget(#Imagegadget1,0,0,image_Lg,image_Ht,ImageID(#Image1))
LoadImage(#Image0, "c:\purebasic\examples\sources\data\Geebee2.bmp")
ResizeImage(#Image0,800,800,#PB_Image_Smooth)
CopyImage(#Image0,#Image2)
StartDrawing(CanvasOutput(#canvas))
Box(-ImageWidth(#Image0),-ImageHeight(#Image0),ImageWidth(#Image0)*2,ImageHeight(#Image0)*2,RGB(255,255,255))
DrawAlphaImage(ImageID(#Image0),0,0)
StopDrawing()
bm=#False
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()
If (GetGadgetAttribute(#canvas, #PB_Canvas_MouseX)<>0 And GetGadgetAttribute(#canvas, #PB_Canvas_MouseY)<>0)
X = GetGadgetAttribute(#canvas, #PB_Canvas_MouseX)
Y = GetGadgetAttribute(#canvas, #PB_Canvas_MouseY)
EndIf
StartDrawing(CanvasOutput(#canvas))
;############################### zone deux clics######################################
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
delta=0
ThickLineXY(DepartX, DepartY, x, y, 25, lColor,1)
;LineXY(DepartX, DepartY, x, y, color) ; ligne simple
FinX=x:FinY=y:ck=0
EndIf
If menu=2
delta=0
ThickLineXY(DepartX, DepartY, x, y, 20, lColor,0)
FinX=x:FinY=y:ck=0
EndIf
If menu=3
delta=0
Ellipse(DepartX, DepartY, rx, ry, color)
FinX=x:FinY=y:ck=1
EndIf
If menu=4
elipse(DepartX,DepartY,x-DepartX,y-DepartY,r1,r2,a1,a2,16,lcolor,0)
FinX=x:FinY=y:ck=1
EndIf
If menu=5
elipse(DepartX,DepartY,x-DepartX,y-DepartY,r1,r2,a1,a2,25,lcolor,1)
FinX=x:FinY=y:ck=1
EndIf
If menu=6
Box(DepartX, DepartY,x-DepartX,y-DepartY,color)
FinX=x:FinY=y:ck=1
EndIf
EndIf
EndIf
;############################### zone simple clic #######################################
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_MouseMove
If bm=#True ; mode deplacement
PosXm1 = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm
PosYm1 = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm
DrawingMode(#PB_2DDrawing_Default )
Box(-ImageWidth(#Image0),-ImageHeight(#Image0),ImageWidth(#Image0)*2,ImageHeight(#Image0)*2,RGB(255,255,255))
DrawImage(ImageID(#Image0),PosXm1+(delta/2),PosYm1+(delta/2),ImageWidth(#Image0)-delta,ImageHeight(#Image0)-delta)
EndIf
EndIf
If EventType() = #PB_EventType_MouseWheel
delta=delta+(GetGadgetAttribute(#canvas,#PB_Canvas_WheelDelta )*10) ; delta*10
DrawingMode(#PB_2DDrawing_Default )
Box(-ImageWidth(#Image0),-ImageHeight(#Image0),ImageWidth(#Image0)*2,ImageHeight(#Image0)*2,RGB(255,255,255))
DrawImage(ImageID(#Image0),PosXm1+(delta/2),PosYm1+(delta/2),ImageWidth(#Image0)-delta,ImageHeight(#Image0)-delta)
EndIf
If EventType() = #PB_EventType_RightButtonUp ; fin clic droit
bm=#False
If menu=1 Or menu=2
If delta=0
PosXm1+ (PosXm-X)
PosYm1+ (PosYm-Y)
delta=1
EndIf
EndIf
If menu>2
If delta=0
PosXm+ (PosXm1-x)
PosYm+ (PosYm1-y)
delta=1
EndIf
EndIf
EndIf
;###########################################################################################
; If EventType() = #PB_EventType_LeftButtonUp ; fin clic gauche
; bm=#False
; EndIf
;###########################################################################################
If EventType() = #PB_EventType_RightButtonDown And Clic_Gauche=#True
delta=0
Clic_Gauche=#False ; annule fin du dessin en cours
bm=#False
DrawImage(ImageID(#Image1),0,0) ; restore le dessin precedent
FinX=0:FinY=0 ; remise à zero pour test fin ligne
EndIf
If EventType() = #PB_EventType_RightButtonDown ; option clic droit
If menu>2
PosXm1=GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-X
PosYm1=GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-Y
EndIf
bm=#True ; clic droit deplacement image
PosXm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm1
PosYm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm1
EndIf
;###########################################################################################
;If EventType() = #PB_EventType_LeftButtonDown ; option clic gauche
; bm=#True ; clic gauche deplacement image
; PosXm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm1
; PosYm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm1
;EndIf
;###########################################################################################
StopDrawing()
SetActiveGadget(#canvas) ; focus Canvas : MouseWheel
Select EventType()
Case #PB_EventType_LeftButtonUp
If (FinX=0 And FinY=0)
If bm=#False
delta=0
EndIf
If StartDrawing(ImageOutput(#Image0))
DrawImage(GetGadgetAttribute(#canvas,#PB_Canvas_Image),0,0) ;fixe le dessin
StopDrawing()
EndIf
EndIf
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/4)
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),WindowHeight(#Window)-20) ; -20 = scroll horizontal et menu
SetGadgetColor(#Scroll,#PB_Gadget_BackColor,#Gray)
ResizeGadget(#Canvas,0,0,ImageWidth(#Image0)*2,ImageHeight(#Image0)*2)
; SetGadgetColor(#canvas,#PB_Gadget_BackColor,#White)
Case #PB_Event_CloseWindow
quit=1
EndSelect
Until quit
EndIf