Page 1 sur 2

Copie en image d'un gadget.

Publié : mar. 03/août/2010 12:08
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

Re: Copie en image d'un gadget.

Publié : mar. 03/août/2010 12:38
par venom
salut GallyHC,
qu'entend tu par copier l'image ?






@++

Re: Copie en image d'un gadget.

Publié : mar. 03/août/2010 13:08
par GallyHC
en fait, est'il possible de faire une fonction qui ferait la capture en memoire d'un gadget?

cordialement,
GallyHC

Re: Copie en image d'un gadget.

Publié : mar. 03/août/2010 16:51
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??

Re: Copie en image d'un gadget.

Publié : mar. 03/août/2010 17:57
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

Re: Copie en image d'un gadget.

Publié : mar. 03/août/2010 18:58
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

Re: Copie en image d'un gadget.

Publié : mar. 03/août/2010 19:03
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 = -

Re: Copie en image d'un gadget.

Publié : mer. 04/août/2010 18:50
par GallyHC
Merci pour vos codes le seul problème est que j'aimerais un code qui ne soit pas que Windows, encore merci.

Re: Copie en image d'un gadget.

Publié : jeu. 05/août/2010 11:26
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

Re: Copie en image d'un gadget.

Publié : jeu. 05/août/2010 11:44
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

Re: Copie en image d'un gadget.

Publié : jeu. 05/août/2010 11:57
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

Re: Copie en image d'un gadget.

Publié : jeu. 05/août/2010 20:07
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:

Re: Copie en image d'un gadget.

Publié : jeu. 05/août/2010 20:41
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.







@++

Re: Copie en image d'un gadget.

Publié : jeu. 05/août/2010 21:17
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


Re: Copie en image d'un gadget.

Publié : jeu. 05/août/2010 21:43
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: