Copier le contenu d'un canvasgadget dans le presse papier

Programmation d'applications complexes
Avatar de l’utilisateur
Philippe_GEORGES
Messages : 112
Inscription : mer. 28/janv./2009 13:28

Copier le contenu d'un canvasgadget dans le presse papier

Message par Philippe_GEORGES »

Bonjour

Je souhaite copier le contenu (graphique) du canvasgadget vers le presse papier.

Code : Tout sélectionner

   If EventType()= #PB_EventType_LeftDoubleClick      ; copie presse papier
     SetClipboardImage(#canvas_carte)  
     MessageRequester("Information","Image copiée dans le presse papier");
Toutefois, ça ne semble pas aussi simple....

Quelqu'un a t il une idée ?

Merci d'avance
Philippe GEORGES
"La simplicité est la sophistication suprême" (De Vinci)
assistance informatique, création de logiciels
georges.informatique@gmail.com
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Copier le contenu d'un canvasgadget dans le presse papie

Message par falsam »

GetGadgetAttribute(toncanvas, #PB_Canvas_Image) donne l'image id de ton canvas
Configuration : Windows 11 Famille 64-bit - PB 6.03 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
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Copier le contenu d'un canvasgadget dans le presse papie

Message par falsam »

Petit code de vérification

Code : Tout sélectionner

;Plan de l'application
Declare Start()
Declare CopyClipboardImage()
Declare Exit()

Start()

Procedure Start()
  Protected font = LoadFont(#PB_Any, "", 30)
  
  OpenWindow(0, 0, 0, 800, 600, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  
  CanvasGadget(0, 0, 0, 800, 600)
  
  StartDrawing(CanvasOutput(0))
  Box(0, 0, 800, 600, RGB(128, 128, 128))
  
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(FontID(font))
  DrawText(100, 100, "Test copy image")
  StopDrawing()
   
  
  ;Triggers
  BindGadgetEvent(0, @CopyClipboardImage(), #PB_EventType_RightClick)
  
  BindEvent(#PB_Event_CloseWindow, @Exit())
  
  Repeat : WaitWindowEvent() : ForEver
EndProcedure

Procedure CopyClipboardImage()
  Protected imageId = GetGadgetAttribute(0, #PB_Canvas_Image)
  
  Protected image = CreateImage(#PB_Any, GadgetWidth(0), GadgetHeight(0))
  
  StartDrawing(ImageOutput(image))
    DrawImage(imageId, 0, 0)
  StopDrawing()
  
  SetClipboardImage(image)
  Debug "copie effectuée "
EndProcedure

Procedure Exit()  
  End
EndProcedure
Configuration : Windows 11 Famille 64-bit - PB 6.03 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
Philippe_GEORGES
Messages : 112
Inscription : mer. 28/janv./2009 13:28

Re: Copier le contenu d'un canvasgadget dans le presse papie

Message par Philippe_GEORGES »

Merci Falsam,

Code : Tout sélectionner

   If EventType()= #PB_EventType_LeftDoubleClick      ; copie presse papier
     GetGadgetAttribute(#canvas_carte, #PB_Canvas_Image)
     
     SetClipboardImage( #PB_Canvas_Image)  
     MessageRequester("Information","Image copiée dans le presse papier");
J'ai procédé de cette façon, mais ça ne marche pas .... :cry:

Si tu as une idée....

Phil
Philippe GEORGES
"La simplicité est la sophistication suprême" (De Vinci)
assistance informatique, création de logiciels
georges.informatique@gmail.com
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Copier le contenu d'un canvasgadget dans le presse papie

Message par Ollivier »

Bonjour, ceci devrait faire l'affaire :

Code : Tout sélectionner

If StartDrawing(CanvasOutput(CanvasNumero) )
   W = OutputWidth()
   H = OutputHeight()
   Image = GrabDrawingImage(#Pb_Any, 0, 0, W, H)
   StopDrawing()
   SetClipboardImage(Image)
   FreeImage(Image)
EndIf
(Et désolé Falsam : le sujet était vide quand j'ai répondu, bande de TGV !)
Dernière modification par Ollivier le jeu. 13/juin/2019 15:37, modifié 1 fois.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Copier le contenu d'un canvasgadget dans le presse papie

Message par falsam »

Philippe_GEORGES a écrit :J'ai procédé de cette façon, mais ça ne marche pas ....

Si tu as une idée....
Voir mon code de vérification
https://www.purebasic.fr/french/viewtop ... 96#p204196

Je récupére bien l'image dans mon logiciel de traitement d'image
Configuration : Windows 11 Famille 64-bit - PB 6.03 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
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Copier le contenu d'un canvasgadget dans le presse papie

Message par falsam »

La solution d'olivier est bonne aussi

Code : Tout sélectionner

;Plan de l'application
Declare Start()
Declare CopyClipboardImage()
Declare Exit()

Start()

Procedure Start()
  Protected font = LoadFont(#PB_Any, "", 30)
  
  OpenWindow(0, 0, 0, 800, 600, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  
  CanvasGadget(0, 0, 0, 800, 600)
  
  StartDrawing(CanvasOutput(0))
  Box(0, 0, 800, 600, RGB(128, 128, 128))
  
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(FontID(font))
  DrawText(100, 100, "Test copie image")
  StopDrawing()
   
  
  ;Triggers
  BindGadgetEvent(0, @CopyClipboardImage(), #PB_EventType_RightClick)
  
  BindEvent(#PB_Event_CloseWindow, @Exit())
  
  Repeat : WaitWindowEvent() : ForEver
EndProcedure

Procedure CopyClipboardImage()
  If StartDrawing(CanvasOutput(0) )
    W = OutputWidth()
    H = OutputHeight()
    Image = GrabDrawingImage(#PB_Any, 0, 0, W, H)
    StopDrawing()
    SetClipboardImage(Image)
    FreeImage(Image)
  EndIf 
  Debug "copy effectuée "
EndProcedure

Procedure Exit()  
  End
EndProcedure
Configuration : Windows 11 Famille 64-bit - PB 6.03 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
Philippe_GEORGES
Messages : 112
Inscription : mer. 28/janv./2009 13:28

Re: Copier le contenu d'un canvasgadget dans le presse papie

Message par Philippe_GEORGES »

Falsam,

Ton message s'est croisé avec le mien !!

ça marche grâce à ton exemple.... Inutile de te dire à quel point je me trouve bête !

Code : Tout sélectionner

   If EventType()= #PB_EventType_LeftDoubleClick      ; copie presse papier
    imageId = GetGadgetAttribute(#canvas_carte, #PB_Canvas_Image)
    image = CreateImage(#PB_Any, GadgetWidth(#canvas_carte), GadgetHeight(#canvas_carte))
    StartDrawing(ImageOutput(image))
    DrawImage(imageId, 0, 0)
    StopDrawing()  
    SetClipboardImage(image)   
    MessageRequester("Information","Image copiée dans le presse papier");
  EndIf
Grand merci de ton aide,

Phil
Philippe GEORGES
"La simplicité est la sophistication suprême" (De Vinci)
assistance informatique, création de logiciels
georges.informatique@gmail.com
Répondre