Zoom et clic soucis (résolu) & Zoom Canvas

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Zoom et clic soucis (résolu) & Zoom Canvas

Message par kernadec »

bonjour
j'aurais aimé me faire un code de ce genre avec Canvasgadget
mais voilà, je n'y suis pas arrivé..
peut être pas tout compris de ce gadget...et comment utiliser ReziseGadget avec CanvasGadget
sinon des commandes "CanvasGadget_ScaleX et Y" seraient bienvenues.

Car je n'ai pas vraiment trouvé comment régler le problème du clic gauche dans ce code avec " EventType( ) #PB_EventType_LeftClick"
car celui-ci n'as pas de contraire pour lui interdire de fonctionner sous certaines conditions.

Alors, Quand on utilisent les ascenseurs après un déplacement de l'image avec le clic gauche, les soucis commence..
donc... j'ai mis un test à l'arrache..
si quelqu'un à une meilleur solution, je suis preneur..

Cordialement

Code : Tout sélectionner

;####################################################################
;###    image   Zoom  scroll  deplacer l'image avec  mouse        ###
;###            par kernadec  mai 2011                            ###
;####################################################################

Procedure.w MouseWheelDelta()
  xxw.w = ((EventwParam()>>16)&$FFFF)
  ProcedureReturn -(xxw / 100)
EndProcedure
win_w=700
win_h=700
image_w.l=1000
image_h.l=1000

ExamineDesktops()
CreateImage(0,image_w+DesktopWidth(0),image_h+DesktopHeight(0))
CreateImage(1,image_w+DesktopWidth(0),image_h+DesktopHeight(0))

