[resolu] Canvas - encore du mal

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

[resolu] Canvas - encore du mal

Message par Ar-S »

Yop,

Je suis en train de faire un petit recadreur d'image. Le Canvas semble être la meilleur solution vu la gestion avancée des event.
Mais j'avoue que je suis perdu (ma monstrueuse crève n'aide pas). Voilà mon interface dans sa version de base. Je n'arrive déjà pas à récupérer la position de la souris au clique (#PB_EventType_LeftButtonDown) puis cette même position au relâchement de la souris (#PB_EventType_LeftButtonUp).
J'aimerai en plus apercevoir un cadre de sélection comme semble le permettre le flag #PB_Canvas_DrawFocus.
Bref, besoin des lumières des habitués du canvas.

D'avance merci.

Code : Tout sélectionner

;{- Enumerations / DataSections

UseJPEGImageDecoder() 
UseJPEG2000ImageDecoder() 
UsePNGImageDecoder() 
UseTIFFImageDecoder() 
UseTGAImageDecoder() 


Enumeration
  #LDVM
  #ORI_X
  #ORI_Y
  #TXT_L_ORI
  #Text_3
  #CHARGER
  #CROP
  #ECRAN
  #image
EndEnumeration

; Global HBarre.i = GetBarHeight()
Global Canvas_MAX_L = 431
Global Canvas_MAX_H = 497


Procedure TailleEcran()
  Shared ECR_Y,ECR_Y
  ECR_X = GetSystemMetrics_(0)
  ECR_Y = GetSystemMetrics_(1)
EndProcedure

Procedure OpenWindow_LDVM()
  hwnd = OpenWindow(#LDVM, 419, 216, 433, 600, "LDV MULTIMEDIA - Crop Crop !", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
  If hwnd
    StringGadget(#ORI_X, 40, 80, 70, 20, "", #PB_String_Numeric|#PB_String_ReadOnly)
    StringGadget(#ORI_Y, 150, 80, 70, 20, "", #PB_String_Numeric|#PB_String_ReadOnly)
    TextGadget(#TXT_L_ORI, 5, 80, 25, 20, "L", #PB_Text_Center|#SS_CENTERIMAGE)
    TextGadget(#Text_3, 120, 80, 25, 20, "H", #PB_Text_Center|#SS_CENTERIMAGE)
    ButtonGadget(#CHARGER, 1, 1, 430, 75, "Charger une image")
    ButtonGadget(#CROP, 320, 77, 110, 25, "Recadrer !")
    DisableGadget(#CROP,1)
    
    CanvasGadget(#ECRAN, 1, 102, Canvas_MAX_L, Canvas_MAX_H, #PB_Canvas_DrawFocus|#PB_Canvas_ClipMouse)
  EndIf
EndProcedure

OpenWindow_LDVM()

Repeat
  Select WaitWindowEvent()
      
    Case #PB_Event_Gadget
      Select EventGadget()
          
        Case #ECRAN
          
          OutputID = CanvasOutput(#ECRAN)
          
          If EventType() = #PB_EventType_LeftButtonDown And  EventType() = GetGadgetAttribute(#ECRAN, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
            
            DepartX = GetGadgetAttribute(#ECRAN, #PB_Canvas_MouseX)
            DepartY = GetGadgetAttribute(#ECRAN, #PB_Canvas_MouseY)
            
          EndIf
          
          Debug "Dep X : " + Str(DepartX)
          Debug "Dep Y : " + Str(DepartY)
          
          
          
          If EventType() = #Pb_EventType_LeftButtonup And EventType() = #PB_EventType_Focus And  EventType() = GetGadgetAttribute(#ECRAN, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
            FinX = GetGadgetAttribute(#ECRAN, #PB_Canvas_MouseX)
            FinY = GetGadgetAttribute(#ECRAN, #PB_Canvas_MouseY)
          EndIf
          
          Debug "Fin X : " + Str(FinX)
          Debug "Fin Y : " + Str(FinY)
          
          
          
          
          
        Case #CHARGER
          Limg = 0 : Himg = 0
          im$ = OpenFileRequester("Charger une image","", "Fichier Image|*.jpg;*.png;*.bmp;*.tiff",0)
          If im$
            Image = LoadImage(#image, im$)
            
            If Image
              
              Limg = ImageWidth(#image)
              Himg = ImageHeight(#image)
              
              If Limg > Himg
                Format = Paysage
              ElseIf Limg < Himg
                Format = Portrait
              EndIf
              
              DisableGadget(#CROP,0)
              
              Select Format
                Case Paysage
                  ; Produit en croix pour afficher l'image dans le canvas
                  
                Case Portrait
                  ; Produit en croix pour afficher l'image dans le canvas
                  
              EndSelect
              
              
            Else
              Debug "non"
            EndIf
            
          EndIf
          
        Case #CROP
          
          
      EndSelect
      
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #LDVM
          CloseWindow(#LDVM)
          Break
      EndSelect
  EndSelect
ForEver

Dernière modification par Ar-S le sam. 29/sept./2012 13:17, modifié 1 fois.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Canvas, encore du mal

Message par falsam »

#PB_Canvas_DrawFocus ne permet que d'activer un cadre autour du canvas quand il a le focus souris ou clavier. l’intérêt dans ton exemple est plus que limité.

Je te propose un exemple avec comme objectif de :
-Montrer l’intérêt de #PB_Canvas_DrawFocus
-Charger une image.
-Afficher les coordonnées de la souris
-Dessiner un cadre de sélection (Juste dessiner) :p

Code : Tout sélectionner

Enumeration
  #Mainform
  #Canvas
  #Load
  #SB
  
  #Image
EndEnumeration


Define.l Event, WEvent, MEvent, GEvent, TEvent

Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered

Procedure Open_MainForm()
  OpenWindow(#Mainform, 0, 0, 500, 400, "New Form", WindowStyle)
  CanvasGadget(#Canvas, 10, 10, 480, 300, #PB_Canvas_Keyboard|#PB_Canvas_DrawFocus)
  If CreateStatusBar(#SB, WindowID(#Mainform))
      AddStatusBarField(90)
      AddStatusBarField(100)
      AddStatusBarField(#PB_Ignore) ; dimensionne automatiquement ce champ
      AddStatusBarField(100)
  EndIf
  ButtonGadget(#Load, 10, 320, 480, 22, "Charger une image")
  
EndProcedure

Procedure Start()
  ;Initialisation application, police, etc ..
  UseJPEGImageDecoder() 
  UseJPEG2000ImageDecoder() 
  UsePNGImageDecoder() 
  UseTIFFImageDecoder() 
  UseTGAImageDecoder() 
  Open_MainForm()
EndProcedure

start()

Repeat
  Event  = WaitWindowEvent(10)
  WEvent = EventWindow() 
  MEvent = EventMenu()
  GEvent = EventGadget()
  TEvent = EventType()
  Select Event
    Case #PB_Event_Gadget
      Select GEvent
        Case #Load
          im$ = OpenFileRequester("Charger une image","", "Fichier Image|*.jpg;*.png;*.bmp;*.tiff",0)
          Image = LoadImage(#image, im$)
          ResizeImage(#image, 480, 300)
          
          StartDrawing(CanvasOutput(#Canvas))
          DrawImage(ImageID(#Image), 0, 0)
          StopDrawing()
          
          
          If im$
          EndIf
          
        Case #Canvas
          Select TEvent
            Case #PB_EventType_LeftButtonDown

               SetGadgetAttribute(#Canvas, #PB_Canvas_Cursor, #PB_Cursor_Cross)

               ;On signale au canvas que MouseDown est actif (ça peut etre une variable)
               SetGadgetData(#Canvas, #True)
              
               ;-Mémorisation des coordonnées de la souris sur le canvas
               X1 = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
               Y1 = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)
               X2 = 0
               Y2 = 0
               StatusBarText(#SB, 0, Str(X1)+"/"+Str(Y1))
               StatusBarText(#SB, 1, Str(X2)+"/"+Str(Y2))

             Case #PB_EventType_LeftButtonUp
                SetGadgetAttribute(#Canvas, #PB_Canvas_Cursor, #PB_Cursor_Default)

                ;On signale au canvas que MouseDown est desactivé (ça peut etre une variable)
                SetGadgetData(#Canvas, #False)
                            
            Case #PB_EventType_MouseMove
                ;Si MouseLeftDown actif, actualisation des coordonnées de la souris
                If GetGadgetData(#Canvas) = #True
                X2 = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
                Y2 = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)

                StatusBarText(#SB, 1, Str(X2)+"/"+Str(Y2))
                
                ;Mise à jour du cadre de sélection
                StartDrawing(CanvasOutput(#Canvas))
                
                ;Clear 
                DrawingMode(#PB_2DDrawing_Default)
                Box(0, 0, 480, 300, RGB(255, 255, 255))
                
                ;Affichage de l'image
                If IsImage(#Image)
                  DrawImage(ImageID(#Image), 0, 0)
                EndIf
                                
                ;Dessin du cadre de sélection
                DrawingMode(#PB_2DDrawing_Outlined)

                Box(X1, Y1, x2-x1, y2-y1, RGB(255, 69, 0))

                StopDrawing()
              EndIf
              
          EndSelect
          

      EndSelect
        
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
Soigne toi bien :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Canvas, encore du mal

Message par Ar-S »

Juste une petite incursion pour te remercier de cet exemple claire et précis.
Je retourne à mon bullage.

Bon weekend
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre