Copie en image d'un gadget.

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Copie en image d'un gadget.

Message par GallyHC »

Bonjour,

Je voudrais savoir si apres avoir creer un gadget il serait possible de copier en memoire l'image de ce gadget et tout cela en pure code PureBasic?

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Copie en image d'un gadget.

Message par venom »

salut GallyHC,
qu'entend tu par copier l'image ?






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Copie en image d'un gadget.

Message par GallyHC »

en fait, est'il possible de faire une fonction qui ferait la capture en memoire d'un gadget?

cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
mekkisoft
Messages : 22
Inscription : mar. 07/juil./2009 16:45
Contact :

Re: Copie en image d'un gadget.

Message par mekkisoft »

Bonjour

Que veux tu dire par copier ou capturer l'image d'un gadget?? Je n'ai pas saisi ta question et puis je ne vois pas pourquoi car définir un gadget signifie déjà qu'il est en mémoire pendant le chargement du programme source. Peut être que tu veux copier le type, le nom, l'emplacement et la forme de ce gadget??? C'est ça ta question??
Mekkisoft Editeur de logiciels et sites web
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Copie en image d'un gadget.

Message par GallyHC »

Un gadget sur Windows est une OCX (donc du graphique). Je voudrais savoir si un code pure PB, il est possible faire la capture de l'image du gadget et la mettre en memoire. En pure PB pour que ce soit multi-os.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Re: Copie en image d'un gadget.

Message par Patrick88 »

un code qui permet de créer des "gadgets" en tant qu'image.

Code : Tout sélectionner

; Hroudtwolf
; 2006. PB 4.00
If OpenWindow(0, 0,0, 300, 300, "DrawFrameControl", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
  hdc.l=GetDC_(WindowID(0))
  ;>---Button--->
  For x=0 To 2
    framerect.RECT
    framerect\left=10+(x*40)
    framerect\top=10
    framerect\right=25+(x*40)
    framerect\bottom=25
    DrawFrameControl_(hdc.l,@framerect,#DFC_BUTTON,x)
  Next x
  ;<---Button---<
  ;>---Titlebar Buttons--->
  For x=0 To 4
    framerect.RECT
    framerect\left=10+(x*40)
    framerect\top=50
    framerect\right=40+(x*40)
    framerect\bottom=80
    DrawFrameControl_(hdc.l,@framerect,#DFC_CAPTION,x)
  Next x
  ;<---Titlebar Buttons---<
  ;>---Scroll Buttons--->
  For x=0 To 3
    framerect.RECT
    framerect\left=10+(x*40)
    framerect\top=90
    framerect\right=40+(x*40)
    framerect\bottom=120
    DrawFrameControl_(hdc.l,@framerect,#DFC_SCROLL,x)
  Next x
  ;<--Scroll Buttons---<
  ;>---Menü--->
  For x=0 To 2
    framerect.RECT
    framerect\left=10+(x*40)
    framerect\top=130
    framerect\right=40+(x*40)
    framerect\bottom=150
    DrawFrameControl_(hdc.l,@framerect,#DFC_MENU,x)
  Next x
  ;<--Menü---<

  ReleaseDC_(WindowID(0),hdc.l)
  Repeat:Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
End 
; IDE Options = PureBasic 4.40 Beta 6 (Windows - x86)
; CursorPosition = 48
; FirstLine = 4
; Folding = -
; CompileSourceDirectory
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Re: Copie en image d'un gadget.

Message par Patrick88 »

code qui permet de capturer l'image de la fenêtre et les gadgets qui la composent

ces 2 codes ne sont pas portables, ils utilisent tout 2 des appels aux api de windows
si tu parviens à faire une capture d'écran portable tout OS, j'achète...

Code : Tout sélectionner

; fonctionne

Enumeration
  #FEN_PRINCIPALE

  #Gadget_button
  #Gadget_string
  #gadget_list
  
  #Img_ZoneGraphique
  
  #GDT_SCR_ZONE_DESSIN
  #GDT_IMG_ZONE_DESSIN
EndEnumeration

Structure STRU_FENETRE
  coord_X.w:coord_Y.w:Largeur.w:Hauteur.w
  options.l
  titre.s
  Coord_X_Barre_chg_vue.w : Coord_Y_Barre_chg_vue.w
  Largeur_Barre_chg_vue.w : Hauteur_Barre_chg_vue.w
  
  Scr_Area_X.w:Scr_Area_Y.w:Scr_Area_Largeur.w:Scr_Area_Hauteur.w
  Scr_Area_Largeur_Max.w : Scr_Area_Hauteur_Max.w
  Scr_Area_deplacement.w
  Scr_Area_options.l
EndStructure

Global  INFO.STRU_FENETRE

Procedure.l capture_Gadget(PX.w,PY.w,PW.w,PH.w)
  dm.DEVMODE ;structure for CreateDC()
  srcDC.l
  trgDC.l
  BMPHandle.l

  largeur_bordure_fenetre.w = GetSystemMetrics_(#SM_CXDLGFRAME)+GetSystemMetrics_(#SM_CXBORDER)
  hauteur_bordure_fenetre.w = GetSystemMetrics_(#SM_CYDLGFRAME)+GetSystemMetrics_(#SM_CYMENUSIZE)+2*GetSystemMetrics_(#SM_CYBORDER)
  srcDC = CreateDC_("DISPLAY", "", "", dm)
  trgDC = CreateCompatibleDC_(srcDC)
  BMPHandle = CreateCompatibleBitmap_(srcDC, PW, PH)
  SelectObject_( trgDC, BMPHandle)
  ;BitBlt_( trgDC, 0, 0, PW, PH, srcDC, INFO\coord_X+largeur_bordure_fenetre+PX, INFO\coord_Y+PY+hauteur_bordure_fenetre, #SRCCOPY)
  BitBlt_( trgDC, 0, 0, PW, PH, srcDC, largeur_bordure_fenetre+PX, PY+hauteur_bordure_fenetre, #SRCCOPY)
  OpenClipboard_(#Null) 
  EmptyClipboard_()
  SetClipboardData_(#CF_BITMAP	, BMPHandle)
  DeleteDC_( trgDC)
  ReleaseDC_( BMPHandle, srcDC)
  ciHwnd = GetClipboardData_(#CF_BITMAP) 
  If ciHwnd 
    GetObject_(ciHwnd, SizeOf(BITMAP), bm.BITMAP) 
    result.l = CreateImage(#PB_Any, PW, PH) 
    StartDrawing(ImageOutput(result)) 
    DrawImage(ciHwnd, 0, 0) 
    StopDrawing()
  EndIf 
  CloseClipboard_()
  ProcedureReturn result 
EndProcedure

Procedure.l capture_window(PX.w,PY.w,PW.w,PH.w)
  dm.DEVMODE ;structure for CreateDC()
  srcDC.l
  trgDC.l
  BMPHandle.l
  
  largeur_bordure_fenetre.w = 2*GetSystemMetrics_(#SM_CXDLGFRAME)+2*GetSystemMetrics_(#SM_CXBORDER)
  hauteur_bordure_fenetre.w = 2*GetSystemMetrics_(#SM_CYDLGFRAME)+3*GetSystemMetrics_(#SM_CYBORDER)+GetSystemMetrics_(#SM_CYMENUSIZE)
  
  srcDC = CreateDC_("DISPLAY", "", "", dm)
  trgDC = CreateCompatibleDC_(srcDC)
  BMPHandle = CreateCompatibleBitmap_(srcDC, PW+largeur_bordure_fenetre, PH+hauteur_bordure_fenetre)
  SelectObject_( trgDC, BMPHandle)
  BitBlt_( trgDC, 0, 0, PW+largeur_bordure_fenetre, PH+hauteur_bordure_fenetre, srcDC, PX, PY, #SRCCOPY)
  OpenClipboard_(#Null) 
  EmptyClipboard_()
  SetClipboardData_(#CF_BITMAP	, BMPHandle)
  DeleteDC_( trgDC)
  ReleaseDC_( BMPHandle, srcDC)
  ciHwnd = GetClipboardData_(#CF_BITMAP) 
  If ciHwnd 
    GetObject_(ciHwnd, SizeOf(BITMAP), bm.BITMAP) 
    result.l = CreateImage(#PB_Any, PW+largeur_bordure_fenetre, PH+hauteur_bordure_fenetre) 
    StartDrawing(ImageOutput(result)) 
    DrawImage(ciHwnd, 0, 0) 
    StopDrawing()
  EndIf 
  CloseClipboard_()
  ProcedureReturn result 
EndProcedure

Procedure WindowCallback(WindowID, Message, lParam, wParam)
  If Message = #WM_PAINT
    StartDrawing(ImageOutput(WindowID))
    DrawImage(ImageID(#Img_ZoneGraphique), 0, 0)
    StopDrawing()
  EndIf
  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

Procedure RedessineZoneGraphique()
  couleur.w = $FF
  If IsImage(#Img_ZoneGraphique)<>0
    FreeImage(#Img_ZoneGraphique)
  EndIf
  If CreateImage(#Img_ZoneGraphique, INFO\Scr_Area_Largeur_Max,INFO\Scr_Area_Hauteur_Max)
    StartDrawing(ImageOutput(#Img_ZoneGraphique))
    Box(0,0,INFO\Scr_Area_Largeur_Max,INFO\Scr_Area_Hauteur_Max,RGB(128,128,128))
    
    StopDrawing() 
  EndIf
  
EndProcedure

Procedure Draw_Window(PX.w,PY.w,Id_window.l)
  
  StartDrawing(WindowOutput(#FEN_PRINCIPALE)) ; dessine l'image caturée...
  DrawImage(ImageID(Id_window) , PX, PY)
  StopDrawing()
EndProcedure

Procedure Draw_Gadget(PX.w,PY.w,Id_gadget.l)
  StartDrawing(WindowOutput(#FEN_PRINCIPALE)) ; dessine l'image caturée...
  DrawImage(ImageID(Id_gadget) , PX, PY)
  StopDrawing()
EndProcedure

Procedure Open_FenetrePrincipale()

  LB_quit.b = 0
  LL_event.l = 0
  
  INFO\coord_X = 100 : INFO\coord_Y = 100
  INFO\Largeur = 400 : INFO\Hauteur = 400
  INFO\options = #PB_Window_SystemMenu | #PB_Window_SizeGadget
  INFO\titre = "RAD 0.1.5"
  
  INFO\Scr_Area_X = 5 : INFO\Scr_Area_Y = 5
  INFO\Scr_Area_Largeur = INFO\Largeur-INFO\Scr_Area_X : INFO\Scr_Area_Hauteur = INFO\Hauteur
  INFO\Scr_Area_Largeur_Max = 1600 : INFO\Scr_Area_Hauteur_Max = 1200
  INFO\Scr_Area_deplacement = 30
  INFO\Scr_Area_options = #PB_ScrollArea_Single
   
  If OpenWindow(#FEN_PRINCIPALE,INFO\coord_X,INFO\coord_Y,INFO\Largeur,INFO\Hauteur,INFO\titre,INFO\options)
    If CreateGadgetList(WindowID(#FEN_PRINCIPALE))
      col.w = 5 : lig.w = 5  : haut1.w = 20
      ButtonGadget(#Gadget_button,10,20,80,20,"Bouton1")
      StringGadget(#Gadget_string,10,50,120,20,"String1")
      ListIconGadget(#gadget_list,10,70,200,200,"Essai",50)
      ;ScrollAreaGadget(#GDT_SCR_ZONE_DESSIN, INFO\Scr_Area_X, INFO\Scr_Area_Y,INFO\Scr_Area_Largeur,INFO\Scr_Area_Hauteur, INFO\Scr_Area_Largeur_Max, INFO\Scr_Area_Hauteur_Max,INFO\Scr_Area_deplacement ,INFO\Scr_Area_options)
      ;ImageGadget(#GDT_IMG_ZONE_DESSIN,0,0,INFO\Scr_Area_Largeur_Max,INFO\Scr_Area_Hauteur_Max,UseImage(#Img_ZoneGraphique))
      
      ;CloseGadgetList()
    EndIf
    INFO\coord_X = WindowX(#FEN_PRINCIPALE) : INFO\coord_Y = WindowY(#FEN_PRINCIPALE)
    ;capture_Gadget(0,0,80,20)
    ;HideGadget(#Gadget_button,1)
    LB_quit = 0
    Repeat
      LL_event = WaitWindowEvent()
      
      
      Select LL_event
        Case #PB_Event_Gadget
          Select EventGadget()
            Case #Gadget_button
              
              gadget1.l = capture_Gadget(INFO\coord_X+10,INFO\coord_Y+20,80,20)
              HideGadget(#Gadget_button,1)
              gadget2.l = capture_Gadget(INFO\coord_X+10,INFO\coord_Y+50,120,20)
              HideGadget(#Gadget_string,1)
              gadget3.l = capture_Gadget(INFO\coord_X+10,INFO\coord_Y+70,200,200)
              HideGadget(#gadget_list,1)
              
              fenetre1.l = capture_window(INFO\coord_X,INFO\coord_Y,INFO\Largeur,INFO\Hauteur)
              ResizeWindow(#FEN_PRINCIPALE,-1,-1,INFO\Largeur+50,INFO\Hauteur+70)
              Draw_Window(25,25,fenetre1)
              Draw_Gadget(25+5,25+25,gadget1)
              Draw_Gadget(25+15,25+45,gadget2)
              Draw_Gadget(25+25,25+65,gadget1)
              Draw_Gadget(25+25,25+105,gadget3)
              
          EndSelect
        Case #PB_Event_CloseWindow
          LB_quit = 2
        
      EndSelect
    Until LB_quit > 0
  EndIf
EndProcedure

Open_FenetrePrincipale()
; IDE Options = PureBasic v3.94 (Windows - x86)
; CursorPosition = 56
; FirstLine = 52
; Folding = -
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Copie en image d'un gadget.

Message par GallyHC »

Merci pour vos codes le seul problème est que j'aimerais un code qui ne soit pas que Windows, encore merci.
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Re: Copie en image d'un gadget.

Message par Patrick88 »

bah, pfff, oui mais...

ah bin, si t'as l'appareil photo numérique, clic tu prends la photo, transfert via usb, et zou, pis c'est portable... quoique le mac, des fois, ça pense pas comme les autres OS

:mrgreen: :mrgreen: :mrgreen:

pat
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Copie en image d'un gadget.

Message par GallyHC »

Bonjour Patrick88,

Ouep pour le oui mais, pk sa repond pas exactement a ce que voufrais, mais ce n'est pas un prob. Je demandais ce qui est possible a faire en code PureBasic pas avec des fonction windows.

Et cela juste pour essaye de palier le problème de mettre un imagegadget et fond et des Gadget par dessus.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

Re: Copie en image d'un gadget.

Message par Patrick88 »

GallyHC a écrit :Et cela juste pour essaye de palier le problème de mettre un imagegadget et fond et des Gadget par dessus.
sans la fonction de windows "BitBlt_" je ne sais/vois pas comment faire...
peut-être avec le "printscreen" mais est ce que c'est portable ?

pat
Warkering
Messages : 808
Inscription : ven. 08/janv./2010 1:14
Localisation : Québec, Canada

Re: Copie en image d'un gadget.

Message par Warkering »

La touche Print Screen, elle est réservé Windows et Linux ou non?
Car sinon, une idée plutôt tordu, ce serait que tu fait un appui virtuel sur cette touche pour sauvegarder l'image de l'écran en mémoire, obtiens les coordonnées de la fenêtre et du gadget en question ainsi que ces dimensions et sauvegarde le tout en une image.
Tordu et simple à dire, mais je sais pas si c'est faisable! :lol:
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Copie en image d'un gadget.

Message par venom »

Warkering a écrit :La touche Print Screen, elle est réservé Windows et Linux ou non?
Car sinon, une idée plutôt tordu, ce serait que tu fait un appui virtuel sur cette touche pour sauvegarder l'image de l'écran en mémoire, obtiens les coordonnées de la fenêtre et du gadget en question ainsi que ces dimensions et sauvegarde le tout en une image.
Tordu et simple à dire, mais je sais pas si c'est faisable! :lol:
j'y est penser mais comment va t'il savoir quel gadget a imprimé. si non oui si il connais les taille et position un screenshot et redecoupage de l'image peut se faire.







@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Copie en image d'un gadget.

Message par kernadec »

bonsoir
Cet API Bitblt de Windows
doit bien y avoir un équivalent pour récupérer une zone écran sous Linux et Mac
il suffit de faire apparaitre les boutons avec une boucle avant le screenshot
pour Vista et W7 mettre un dossier C:\temp

Cordialement

Code : Tout sélectionner


Enumeration
  #Window_0
  #Button_0
  #Button_1
  #Button_2
  #zoneimage
EndEnumeration
UseJPEGImageEncoder() 
lecteur$="C:\"

hwnd=OpenWindow(#Window_0, 0, 0, 400, 400,"test save zone", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
CreateImage(#zoneimage,408, 432)

DC=StartDrawing(ImageOutput(#zoneimage))	

ButtonGadget(#Button_2, 55, 200, 70, 35, "OK",#WS_DLGFRAME)

ButtonGadget(#Button_0, 55, 295, 70, 35, "OK")
ButtonGadget(#Button_1, 270, 295, 80, 35,"Annuler",#WS_DLGFRAME) ;#WS_BORDER 

For i=1 To 50  ; boucle de dessin des boutons sur la fenetre avant screenshot
  WindowEvent()
Next i

BitBlt_(DC,0,0,ImageWidth(#zoneimage),ImageHeight(#zoneimage)+32,GetDC_(hwnd),-4,-27,#SRCCOPY)

StopDrawing() 

SaveImage(#zoneimage,lecteur$+"nom-image-temp"+".jpg",#PB_ImagePlugin_JPEG) 

Repeat: Until WindowEvent() = #PB_Event_CloseWindow

Warkering
Messages : 808
Inscription : ven. 08/janv./2010 1:14
Localisation : Québec, Canada

Re: Copie en image d'un gadget.

Message par Warkering »

Bah, tu prend les coordonnées du gadget, le X, le Y, par rapport à la fenêtre ainsi que sa largeur et sa hauteur. Tu prend par exemple la position de la fenêtre et là tu rajoute la position du gadget, tu prend seulement la taille du gadget, blablabla...
Demande moi pas comment faire, par exemple! :x

Edit : Mauvais smiley! -> :mrgreen:
Répondre