LoadImage(0, "c:\purebasic\examples\sources\data\Geebee2.bmp") 
ResizeImage(0,image_w,image_h,#PB_Image_Smooth)
CopyImage(0,1)

OpenWindow(0,0, 0, win_w, win_h, "Zoom ScrollArea clic deplace  Kernadec", #WS_SYSMENU | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget)
ScrollAreaGadget(2, 0, 0,WindowWidth(0),WindowHeight(0),image_w,image_h, 30)
SetWindowColor(0,#White) 
SetGadgetColor(2,#PB_Gadget_BackColor,#White)
SetGadgetAttribute(2,#PB_ScrollArea_X,(image_w-win_w)/2)
SetGadgetAttribute(2,#PB_ScrollArea_Y,(image_h-win_h)/2)
ImageGadget(0,0,0,image_w,image_h,ImageID(0))
ImageGadget(1,0,0,image_w,image_h,ImageID(1))
bm=#False
Repeat
  Event= WaitWindowEvent()
  If WindowMouseX(0)>win_w-30 Or WindowMouseY(0)>win_h-30 ; manque constante " #PB_EventType_LeftClick_NO "
    bm=#False                                      
  EndIf 
  Select event
    Case #PB_Event_SizeWindow
      ResizeGadget(2,#PB_Ignore,#PB_Ignore,WindowWidth(0),WindowHeight(0))
      SetGadgetColor(2,#PB_Gadget_BackColor,#White)
      win_w=WindowWidth(0)
      win_h=WindowHeight(0)
    Case #PB_Event_Gadget
      If EventGadget()=0  ; <<<<<<<<<<<<<<<< ici
        Select EventType()                ;select #PB_EventType_LeftClick exemple du Soldat inconnu
          Case #PB_EventType_LeftClick 
            bm=#True  
            PosXm = WindowMouseX(0)-PosXm1
            PosYm = WindowMouseY(0)-PosYm1
        EndSelect
      EndIf
    Case  #WM_MOUSEWHEEL
      wheel_x=wheel_x+(MouseWheelDelta() *10)
      wheel_y=wheel_y+(MouseWheelDelta() *10)
    Case #WM_RBUTTONDOWN
      bm=#True
      PosXm = WindowMouseX(0)-PosXm1
      PosYm = WindowMouseY(0)-PosYm1
    Case #WM_MOUSEMOVE
      If bm=#True
        PosXm1 = WindowMouseX(0)-PosXm
        PosYm1 = WindowMouseY(0)-PosYm
      EndIf 
    Case #WM_LBUTTONUP
      bm=#False  
    Case #WM_RBUTTONUP   
      bm=#False  
  EndSelect  
  StartDrawing( ImageOutput(1) );
  Box(-20,-20,WindowWidth(0)*2,WindowHeight(0)*2,RGB(255,255,255))
  DrawImage(ImageID(0),PosXm1-(wheel_x/2),PosYm1-(wheel_y/2),(image_w)+wheel_x,(image_h)+wheel_y)
  StopDrawing()
  SetGadgetState(1,ImageID(1))
Until Event= #PB_Event_CloseWindow
End
Dernière modification par kernadec le jeu. 07/juil./2011 2:19, modifié 4 fois.
zaphod
Messages : 135
Inscription : dim. 07/déc./2008 9:32

Re: Zoom et clic soucis

Message par zaphod »

...
Dernière modification par zaphod le dim. 27/mai/2012 7:32, modifié 1 fois.
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Zoom et clic soucis (résolu)

Message par kernadec »

bonsoir et merci zaphod pour l'astuce,
il restait encore un résidu de colle, alors j'ai rajouté le mon test merdique..
et avec les deux c'est pas mal, cela ne colle plus au curseur.
je suis satisfait... Je vais pouvoir adapter ce bout de code à mon projet
je travail sur une forme d'astrolabe perso...
1er code est mis à jour.
Cordialement
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Zoom et clic soucis (résolu)

Message par blendman »

super ces codes :-)
Il y a moyen d'avoir un zoom plus pixelisé ?
Oui, c'est bizarre, c'est pour mieux voir les pixels en fait :).

Mais sinon, super code, je vais m'en servir, c'est sûr.
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Zoom et clic soucis (résolu)

Message par kernadec »

bonsoir
@blendman je suis content que cela te convienne.
Alors voilà le même Zoom avec CanvasGadget.
avec le concours d' Atomo qui m'as aidé pour Canvas mousewheel
avec DrawAlphaImage dans le zoom
ajout d'un test image pour éviter bug parfois dans grand zoom wheel trop rapide
Cordialement

Code : Tout sélectionner

;####################################################################
;###    image   Zoom  scroll canvas deplacement de l'image        ###
;###      avec la mouse  et gestion zoom de l'alpha               ###
;###            par kernadec  jullet 2011  Ver:  PB 4.60 b3       ###
;####################################################################
Enumeration
  #Window
  #Image0  
  #Image1 
  #Scroll
  #canvas
EndEnumeration
win_w=600 
win_h=600 
image_w.l=800 
image_h.l=800 

ExamineDesktops()
CreateImage(#Image0,image_w+DesktopWidth(0),image_h+DesktopHeight(0))
CreateImage(#Image1,image_w+DesktopWidth(0),image_h+DesktopHeight(0))

LoadImage(#Image0, "c:\purebasic\examples\sources\data\Geebee2.bmp") 
ResizeImage(#Image0,image_w,image_h,#PB_Image_Smooth)       

CopyImage(#Image0,#Image1)               ;  crée une copie de l'image pour eviter la degradation de resize

OpenWindow(#Window,0, 0,win_w,win_h, "Zoom Canvas ScrollArea clic deplace  Kernadec", #WS_SYSMENU | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget)
ScrollAreaGadget(#Scroll, 0, 0,WindowWidth(#Window),WindowHeight(#Window),ImageWidth(#Image0),ImageHeight(#Image0),30)
SetWindowColor(#Window,#White) 
CanvasGadget(#canvas, 0, 0,ImageWidth(#Image0),ImageHeight(#Image0),#PB_Canvas_DrawFocus|#PB_Canvas_GrabMouse|#PB_Canvas_Keyboard)
SetGadgetAttribute(#Scroll,#PB_ScrollArea_X,(ImageWidth(#Image0)-WindowWidth(#Window))/2)
SetGadgetAttribute(#Scroll,#PB_ScrollArea_Y,(ImageHeight(#Image0)-WindowHeight(#Window))/2)
bm=#False

StartDrawing(CanvasOutput(#canvas))
Box(-20,-20,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
DrawAlphaImage(ImageID(#Image0),0,0,150)
StopDrawing()

Repeat
  Event= WaitWindowEvent()
  SetActiveGadget(#canvas)             ; focus Canvas : MouseWheel      
  Select EventType()  
    Case #PB_EventType_MouseWheel  
      
      delta=delta+(GetGadgetAttribute(#canvas,#PB_Canvas_WheelDelta )*10) ; delta*10
      CopyImage(#Image1,#Image0)      ; restore l'image originale                         
      ResizeImage(#Image0,(ImageWidth(#Image0)-delta),(ImageHeight(#Image0)-delta),#PB_Image_Smooth)   
      StartDrawing(CanvasOutput(#canvas))
      Box(-20,-20,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
      If IsImage(#Image0)             ; test image pour eviter bug
        DrawAlphaImage(ImageID(#Image0),PosXm1+(delta/2),PosYm1+(delta/2),150)
      EndIf  
      StopDrawing()
      
    Case #PB_EventType_RightButtonDown ; choix du bouton deplacer
      bm=#True
      PosXm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm1
      PosYm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm1
      
    Case #PB_EventType_LeftButtonDown  ; choix du bouton deplacer
      bm=#True
      PosXm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm1
      PosYm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm1  
      
    Case #PB_EventType_MouseMove       ; deplacement
      If bm=#True
        PosXm1 = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm
        PosYm1 = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm
      EndIf
      CopyImage(#Image1,#Image0)      ; Restore l'image originale  
      ResizeImage(#Image0,(ImageWidth(#Image0)-delta),(ImageHeight(#Image0)-delta),#PB_Image_Smooth)   
      StartDrawing(CanvasOutput(#canvas))
      Box(-20,-20,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
      If IsImage(#Image0)             ; test image pour eviter bug
        DrawAlphaImage(ImageID(#Image0),PosXm1+(delta/2),PosYm1+(delta/2),150)
      EndIf
      StopDrawing() 
      
    Case #PB_EventType_LeftButtonUp
      bm=#False  
      
    Case #PB_EventType_RightButtonUp    
      bm=#False
  EndSelect  
  
  Select event
    Case #PB_Event_SizeWindow
      ResizeGadget(#Scroll,#PB_Ignore,#PB_Ignore,WindowWidth(#Window),WindowHeight(#Window))
      win_w=WindowWidth(#Window)
      win_h=WindowHeight(#Window)
  EndSelect  
  
Until Event= #PB_Event_CloseWindow

Dernière modification par kernadec le jeu. 07/juil./2011 21:56, modifié 6 fois.
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Zoom et clic soucis (résolu) & Zoom Canvas

Message par blendman »

J'ai regardé ce code et j'ai trouvé pour le zoom non smoothé :)

Mais par contre, là, vous n'utilisez pas le canvas gadget, ce n'es tpas possible d'avoir ce genre de code avec le canvas gadget ?

Car c'est un sacré outil quand même ce canvas gadget et un outil de zoom dessus serait top :)
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Zoom et clic soucis (résolu) & Zoom Canvas

Message par kernadec »

@blendman je pas très réveillé, mais toi non plus :mrgreen:
la code précédent est avec canvas :)

Cordialement
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Zoom et clic soucis (résolu) & Zoom Canvas

Message par blendman »

salut

J'ai regardé ton dernier code, et j'avais 2 petites questions :
- est-il possible de faire un zoom centré sur la souris ?
- lorsque l'on déplace le canvas avec un clic bouton gauche, comment lui ajouter un event keyboard (touche espace) comme avec photoshop
- idem pour un clic avec la touche LeftAlt (il semblerait que des fois, ça pose problème, alors, je préfère poser 2 fois la question :))

Et d'une manière générale, comment gérer avec un canvas les touches claviers : touche pressée, en train d'être pressée, touche relâchée.

Je vais regarder la doc en Anglais, mais si tu as des infos là-dessus, je suis preneur :)

EDIT :
Pour les touches du clavier pour permettre le déplacement :
- j'ai à peu près réussi
- il faut que j'essaie d'ajouter un shortcut et perdre le focus du canvas pour voir si ça marche (pour utiliser la même touche avec plusieurs outils par exemple, en fonction du focus de la souris)

EDIT 2 :
- j'ai ajouté le zoom avec ctrl + et ctrl - , comme dans photoshop.

le code :

Code : Tout sélectionner

;####################################################################
;###    image   Zoom  scroll canvas deplacement de l'image        ###
;###      avec la mouse  et gestion zoom de l'alpha               ###
;###            par kernadec  jullet 2011  Ver:  PB 4.60 b3       ###
;####################################################################
Enumeration
  #Window
  #Image0 
  #Image1
  #Scroll
  #canvas
EndEnumeration
win_w=600
win_h=600
image_w.l=800
image_h.l=800

Global move.b, key, down.b, delta,PosXm1,PosYm1

ExamineDesktops()
CreateImage(#Image0,image_w+DesktopWidth(0),image_h+DesktopHeight(0))
CreateImage(#Image1,image_w+DesktopWidth(0),image_h+DesktopHeight(0))

LoadImage(#Image0, #PB_Compiler_Home+"examples\sources\data\Geebee2.bmp")
ResizeImage(#Image0,image_w,image_h,1)       

CopyImage(#Image0,#Image1)               ;  crée une copie de l'image pour eviter la degradation de resize

OpenWindow(#Window,0, 0,win_w,win_h, "Zoom Canvas ScrollArea clic deplace  Kernadec", #WS_SYSMENU | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget)
ScrollAreaGadget(#Scroll, 0, 0,WindowWidth(#Window),WindowHeight(#Window),ImageWidth(#Image0),ImageHeight(#Image0),30)
SetWindowColor(#Window,#White)
CanvasGadget(#canvas, 0, 0,ImageWidth(#Image0),ImageHeight(#Image0),#PB_Canvas_DrawFocus|#PB_Canvas_GrabMouse|#PB_Canvas_Keyboard)
SetGadgetAttribute(#Scroll,#PB_ScrollArea_X,(ImageWidth(#Image0)-WindowWidth(#Window))/2)
SetGadgetAttribute(#Scroll,#PB_ScrollArea_Y,(ImageHeight(#Image0)-WindowHeight(#Window))/2)
bm=#False

StartDrawing(CanvasOutput(#canvas))
Box(-20,-20,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
DrawAlphaImage(ImageID(#Image0),0,0,150)
StopDrawing()

If CreateMenu(0,WindowID(0))
  AddKeyboardShortcut(0,#PB_Shortcut_S,32)
EndIf


Procedure zoom_canvas(mode=0, sens=1)    
  If mode = 0
    delta=delta+(GetGadgetAttribute(#canvas,#PB_Canvas_WheelDelta )*50) ; delta*10
  ElseIf mode = 1
    delta +50*sens
  EndIf  
  CopyImage(#Image1,#Image0)      ; restore l'image originale                         
  ResizeImage(#Image0,(ImageWidth(#Image0)-delta),(ImageHeight(#Image0)-delta),#PB_Image_Smooth)   
  If StartDrawing(CanvasOutput(#canvas))
    Box(-20,-20,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
    If IsImage(#Image0)             ; test image pour eviter bug
      DrawAlphaImage(ImageID(#Image0),PosXm1+(delta/2),PosYm1+(delta/2),150)
    EndIf 
    StopDrawing() 
  EndIf
  EndProcedure


Repeat
  Event= WaitWindowEvent()
  
  
  SetActiveGadget(#canvas)             ; focus Canvas : MouseWheel     
  Select EventType() 
    Case #PB_EventType_MouseWheel 
     zoom_canvas()  
     
    Case #PB_EventType_RightButtonDown ; choix du bouton deplacer
;       bm=#True
;       PosXm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm1
;       PosYm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm1
     
    Case #PB_EventType_LeftButtonDown  ; choix du bouton deplacer
      If move= 1     
        bm=#True
        PosXm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm1
        PosYm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm1 
      EndIf      
    
     
    Case #PB_EventType_MouseMove       ; deplacement
      If bm=#True
        PosXm1 = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm
        PosYm1 = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm
      EndIf
      CopyImage(#Image1,#Image0)      ; Restore l'image originale 
      ResizeImage(#Image0,(ImageWidth(#Image0)-delta),(ImageHeight(#Image0)-delta),#PB_Image_Smooth)   
      StartDrawing(CanvasOutput(#canvas))
      Box(-20,-20,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
      If IsImage(#Image0)             ; test image pour eviter bug
        DrawAlphaImage(ImageID(#Image0),PosXm1+(delta/2),PosYm1+(delta/2),150)
      EndIf
      StopDrawing()
     
    Case #PB_EventType_LeftButtonUp
      bm=#False 
     
    Case #PB_EventType_RightButtonUp   
      bm=#False
      
    Case #PB_EventType_KeyDown    
      key = GetGadgetAttribute(#canvas,#PB_Canvas_Key)
      key2 = GetGadgetAttribute(#canvas,#PB_Canvas_Modifiers )
      If key = #PB_Shortcut_Space ;And key2 = #PB_Canvas_Control
        If move = 0
          move =1
        EndIf        
      ElseIf key = #PB_Shortcut_Add And key2 = #PB_Canvas_Control
        zoom_canvas(1,-1)
      ElseIf key = #PB_Shortcut_Subtract And key2 = #PB_Canvas_Control
        zoom_canvas(1)
      EndIf     
      
    Case #PB_EventType_KeyUp
      key = GetGadgetAttribute(#canvas,#PB_Canvas_Key)
      If key = #PB_Shortcut_Space
        If move = 1
          move =0
        EndIf
      EndIf      
        
  EndSelect 
  
  
  
  Select event 
      
    Case #PB_Event_SizeWindow
      ResizeGadget(#Scroll,#PB_Ignore,#PB_Ignore,WindowWidth(#Window),WindowHeight(#Window))
      win_w=WindowWidth(#Window)
      win_h=WindowHeight(#Window)
  EndSelect 
 
Until Event= #PB_Event_CloseWindow
Dernière modification par blendman le ven. 08/juil./2011 12:29, modifié 1 fois.
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Zoom et clic soucis (résolu) & Zoom Canvas

Message par kernadec »

bonjour blendman
je te répond vite fait... je vais manger.
je vais regarder le clic left ce soir
pour le clavier et la souris,
il faut mettre les conditions key à l' intérieur de ces deux events
case #PB_EventType_MouseMove
case #PB_EventType_MouseWheel

Cordialement
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Zoom et clic soucis (résolu) & Zoom Canvas

Message par kernadec »

bonsoir blendman
pour les touches Alterne left, je sais pas quoi dire, j'ai testé ça marche.
pour le zoom c'est pas facile, il faut se faire un film et pas perdre la concentration :)
j'ai déjà tenté de le faire, mais je suis vautré.. et ça ma pris la tête,
mais je vais ressayer quand j'aurais plus de temps.

Sinon c'est bien ce que tu fais, dit donc.. T à Donf.

Cordialement

Code : Tout sélectionner

OpenWindow(0,100,100,100,100, "test key", #WS_SYSMENU )
AddKeyboardShortcut(0, #PB_Shortcut_Escape, 1)
AddKeyboardShortcut(0, #PB_Shortcut_Add, 2)
AddKeyboardShortcut(0, #PB_Shortcut_Left, 3)
AddKeyboardShortcut(0, #PB_Shortcut_Right, 4)
AddKeyboardShortcut(0, #PB_Shortcut_Alt|#PB_Shortcut_Left, 5)
AddKeyboardShortcut(0, #PB_Shortcut_Alt|#PB_Shortcut_Right, 6)

Repeat
  event=WaitWindowEvent()
  
  Select event
      
    Case #PB_Event_Menu
      Select EventMenu()
          
        Case 1 
          Debug  "escape"
        Case 2
          Debug "add"
        Case 3
          Debug "left"
        Case 4
          Debug "right"
        Case 5
          Debug "Alt left"
        Case 6
          Debug "Alt Right"
      EndSelect   
  EndSelect
 
Until Event = #PB_Event_CloseWindow
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Zoom et clic soucis (résolu) & Zoom Canvas

Message par blendman »

Kernadec : le #PB_Shortcut_Alt seul ne marche pas, hélas, je ne sais pas pourquoi, peut être un pb avec le menu.

Tiens, sinon, j'ai essayé d'ajouter un petit mode peinture très rapidement, mais ça bug, et je n'arrive pas trop à comprendre comment je dois résoudre ça :P

Code : Tout sélectionner

;####################################################################
;###    image   Zoom  scroll canvas deplacement de l'image        ###
;###      avec la mouse  et gestion zoom de l'alpha               ###
;###            par kernadec  jullet 2011  Ver:  PB 4.60 b3       ###
;####################################################################
Enumeration
  #Window
  #Image0
  #Image1
  #Scroll
  #canvas
EndEnumeration
win_w=600
win_h=600
image_w.l=800
image_h.l=800

Global move.b, key, down.b, delta,PosXm1,PosYm1, draw.b

ExamineDesktops()
CreateImage(#Image0,image_w+DesktopWidth(0),image_h+DesktopHeight(0))
CreateImage(#Image1,image_w+DesktopWidth(0),image_h+DesktopHeight(0))

LoadImage(#Image0, #PB_Compiler_Home+"examples\sources\data\Geebee2.bmp")
ResizeImage(#Image0,image_w,image_h,1)       

CopyImage(#Image0,#Image1)               ;  crée une copie de l'image pour eviter la degradation de resize

OpenWindow(#Window,0, 0,win_w,win_h, "Zoom Canvas ScrollArea clic deplace  Kernadec", #WS_SYSMENU | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget)
ScrollAreaGadget(#Scroll, 0, 0,WindowWidth(#Window),WindowHeight(#Window),ImageWidth(#Image0),ImageHeight(#Image0),30)
SetWindowColor(#Window,#White)
CanvasGadget(#canvas, 0, 0,ImageWidth(#Image0),ImageHeight(#Image0),#PB_Canvas_DrawFocus|#PB_Canvas_GrabMouse|#PB_Canvas_Keyboard)
SetGadgetAttribute(#Scroll,#PB_ScrollArea_X,(ImageWidth(#Image0)-WindowWidth(#Window))/2)
SetGadgetAttribute(#Scroll,#PB_ScrollArea_Y,(ImageHeight(#Image0)-WindowHeight(#Window))/2)
bm=#False

StartDrawing(CanvasOutput(#canvas))
Box(-20,-20,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
DrawAlphaImage(ImageID(#Image0),0,0)
StopDrawing()

If CreateMenu(0,WindowID(0))
  AddKeyboardShortcut(0,#PB_Shortcut_S,32)
EndIf


Procedure zoom_canvas(mode=0, sens=1)   
  If mode = 0
    delta=delta+(GetGadgetAttribute(#canvas,#PB_Canvas_WheelDelta )*50) ; delta*10
  ElseIf mode = 1
    delta +50*sens
  EndIf 
  CopyImage(#Image1,#Image0)      ; restore l'image originale                         
  ResizeImage(#Image0,(ImageWidth(#Image0)-delta),(ImageHeight(#Image0)-delta),#PB_Image_Smooth)   
  If StartDrawing(CanvasOutput(#canvas))
    Box(-20,-20,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
    If IsImage(#Image0)             ; test image pour eviter bug
      DrawAlphaImage(ImageID(#Image0),PosXm1+(delta/2),PosYm1+(delta/2))
    EndIf
    StopDrawing()
  EndIf
  EndProcedure


Repeat
  Event= WaitWindowEvent()
 
 
  SetActiveGadget(#canvas)             ; focus Canvas : MouseWheel     
  Select EventType()
    Case #PB_EventType_MouseWheel
     zoom_canvas() 
     
    Case #PB_EventType_RightButtonDown ; choix du bouton deplacer
;       bm=#True
;       PosXm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm1
;       PosYm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm1
     
    Case #PB_EventType_LeftButtonDown  ; choix du bouton deplacer
      If move= 1     
        bm=#True
        PosXm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm1
        PosYm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm1
      ElseIf move = 0
        draw=1
      EndIf     
   
     
    Case #PB_EventType_MouseMove       ; deplacement
      If bm=#True
        PosXm1 = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm
        PosYm1 = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm        
        CopyImage(#Image1,#Image0)      ; Restore l'image originale
        ResizeImage(#Image0,(ImageWidth(#Image0)-delta),(ImageHeight(#Image0)-delta),#PB_Image_Smooth)   
        StartDrawing(CanvasOutput(#canvas))
        Box(-20,-20,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
        If IsImage(#Image0)             ; test image pour eviter bug
          DrawAlphaImage(ImageID(#Image0),PosXm1+(delta/2),PosYm1+(delta/2))
        EndIf
        StopDrawing()
      EndIf
      If move = 0 And draw = 1
        xx = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)
        yy = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)         
        StartDrawing(ImageOutput(#Image1))
        Circle(xx-PosXm1+(delta/2),yy-PosYm1+(delta/2),20)
        ;Circle(xx,yy,20)
        StopDrawing() 
        CopyImage(#Image1,#Image0) 
        StartDrawing(CanvasOutput(#canvas))
           Circle(xx,yy,20)
        ;DrawImage(ImageID(#image1),PosXm1+(delta/2),PosYm1+(delta/2))
        StopDrawing() 
      EndIf
      
    Case #PB_EventType_LeftButtonUp
      bm=#False
      If draw = 1
        draw= 0
      EndIf
    
     
    Case #PB_EventType_RightButtonUp   
      bm=#False
     
    Case #PB_EventType_KeyDown   
      key = GetGadgetAttribute(#canvas,#PB_Canvas_Key)
      key2 = GetGadgetAttribute(#canvas,#PB_Canvas_Modifiers )
      If key = #PB_Shortcut_Space ;And key2 = #PB_Canvas_Control
        If move = 0
          move =1
        EndIf       
      ElseIf key = #PB_Shortcut_Add And key2 = #PB_Canvas_Control
        zoom_canvas(1,-1)
      ElseIf key = #PB_Shortcut_Subtract And key2 = #PB_Canvas_Control
        zoom_canvas(1)
      EndIf     
     
    Case #PB_EventType_KeyUp
      key = GetGadgetAttribute(#canvas,#PB_Canvas_Key)
      If key = #PB_Shortcut_Space
        If move = 1
          move =0
        EndIf
      EndIf     
       
  EndSelect
 
 
 
  Select event
     
    Case #PB_Event_SizeWindow
      ResizeGadget(#Scroll,#PB_Ignore,#PB_Ignore,WindowWidth(#Window),WindowHeight(#Window))
      
      ;win_w=WindowWidth(#Window)
      ;win_h=WindowHeight(#Window)
  EndSelect

Until Event= #PB_Event_CloseWindow 
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Zoom et clic soucis (résolu) & Zoom Canvas

Message par kernadec »

bonsoir blendman
je fais une copie de l'image pour la dégradation de resizeimage. donc il y a une restauration
dans les procédures wheel et move, la cause est là.
cela dit c'est une voie vers le undo :)

j'ai posté une demandé à Fred , si il c'était possible d'avoir
une fonction complète "drawimage(image,x,y,lg,ht,alpha,#PB_Image_Smooth)"
car pour le moment DrawAlphaImage ne permet pas de modifié la taille image et c'est bien dommage.

voila, regarde si cela te conviens,
je t'ai ajouté dans un ptit truc "Case #PB_EventType_LeftButtonUp"

une sauvegarde du dessin avec copie de l'image, mais il faut la resizeimage
avant pour éviter les problèmes de Zoom à voir,
je n'ai pas tout compris les modifs dans procedure wheel.
il reste des ptites chiures dans le zoom :)

je regarderais cela demain, car ce soir c'est sortie ciné.. :)

Cordialement

Code : Tout sélectionner

;####################################################################
;###    image   Zoom  scroll canvas deplacement de l'image        ###
;###      avec la mouse  et gestion zoom de l'alpha               ###
;###            par kernadec  jullet 2011  Ver:  PB 4.60 b3       ###
;####################################################################
Enumeration
  #Window
  #Image0
  #Image1
  #Scroll
  #canvas
EndEnumeration
win_w=600
win_h=600
image_w.l=800
image_h.l=800

Global move.b, key, down.b, delta,PosXm1,PosYm1, draw.b

ExamineDesktops()
CreateImage(#Image0,image_w+DesktopWidth(0),image_h+DesktopHeight(0))
CreateImage(#Image1,image_w+DesktopWidth(0),image_h+DesktopHeight(0))

LoadImage(#Image0, #PB_Compiler_Home+"examples\sources\data\Geebee2.bmp")
ResizeImage(#Image0,image_w,image_h,1)       

CopyImage(#Image0,#Image1)               ;  crée une copie de l'image pour eviter la degradation de resize

OpenWindow(#Window,0, 0,win_w,win_h, "Zoom Canvas ScrollArea clic deplace  Kernadec", #WS_SYSMENU | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget)
ScrollAreaGadget(#Scroll, 0, 0,WindowWidth(#Window),WindowHeight(#Window),ImageWidth(#Image0),ImageHeight(#Image0),30)
SetWindowColor(#Window,#White)
CanvasGadget(#canvas, 0, 0,ImageWidth(#Image0),ImageHeight(#Image0),#PB_Canvas_DrawFocus|#PB_Canvas_GrabMouse|#PB_Canvas_Keyboard)
SetGadgetAttribute(#Scroll,#PB_ScrollArea_X,(ImageWidth(#Image0)-WindowWidth(#Window))/2)
SetGadgetAttribute(#Scroll,#PB_ScrollArea_Y,(ImageHeight(#Image0)-WindowHeight(#Window))/2)
bm=#False

StartDrawing(CanvasOutput(#canvas))
Box(-20,-20,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
DrawAlphaImage(ImageID(#Image0),0,0)
StopDrawing()

If CreateMenu(0,WindowID(0))
  AddKeyboardShortcut(0,#PB_Shortcut_S,32)
EndIf


Procedure zoom_canvas(mode=0, sens=1)   
  
  If mode = 0
    delta=delta+(GetGadgetAttribute(#canvas,#PB_Canvas_WheelDelta )*50) ; delta*10
  ElseIf mode = 1
    delta +50*sens
  EndIf 
  
  CopyImage(#Image1,#Image0)      ; restore l'image originale                         
  ResizeImage(#Image0,(ImageWidth(#Image0)-delta),(ImageHeight(#Image0)-delta),#PB_Image_Smooth)   
  If StartDrawing(CanvasOutput(#canvas))
    Box(-20,-20,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
    If IsImage(#Image0)             ; test image pour eviter bug
      DrawAlphaImage(ImageID(#Image0),PosXm1+(delta/2),PosYm1+(delta/2))
    EndIf
    StopDrawing()
  EndIf
  
EndProcedure


Repeat
  Event= WaitWindowEvent()
  
  
  SetActiveGadget(#canvas)             ; focus Canvas : MouseWheel     
  Select EventType()
    Case #PB_EventType_MouseWheel
      zoom_canvas() 
      
    Case #PB_EventType_RightButtonDown ; choix du bouton deplacer
      ;       bm=#True
      ;       PosXm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm1
      ;       PosYm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm1
      
    Case #PB_EventType_LeftButtonDown  ; choix du bouton deplacer
      If move= 1     
        bm=#True
        PosXm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm1
        PosYm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm1
      ElseIf move = 0
        draw=1
      EndIf     
      
      
    Case #PB_EventType_MouseMove       ; deplacement
      If bm=#True
        PosXm1 = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm
        PosYm1 = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm        
        CopyImage(#Image1,#Image0)      ; Restore l'image originale
        ResizeImage(#Image0,(ImageWidth(#Image0)-delta),(ImageHeight(#Image0)-delta),#PB_Image_Smooth)   
        StartDrawing(CanvasOutput(#canvas))
        Box(-20,-20,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
        If IsImage(#Image0)             ; test image pour eviter bug
          DrawAlphaImage(ImageID(#Image0),PosXm1+(delta/2),PosYm1+(delta/2))
        EndIf
        StopDrawing()
      EndIf
      If move = 0 And draw = 1
        xx = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)
        yy = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)         
        StartDrawing(ImageOutput(#Image1))
        Circle(xx-PosXm1+(delta/2),yy-PosYm1+(delta/2),20)
        ;Circle(xx,yy,20)
        StopDrawing() 
        CopyImage(#Image1,#Image0) 
        StartDrawing(CanvasOutput(#canvas))
        Circle(xx,yy,20)
        ;DrawImage(ImageID(#image1),PosXm1+(delta/2),PosYm1+(delta/2))
        StopDrawing() 
        If StartDrawing(ImageOutput(#Image0))
          DrawImage(GetGadgetAttribute(#canvas,#PB_Canvas_Image),0,0) ;fixe le dessin 
          StopDrawing()
        EndIf
      EndIf
      
    Case #PB_EventType_LeftButtonUp
      bm=#False
      If draw = 1
        draw= 0
        ;################################################################################"""
        ResizeImage(#Image0,ImageWidth(#Image1),ImageHeight(#Image1),#PB_Image_Smooth)  
        CopyImage(#Image0,#Image1)     ;modifie l'originale mais garde la taille de celui-ci
        If StartDrawing(ImageOutput(#Image0))
          DrawAlphaImage(GetGadgetAttribute(#canvas,#PB_Canvas_Image),0,0)
          StopDrawing()
        EndIf
        ;############################################################
      EndIf
      
      
    Case #PB_EventType_RightButtonUp   
      bm=#False
      
    Case #PB_EventType_KeyDown   
      key = GetGadgetAttribute(#canvas,#PB_Canvas_Key)
      key2 = GetGadgetAttribute(#canvas,#PB_Canvas_Modifiers )
      If key = #PB_Shortcut_Space ;And key2 = #PB_Canvas_Control
        If move = 0
          move =1
        EndIf       
      ElseIf key = #PB_Shortcut_Add And key2 = #PB_Canvas_Control
        
        zoom_canvas(1,-1)
        
      ElseIf key = #PB_Shortcut_Subtract And key2 = #PB_Canvas_Control
        
        zoom_canvas(1)
      EndIf     
      
    Case #PB_EventType_KeyUp
      key = GetGadgetAttribute(#canvas,#PB_Canvas_Key)
      If key = #PB_Shortcut_Space
        If move = 1
          move =0
        EndIf
      EndIf     
      
  EndSelect
  
  
  
  Select event
      
    Case #PB_Event_SizeWindow
      ResizeGadget(#Scroll,#PB_Ignore,#PB_Ignore,WindowWidth(#Window),WindowHeight(#Window))
      
      ;win_w=WindowWidth(#Window)
      ;win_h=WindowHeight(#Window)
  EndSelect
  
Until Event= #PB_Event_CloseWindow 
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Zoom et clic soucis (résolu) & Zoom Canvas

Message par blendman »

kernadec a écrit :je fais une copie de l'image pour la dégradation de resizeimage. donc il y a une restauration
dans les procédures wheel et move, la cause est là.
cela dit c'est une voie vers le undo :)
je comprends ;)
j'ai posté une demandé à Fred , si il c'était possible d'avoir
une fonction complète "drawimage(image,x,y,lg,ht,alpha,#PB_Image_Smooth)"
car pour le moment DrawAlphaImage ne permet pas de modifié la taille image et c'est bien dommage.
complètement d'accord.
D'ailleurs, un truc très intéressant pour le zoom serait d'avoir un zoom_image() et zoom_canvas(), comme les zoomsprites() :D.
à intégrer, mais un vrai serait beaucoup mieux que l'utilisation du resize, car je réfléchissais au problème que l'on va rencontrer sur les très grandes images.

Prenons une image en 8000*8000 :
- si j'ai bien compris, lorsque l'on fait un "pseudo" zoom, on fait une copie de l'image et on la resize
- mais si on resize à 1000% (ce qui peut arriver :)), ça veut dire que notre image va passer en 8000*8000*10, et cela pour tous les calques 8O Je te laisse imaginer si on a 10 ou 20 calques, ce qui arrive très souvent... ça va être ingérable je pense, car ça risque de saturer la mémoire.
Alors qu'un zoom sur les pixels, ce serait beaucoup plus pratique, l'image ne serait pas resizée.

Une autre technique serait d'utiliser les sprites au lieu d'utiliser les images et le canvasgadget. Mais hélas, je ne sais pas pourquoi, mais lorsque j'active un openwindowedscreen(), avec ma tablette graphique la souris part dans tous les sens (à mon avis c'est un bug je suppose).
voila, regarde si cela te conviens,
je t'ai ajouté dans un ptit truc "Case #PB_EventType_LeftButtonUp"

une sauvegarde du dessin avec copie de l'image, mais il faut la resizeimage
avant pour éviter les problèmes de Zoom à voir,
je n'ai pas tout compris les modifs dans procedure wheel.
il reste des ptites chiures dans le zoom :)
j'ai regardé et c'est pas mal.

Mais j'ai repéré 3 petits problèmes ;) :
- le problème de resize (copie d'image) dont je parle plus haut, j'ai l'impression que ça va limiter l'usage des grandes images
- les images qui ne sont pas carrées sont écrasées en hauteur quand on dézoome et élargit en largeur quand on zoome :)
- comme le zoom fait une copie de l'image, on écrase du coup l'ancienne copie et on se retrouve avec une image tronquée, qui représente uniquement le zoom (le bug dont tu parlais sans doute).

Fais un essaie avec cette image-ci, tu comprendras le problème ;) :

(image grande et rectangulaire)
http://blendman.free.fr/bd/teololi/groupe.jpg

Encore un immense pour le temps que tu passes sur ces tests.
Tu vas te servir toi aussi du canvas pour une application ?

EDIT :
- J'ai réfléchi au zoom, et je pense qu'un zoom multipliant la taille serait plus approprié qu'un zoom en addition ;).

Car du coup, on peut appliquer le taux de zoom au brush et l'agrandir quand on zoome et le réduire quand on dézoome.
On a aussi le taux du zoom, plus facile pour l'affichage ;).

voici un code corrigé :
- le pinceau est redimensionné pour toujours être proportionnel à l'image
- le zoom est centré au centre de l'image, on peut le bouger et il vient se centrer plus ou moins sur la position de la souris (je dois revoir ça)
- la touche 0 : centre l'image au centre de la fenêtre
- la touche 5 : centre l'image au centre de la fenêtre et remet le zoom à zéro.

Il reste le bug du redimensionnement de l'image ;).

le code :

Code : Tout sélectionner

;####################################################################
;###    image   Zoom  scroll canvas deplacement de l'image        ###
;###      avec la mouse  et gestion zoom de l'alpha               ###
;###            par kernadec  jullet 2011  Ver:  PB 4.60 b3       ###
;####################################################################
;{ enumeration et constantes
Enumeration
  #Window
  #Image0
  #Image1
  #Scroll
  #canvas
EndEnumeration
;}

;{ variables et globales
ExamineDesktops()
win_w=DesktopWidth(0)
win_h=DesktopHeight(0)
bm=#False
Global move.b, key.i, down.b, delta.d, PosXm1.i, PosYm1.i, draw.b,zoom${5},centre_canvas_x.i,centre_canvas_y.i,defaut_w.i,defaut_h.i
;}

;{ initialisation
If UsePNGImageDecoder() = 0 Or UseJPEG2000ImageDecoder() = 0  Or UseJPEGImageDecoder()=0 Or UseTGAImageDecoder() = 0 Or UseTIFFImageDecoder() =0
  End
EndIf

;}

;{ creation des images
ExamineDesktops()
;CreateImage(#Image0,image_w+DesktopWidth(0),image_h+DesktopHeight(0))

file$ = OpenFileRequester("Recherche","Ouvrir une image","Fichiers Images|*.jpg;*.jpeg;*.tiff;*.tga;*.png;*.bmp",0)

If file$ =""
  file$ = #PB_Compiler_Home+"examples\sources\data\Geebee2.bmp"
EndIf

LoadImage(#Image0, file$)
image_w.l=ImageWidth(#image0)
image_h.l=ImageHeight(#image0)
; on garde la taille par defaut
defaut_w = image_w/2
defaut_h = image_h/2
;on crée une copie
CreateImage(#Image1,image_w,image_h)
CopyImage(#Image0,#Image1)               ;  crée une copie de l'image pour eviter la degradation de resize
;}

;{ openwindow et gadgets
If OpenWindow(#Window,0, 0,win_w,win_h, "Zoom Canvas ScrollArea clic deplace  Kernadec", #WS_SYSMENU | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget|#PB_Window_MaximizeGadget|#PB_Window_Maximize)
  
  ;{ gadgets
  ScrollAreaGadget(#Scroll, 0, 0,WindowWidth(#Window),WindowHeight(#Window),ImageWidth(#Image0),ImageHeight(#Image0),30)
  SetWindowColor(#Window,#White)
  CanvasGadget(#canvas, 0, 0,ImageWidth(#Image0),ImageHeight(#Image0),#PB_Canvas_DrawFocus|#PB_Canvas_GrabMouse|#PB_Canvas_Keyboard)
  SetGadgetAttribute(#Scroll,#PB_ScrollArea_X,(ImageWidth(#Image0)/2-WindowWidth(#Window))/2)
  SetGadgetAttribute(#Scroll,#PB_ScrollArea_Y,(ImageHeight(#Image0)/2-WindowHeight(#Window))/2)
    ;}
  ;{ creation du canvas
  StartDrawing(CanvasOutput(#canvas))
  Box(-20,-20,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
  DrawAlphaImage(ImageID(#Image0),0,0)
  StopDrawing()
  ;}
  ;{ creation du menu
  If CreateMenu(0,WindowID(0))
    AddKeyboardShortcut(0,#PB_Shortcut_S,32)
  EndIf
  ;}
Else ; sinon on arrête.  
  MessageRequester("Erreur","Impossible d'ouvrir une fenêtre, avez-vous window d'installer ? Si oui, passez sous linux :)")
  End  
EndIf
; le centre du canvas
centre_canvas_x =WindowWidth(0)/2
centre_canvas_y =WindowHeight(0)/2
zoom$ = Str(100+100*(delta))
SetWindowTitle(0,"Zoom : "+zoom$+" % -  taille de l'image0 :"+Str(ImageWidth(#Image0))+"/"+Str(ImageHeight(#Image0)))
;}


Procedure zoom_canvas(mode=0, sens=1)    
  If mode = 0
    delta=delta+(GetGadgetAttribute(#canvas,#PB_Canvas_WheelDelta )*0.05) ; delta*10
  ElseIf mode = 1
    delta +0.05*sens
  EndIf 
  
  If delta >-1 Or delta <3
    CopyImage(#Image1,#Image0)      ; restore l'image originale                         
    ResizeImage(#Image0,ImageWidth(#Image0)*(delta+1),ImageHeight(#Image0)*(delta+1),#PB_Image_Raw)   
    If StartDrawing(CanvasOutput(#canvas))
      Box(-20,-20,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
      If IsImage(#Image0)             ; test image pour eviter bug
        DrawAlphaImage(ImageID(#Image0),centre_canvas_x-ImageWidth(#Image0)/2, centre_canvas_y-ImageHeight(#Image0)/2)
      EndIf
      StopDrawing()
    EndIf
    zoom$ = Str(100+100*(delta))
    SetWindowTitle(0," - Zoom : "+zoom$+" % - taille de l'image0 :"+Str(ImageWidth(#Image0))+"/"+Str(ImageHeight(#Image0)))
  EndIf

EndProcedure

;{ boucle principale
Repeat
  Event= WaitWindowEvent()
 
 
  SetActiveGadget(#canvas)             ; focus Canvas : MouseWheel     
  Select EventType()
    Case #PB_EventType_MouseWheel
      zoom_canvas()
     
    Case #PB_EventType_RightButtonDown ; choix du bouton deplacer
      
  
    Case #PB_EventType_LeftButtonDown  ; choix du bouton deplacer
      If move= 1     
        bm=#True
        PosXm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm1
        PosYm = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm1        
      ElseIf move = 0
        draw=1
      EndIf     
     
     
    Case #PB_EventType_MouseMove       ; deplacement
      If bm=#True
        PosXm1 = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)-PosXm
        PosYm1 = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)-PosYm  
        centre_canvas_x = PosXm1 + ImageWidth(#Image0)/2
        centre_canvas_y = Posym1 + ImageHeight(#Image0)/2
        CopyImage(#Image1,#Image0)      ; Restore l'image originale
        ResizeImage(#Image0,ImageWidth(#Image0)*(delta+1),ImageHeight(#Image0)*(delta+1),#PB_Image_Raw) 
        StartDrawing(CanvasOutput(#canvas))
        Box(-20,-20,WindowWidth(#Window)*2,WindowHeight(#Window)*2,RGB(255,255,255))
        If IsImage(#Image0)             ; test image pour eviter bug
          DrawAlphaImage(ImageID(#Image0),PosXm1,PosYm1)
        EndIf
        StopDrawing()
      EndIf
      If move = 0 And draw = 1
        xx = GetGadgetAttribute(#canvas,#PB_Canvas_MouseX)
        yy = GetGadgetAttribute(#canvas,#PB_Canvas_MouseY)         
        StartDrawing(ImageOutput(#Image1))
        Circle(xx-PosXm1,yy-PosYm1,20*(delta+1))
        StopDrawing()
        CopyImage(#Image1,#Image0)
        StartDrawing(CanvasOutput(#canvas))
        Circle(xx,yy,20)
        ;DrawImage(ImageID(#image1),PosXm1+(delta/2),PosYm1+(delta/2))
        StopDrawing()
        If StartDrawing(ImageOutput(#Image0))
          DrawImage(GetGadgetAttribute(#canvas,#PB_Canvas_Image),0,0) ;fixe le dessin
          StopDrawing()
        EndIf
      EndIf
     
    Case #PB_EventType_LeftButtonUp
      bm=#False
      If draw = 1
        draw= 0
        ;#############################################################
        ResizeImage(#Image0,ImageWidth(#Image1),ImageHeight(#Image1),#PB_Image_Raw) 
        CopyImage(#Image0,#Image1)     ;modifie l'originale mais garde la taille de celui-ci
        If StartDrawing(ImageOutput(#Image0))
          DrawAlphaImage(GetGadgetAttribute(#canvas,#PB_Canvas_Image),0,0)
          StopDrawing()
        EndIf
        ;############################################################
      EndIf
     
     
    Case #PB_EventType_RightButtonUp   
      bm=#False
     
    Case #PB_EventType_KeyDown   
      key = GetGadgetAttribute(#canvas,#PB_Canvas_Key)
      key2 = GetGadgetAttribute(#canvas,#PB_Canvas_Modifiers )
      If key = #PB_Shortcut_Space ;And key2 = #PB_Canvas_Control
        If move = 0
          move =1
        EndIf       
      ElseIf key = #PB_Shortcut_Add And key2 = #PB_Canvas_Control       
        zoom_canvas(1)       
      ElseIf key = #PB_Shortcut_Subtract And key2 = #PB_Canvas_Control       
        zoom_canvas(1,-1)
      ElseIf key = #PB_Shortcut_Pad0 ; centrer l'image
        centre_canvas_x = WindowWidth(0)/2
        centre_canvas_y = WindowHeight(0)/2
        zoom_canvas(2)
        SetGadgetAttribute(#Scroll,#PB_ScrollArea_X,(ImageWidth(#Image0)/2-WindowWidth(#Window))/2)
        SetGadgetAttribute(#Scroll,#PB_ScrollArea_Y,(ImageHeight(#Image0)/2-WindowHeight(#Window))/2)
      ElseIf key = #PB_Shortcut_Pad5 ; centrer l'image et remettre le zoom à zéro
        centre_canvas_x = WindowWidth(0)/2
        centre_canvas_y = WindowHeight(0)/2
        delta = 0
        zoom_canvas(2)
        SetGadgetAttribute(#Scroll,#PB_ScrollArea_X,(ImageWidth(#Image0)/2-WindowWidth(#Window))/2)
        SetGadgetAttribute(#Scroll,#PB_ScrollArea_Y,(ImageHeight(#Image0)/2-WindowHeight(#Window))/2)
      EndIf     
     
    Case #PB_EventType_KeyUp
      key = GetGadgetAttribute(#canvas,#PB_Canvas_Key)
      If key = #PB_Shortcut_Space
        If move = 1
          move =0
        EndIf
      EndIf     
     
  EndSelect
 
  
  Select event
     
    Case #PB_Event_SizeWindow
      ResizeGadget(#Scroll,#PB_Ignore,#PB_Ignore,WindowWidth(#Window),WindowHeight(#Window))

  EndSelect
 
Until Event= #PB_Event_CloseWindow 
;}
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Zoom et clic soucis (résolu) & Zoom Canvas

Message par kernadec »

bonjour blendman
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.. :?

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
  #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


Répondre