Page 1 of 1

BitBlt_ with Gadget;

Posted: Sun Mar 13, 2016 8:34 am
by HanPBF
Hello!

At the moment I use BitBlt_ to make a screenshot which works seemless.

Code: Select all

protected hImage = createImage(#PB_Any, W, H)
protected hDC = startDrawing(ImageOutput(hImage))
		
if hDC
  bitBlt_(hDC, 0, 0, W, H, GetDC_(windowId(*W\PB)), 0, 0, #SRCCOPY)
  ;BitBlt_(trgDC, 0, 0, Width, Height, srcDC, Left, Top, #SRCCOPY) 
  stopDrawing()
endif
The same with

Code: Select all

GetDC_(GadgetID(PB))
does not work.

Is there another function needed than GetDC?

Thanks a lot,
regards!

Re: BitBlt_ with Gadget;

Posted: Sun Mar 13, 2016 11:44 am
by RSBasic

Re: BitBlt_ with Gadget;

Posted: Sun Mar 13, 2016 1:59 pm
by HanPBF
Ah, thanks a lot for the link!

Re: BitBlt_ with Gadget;

Posted: Sun Mar 13, 2016 2:13 pm
by RASHAD
Copy any part of your window as long as it is on top

Code: Select all

UseJPEG2000ImageDecoder()
UseJPEG2000ImageEncoder()
UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()

#CAPTUREBLT = $40000000

Procedure capANY(gadget,savName$,format$)
  hBitmap = CreateImage(10,GadgetWidth(gadget),GadgetHeight(gadget))
  hdc = StartDrawing(ImageOutput(10))
  SelectObject_(hdc, hBitmap)
  BitBlt_(hdc,0,0 ,GadgetWidth(gadget),GadgetHeight(gadget), GetDC_(0), GadgetX(gadget,#PB_Gadget_ScreenCoordinate),GadgetY(gadget, #PB_Gadget_ScreenCoordinate), #SRCCOPY | #CAPTUREBLT)
  StopDrawing()
  sName$ = savName$+"."+format$
  If format$ = "BMP"
    SaveImage(10,sName$,#PB_ImagePlugin_BMP)
  ElseIf format$ = "PNG"
    SaveImage(10,sName$,#PB_ImagePlugin_PNG)
  ElseIf format$ = "JPG"
    SaveImage(10,sName$,#PB_ImagePlugin_JPEG)
  EndIf
  FreeImage(10)
  DeleteDC_(hdc)
EndProcedure   

OpenWindow(0,0,0,400,300,"Test",#PB_Window_SystemMenu| #PB_Window_ScreenCentered| #PB_Window_MaximizeGadget| #PB_Window_SizeGadget)
EditorGadget(0,10,10,380,140)
For a = 0 To 5
  AddGadgetItem(0, a, "Line "+Str(a))
Next
bHnd = LoadImage_(0, #PB_Compiler_Home+"Examples\Sources\Data\File.bmp",#IMAGE_BITMAP	,64,64,#LR_LOADFROMFILE|#LR_LOADTRANSPARENT	)
ButtonImageGadget(1,10,160,64,64,bHnd)
ButtonGadget(2,10,270,60,20,"TEST")

Repeat
           
  Select WaitWindowEvent()
      
      Case #PB_Event_CloseWindow
            Quit = 1       
      
      Case #PB_Event_Gadget
          Select EventGadget()
           Case 2              
              capANY(0,"d:\cap_test","PNG")
          EndSelect
          
  EndSelect 

Until Quit = 1
End

Re: BitBlt_ with Gadget;

Posted: Sun Mar 13, 2016 7:24 pm
by HanPBF
Thanks RASHAD!

So I can create a textgadget, catch the image, and be able to drawimage on a canvas; the white background filtering should be easy possible.

RSBasic/RASHAD -> Thanks a lot for the help!

Re: BitBlt_ with Gadget;

Posted: Sun Mar 13, 2016 7:47 pm
by RASHAD
With computing I do not say yes or no without testing :)
So it is YES
More advanced example

Code: Select all

UseJPEG2000ImageDecoder()
UseJPEG2000ImageEncoder()
UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()

#CAPTUREBLT = $40000000

Procedure capANY(gadget,sName$,x,y,width,height)
  If gadget < 0
    hBitmap = CreateImage(10,width,height)
  Else
    hBitmap = CreateImage(10,GadgetWidth(gadget),GadgetHeight(gadget))
  EndIf
  hdc = StartDrawing(ImageOutput(10))
    SelectObject_(hdc, hBitmap)
    If gadget < 0
      BitBlt_(hdc,0,0 ,width,height, GetDC_(0), x, y, #SRCCOPY | #CAPTUREBLT)
    Else
      BitBlt_(hdc,0,0 ,GadgetWidth(gadget),GadgetHeight(gadget), GetDC_(0), GadgetX(gadget,#PB_Gadget_ScreenCoordinate),GadgetY(gadget, #PB_Gadget_ScreenCoordinate), #SRCCOPY | #CAPTUREBLT)
    EndIf
  StopDrawing()
;   ext$ = LCase(GetExtensionPart(sName$))
;   If ext$ = "bmp"
;     SaveImage(10,sName$,#PB_ImagePlugin_BMP)
;   ElseIf ext$ = "png"
;     SaveImage(10,sName$,#PB_ImagePlugin_PNG)
;   ElseIf ext$ = "jpg"
;     SaveImage(10,sName$,#PB_ImagePlugin_JPEG)
;   EndIf
;   FreeImage(10)
  DeleteDC_(hdc)
EndProcedure   

LoadFont(0,"Georgia",24,#PB_Font_Bold )
OpenWindow(0,0,0,400,300,"Test",#PB_Window_SystemMenu| #PB_Window_ScreenCentered| #PB_Window_MaximizeGadget| #PB_Window_SizeGadget)
TextGadget(0,10,5,380,40,"Text Test",#SS_CENTERIMAGE|#SS_CENTER)
SetGadgetColor(0,#PB_Gadget_BackColor,$FFFFFF)
SetGadgetColor(0,#PB_Gadget_FrontColor,$0000FF)
SetGadgetFont(0,FontID(0))
CanvasGadget(1,10,50,380,100)
hIcon = ExtractIcon_(#Null, "C:\windows\explorer.exe", 2)
;bHnd = LoadImage_(0, #PB_Compiler_Home+"Examples\Sources\Data\File.bmp",#IMAGE_BITMAP	,64,64,#LR_LOADFROMFILE|#LR_LOADTRANSPARENT	)
hIcon2 = CopyImage_(hIcon,#IMAGE_ICON,32,32,#LR_COPYDELETEORG)
ButtonImageGadget(2,10,160,48,48,hIcon2)
ButtonGadget(3,10,270,60,20,"TEST")

Repeat
           
  Select WaitWindowEvent()
      
      Case #PB_Event_CloseWindow
            Quit = 1       
      
      Case #PB_Event_Gadget
          Select EventGadget()
           Case 3           
              capANY(0,"d:\cap_test.jpg",WindowX(0),WindowY(0),WindowWidth(0)+6, WindowHeight(0)+34)
              SetGadgetAttribute(1,#PB_Canvas_Image ,ImageID(10))
          EndSelect
          
  EndSelect 

Until Quit = 1
End

Re: BitBlt_ with Gadget;

Posted: Sun Mar 13, 2016 10:01 pm
by mestnyi
Does not work with all gadget do not know how to achieve this ?

Code: Select all

;Autor: netmaestro

EnableExplicit

Define EventID
Global PrintWindow_

OpenLibrary(0, "user32.dll")
Prototype PrintWindow(hwnd, hdc, flags)
PrintWindow_.PrintWindow = GetFunction(0, "PrintWindow")

Procedure CaptureGadget(Gadgetnummer,Imagenummer)
  Protected listrect.RECT
  Protected width
  Protected height
  Protected hdc
  
  GetWindowRect_(GadgetID(Gadgetnummer), @listrect.RECT)
  width = listrect\right-listrect\left
  height = listrect\bottom-listrect\top
  CreateImage(0, width, height, 24)
  hdc = StartDrawing(ImageOutput(0))
  PrintWindow_(GadgetID(Gadgetnummer), hdc, #Null)
  StopDrawing()
  
EndProcedure

If OpenWindow(0,0,0,500,400,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  ButtonGadget(1,10,10,WindowWidth(0)-20,100,"Spalte 1")
  
  ImageGadget(2,10,120,0,0,0,0)
  
  CaptureGadget(1,2)
  SetGadgetState(2,ImageID(0))
  
  Repeat
    EventID=WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf
That's kind of works well

Code: Select all

#CAPTUREBLT = $40000000

Procedure capANY(Output,x,y,width,height)
  Protected hdc = StartDrawing(Output)
  BitBlt_(hdc,0,0 ,width,height, GetDC_(0), x, y, #SRCCOPY | #CAPTUREBLT)
  StopDrawing()
EndProcedure   

LoadFont(0,"Georgia",24,#PB_Font_Bold )
OpenWindow(10,0,0,400,300,"Test",#PB_Window_SystemMenu| #PB_Window_ScreenCentered| #PB_Window_MaximizeGadget| #PB_Window_SizeGadget)
ButtonGadget(0,10,5,380,40,"Text Test")
SetGadgetFont(0,FontID(0))

CanvasGadget(1,10,50,380,100)

ButtonGadget(3,10,270,60,20,"TEST")

Repeat
  
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Quit = 1       
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 3           
          capANY(CanvasOutput(1),GadgetX(0, #PB_Gadget_ScreenCoordinate),GadgetY(0, #PB_Gadget_ScreenCoordinate),GadgetWidth(0), GadgetHeight(0))
      EndSelect
      
  EndSelect 
  
Until Quit = 1
End