routine de capture d'écran et de gadgets

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Patrick88
Messages : 1564
Inscription : mer. 21/janv./2004 18:24

routine de capture d'écran et de gadgets

Message par Patrick88 »

CaptureFenetre() = capture d'une fenetre crée sous purebasic
CaptureGadget() = capture des gadgets crées sur cette fenetre
CaptureGadget2() = variante de la capture du gadget en passant par le clipboard

curieusement, il faut que la capture des gadgets ou de la fenetre soit appelée dans la boucle d'évenement , sinon l'image de la fenetre ne contient pas les gadgets et l'image des gadgets est vide ??? pas vraiment compris pourquoi...

Code : Tout sélectionner

Enumeration
  #fen0
  #gadget
  #img_fen0
  #img_gadget
EndEnumeration

Procedure CaptureFenetre(ID_image.l,handle_objet,CoordX,CoordY)
  GetWindowRect_(handle_objet,a.rect)

  hBitmap = CreateImage(ID_image, a\right,a\bottom)
  hdc = StartDrawing(ImageOutput(ID_image))
  SelectObject_(hdc, hBitmap)
  result = BitBlt_(hdc, 0,0,a\right,a\bottom, GetDC_(GetDesktopWindow_()), CoordX,CoordY, #SRCCOPY)
  StopDrawing()
  DeleteDC_(hdc)

EndProcedure

Procedure.l CaptureGadget(ID_image.l,handle_objet,CoordX,CoordY,largeur,hauteur)
  GetWindowRect_(handle_objet,a.rect)

  hBitmap = CreateImage(ID_image, largeur,hauteur)
  hdc = StartDrawing(ImageOutput(ID_image))
  SelectObject_(hdc, hBitmap)
  result = BitBlt_(hdc, 0,0,largeur,hauteur, GetDC_(GetDesktopWindow_()), a\left,a\top, #SRCCOPY)
  StopDrawing()
  DeleteDC_(hdc)

EndProcedure

Procedure CaptureGadget2(ID_image.l,handle_objet, left.l, top.l, Width.l, Height.l) ;;; marche
  GetWindowRect_(handle_objet,a.rect)
  
  dm.DEVMODE ;structure for CreateDC()
  srcDC.l
  trgDC.l
  BMPHandle.l
  srcDC = CreateDC_("DISPLAY", "", "", dm)
  trgDC = CreateCompatibleDC_(srcDC)
  BMPHandle = CreateCompatibleBitmap_(srcDC, Width, Height)
  SelectObject_( trgDC, BMPHandle)
  BitBlt_( trgDC, 0, 0, Width, Height, srcDC, a\left, a\top, #SRCCOPY)
  OpenClipboard_(#Null)
  EmptyClipboard_()
  SetClipboardData_(2, BMPHandle)
  ;CloseClipboard_()
  DeleteDC_( trgDC)
  ReleaseDC_( BMPHandle, srcDC)
  
  ciHwnd = GetClipboardData_(#CF_BITMAP)
  If ciHwnd
    GetObject_(ciHwnd, SizeOf(BITMAP), bm.BITMAP)
    CreateImage(ID_image, Width, Height)
    StartDrawing(ImageOutput(ID_image))
      DrawImage(ciHwnd, 0, 0)
    StopDrawing()
  EndIf
EndProcedure


OpenWindow(#fen0,0,0,400,400,"Capture",#PB_Window_SystemMenu)
If CreateGadgetList(WindowID(#fen0))
  ButtonGadget(#gadget,100,50,150,50,"Hello")
EndIf

Repeat
	event = WaitWindowEvent()
	Select event
	  Case #PB_Event_CloseWindow
	    quit = 1
	  Case #PB_Event_Gadget
	    If EventGadget()=#gadget
      	mon_gadget = CaptureGadget(#img_gadget,GadgetID(#gadget),100,50,150,50)
      	ma_fenetre = CaptureFenetre(#img_fen0,WindowID(#fen0),0,0)
      	
      	StartDrawing(WindowOutput(#fen0))
      	DrawImage(ImageID(#img_gadget),100,200)
      	DrawImage(ImageID(#img_gadget),100,250)
      	DrawImage(ImageID(#img_fen0),100,300)
      	StopDrawing()
      EndIf
	EndSelect
Until quit = 1

End
pat