FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Daniel Garcia - capturar la imagen de la pantalla - win 7
Posts: 1286
Joined: Mon Feb 25, 2008 02:54 PM
Daniel Garcia - capturar la imagen de la pantalla - win 7
Posted: Tue Jul 20, 2010 05:58 PM

Ola Daniel,

Tenho uma função que usa:

ownd:SaveToBmp( cFile )

para capturar la imagen de la pantalla como lo ve el usuario.

porem no WINDOWS SEVEN (com o tema do proprio windows seven) só captura a imagem da window principal do sistema, ou seja, se eu tiver uma DIALOG aberta no WIN 7 não mostra na imagem.

se trocar o tema do windows seven para o tema classico funciona perfeitamente.

Alguma dica do que pode estar acontecendo?

Muito obrigado

ubiratanmga@gmail.com

FWH24.04
BCC7.3
HARBOUR3.2
xMate
Pelles´C
TDolphin
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Daniel Garcia - capturar la imagen de la pantalla - win 7
Posted: Wed Jul 21, 2010 12:48 AM
SGS

es un "problema"(?) de window por las transparencias cuando el AERO esta activado, la funcion SaveToBmp toma el DC del control que lo llama y lo convierte en Bitmap, cuando el AERO esta activado el mensajes de pintado para los controles funcionan distinto pues usan otras tecnicas de pintado para lograr transparencias, con AERO desactivado, las transparencias son "simuladas" ya que se pintan sobre el DC de la ventana los controles que estan sobre ellas ( que no son CHILD ) y asi evitar los parpadeos, puedes ver esta situacion colocando el dialogo fuera del area de la ventana prinicpal y usa SaveToBmp().
En el api de window despues se hizo la funcion PrintWindow para trabajar de forma igual con cada thema, te dejo una funcion un ejemplo que lo veas funcionando y trabaja igual en cada caso


Code (fw): Select all Collapse
#include "FiveWin.ch"

static oWnd, oMenu, oDlg

//----------------------------------------------------------------------------//

function main()

   DEFINE WINDOW oWnd from 1,1 TO 30,60 TITLE "Testing SaveToBmp/PrintWindow";
         MENU bldMenu()

   SET MESSAGE of oWnd to "DIALOG from HELL!!"

   ACTIVATE WINDOW oWnd

return NIL

//----------------------------------------------------------------------------//

function bldMenu()

   local oMenu

   MENU oMenu
      MENUITEM "Start dialog box" ;
        ACTION startDia()

      MENUITEM "&Exit" ;
        ACTION oWnd:end()

   ENDMENU

return oMenu


//----------------------------------------------------------------------------//

function startDia()

   local i,cVar:="lalalalala",cVar1:="hoplalalalala"

   DEFINE DIALOG oDlg FROM 1,10 TO 24,60 OF oWnd

   for i := 1 to 20
      @i,1 SAY "This is a line of text" OF oDlg
   next

   @ 1, 12 BUTTON "SaveToBmp" OF oDlg ACTION oWnd:SaveToBmp( "SaveToBmp.bmp" )
   @ 3, 12 BUTTON "Print window" OF oDlg ACTION SaveToBmp2( oWnd, "PrintWnd.bmp" )

   ACTIVATE DIALOG oDlg

return NIL

//----------------------------------------------------------------------------//

Function SaveToBmp2( oWnd, cBmpFile )
   
   local hDeskDC := GetDC( GetDesktopWindow() )
   local hDC  := CreateCompatibleDC( hDeskDC )
   local hOldBmp
   local hDib 
   local hBmp
   local arect := GetWndRect( oWnd:hWnd )
   
   hBmp = CreateCompatibleBitmap( hDeskDC, arect[ 4 ] - arect[ 2 ], arect[ 3 ] - arect[ 1 ]  )

   hOldBmp = SelectObject( hDC, hBmp )
   
   PrintWindow( oWnd:hWnd, hDC )
   
   SelectObject( hDC, hOldBmp )
   DeleteDC( hDC )
   hDib = DibFromBitmap( hBmp )
   DibWrite( cBmpFile, hDib )
   GloBalFree( hDib )
   DeleteObject( hBmp )

return ( File( cBmpFile ) )
Posts: 1286
Joined: Mon Feb 25, 2008 02:54 PM
Re: Daniel Garcia - capturar la imagen de la pantalla - win 7
Posted: Wed Jul 21, 2010 05:41 PM
Daniel,

Imagine que estou nesta dialog:



aperto uma tecla que chama a funcao ownd:SaveToBmp( cFile ) e fica assim:



Eu preciso que a dialog apareça.

Testei o seu exemplo e continua com o mesmo problema.
ubiratanmga@gmail.com

FWH24.04
BCC7.3
HARBOUR3.2
xMate
Pelles´C
TDolphin
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Daniel Garcia - capturar la imagen de la pantalla - win 7
Posted: Wed Jul 21, 2010 06:35 PM
SGS

es que asi deberia funcionar...
se puede hacer un SaveScreen y tomara todo lo que muestre el escritorio

Code (fw): Select all Collapse
#include "FiveWin.ch"

#define SRCCOPY          0x00CC0020
#define SM_CXSCREEN      0 
#define SM_CYSCREEN      1

static oWnd, oMenu, oDlg


//----------------------------------------------------------------------------//

function main()

   DEFINE WINDOW oWnd from 1,1 TO 30,60 TITLE "Testing SaveToBmp/PrintWindow";
         MENU bldMenu()

   SET MESSAGE of oWnd to "DIALOG from HELL!!"

   ACTIVATE WINDOW oWnd

return NIL

//----------------------------------------------------------------------------//

function bldMenu()

   local oMenu

   MENU oMenu
      MENUITEM "Start dialog box" ;
        ACTION startDia()

      MENUITEM "&Exit" ;
        ACTION oWnd:end()

   ENDMENU

return oMenu


//----------------------------------------------------------------------------//

function startDia()

   local i,cVar:="lalalalala",cVar1:="hoplalalalala"

   DEFINE DIALOG oDlg FROM 1,10 TO 24,60 OF oWnd

   for i := 1 to 20
      @i,1 SAY "This is a line of text" OF oDlg
   next

   @ 1, 12 BUTTON "SaveToBmp" OF oDlg ACTION oWnd:SaveToBmp( "SaveToBmp.bmp" )
   @ 3, 12 BUTTON "Print window" OF oDlg ACTION SaveToBmp2( oWnd, "PrintWnd.bmp" )

   ACTIVATE DIALOG oDlg

return NIL

//----------------------------------------------------------------------------//

Function SaveToBmp2( oWnd, cBmpFile )
   
   local hDeskDC := GetDC( GetDesktopWindow() )
   local hDC  := CreateCompatibleDC( hDeskDC )
   local hOldBmp
   local hDib 
   local hBmp
   local nWidth := GetSysMetrics( SM_CXSCREEN )
   local nHeight := GetSysMetrics( SM_CYSCREEN )
   
      
   hBmp = CreateCompatibleBitmap( hDeskDC, nWidth, nHeight )

   hOldBmp = SelectObject( hDC, hBmp )
   
   //PrintWindow( oWnd:hWnd, hDC )
   BitBlt( hDC, 0, 0, nWidth, nHeight, hDeskDC, 0, 0, SRCCOPY )
   
   SelectObject( hDC, hOldBmp )
   DeleteDC( hDC )
   hDib = DibFromBitmap( hBmp )
   DibWrite( cBmpFile, hDib )
   GloBalFree( hDib )
   DeleteObject( hBmp )

return ( File( cBmpFile ) )
Posts: 1286
Joined: Mon Feb 25, 2008 02:54 PM
Re: Daniel Garcia - capturar la imagen de la pantalla - win 7
Posted: Wed Jul 21, 2010 07:27 PM

Daniel,

simplesmente FANTASTICO !!!


Muito obrigado

:D:D:D:D:D:D:D:D:D:D

ubiratanmga@gmail.com

FWH24.04
BCC7.3
HARBOUR3.2
xMate
Pelles´C
TDolphin
Posts: 632
Joined: Thu Jan 19, 2006 10:45 AM
Re: Daniel Garcia - capturar la imagen de la pantalla - win 7
Posted: Fri Nov 30, 2012 07:33 AM

Daniel, no se si esto se ha mejorado, pero cuando ejecuto el programa el BMP que me genera sale casi todo transparente y solo veo los botones de control de la ventana, como la X de salir. Estoy buscando algo para capturar trozos de pantalla pero que el usuario pueda seleccionar lo que quiere coger, que selecciones un cuadro. Sabes como lo puedo hacer?

Andrés

Saludos



Andrés González desde Mallorca
Posts: 1710
Joined: Tue Oct 28, 2008 06:26 PM
Re: Daniel Garcia - capturar la imagen de la pantalla - win 7
Posted: Fri Nov 30, 2012 02:45 PM
Hola amigos


Como se hace para capturar parte del Desktop como lo hace el SAVETOBMP salvando el dialogo.

He intentado cambiando el código de Daniel
Code (fw): Select all Collapse
 BitBlt( hDC, aCoors[4]-300, 112, 290, 400, hDeskDC, aCoors[4]-300,112, SRCCOPY )


Me toma la parte, pero tambien todo el resto del Desktop en negro.

Gracias por la ayuda.

Saludos,

Adhemar
Saludos,



Adhemar C.

Continue the discussion