FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Escalar BMP capturado con WndBitmap
Posts: 1088
Joined: Fri Oct 07, 2005 03:33 PM
Escalar BMP capturado con WndBitmap
Posted: Mon Dec 14, 2009 08:24 PM

Holas,

es posible escalar el Bmp capturado con WndBitmap, sin llevar la imagen a disco

saludos

Marcelo

Posts: 1088
Joined: Fri Oct 07, 2005 03:33 PM
Re: Escalar BMP capturado con WndBitmap
Posted: Mon Dec 14, 2009 08:42 PM

Holas,

encontre esta funcion StretchBlt creo que podria ser de ayuda, si tienen otra opcion me gustaria saberla

saludos

Marcelo

Posts: 498
Joined: Thu May 10, 2007 08:30 PM
Re: Escalar BMP capturado con WndBitmap
Posted: Tue Dec 15, 2009 11:25 AM

Con el PALBMPDRAW normal del FWH, lo puedes dibujar mas grande o mas pequeño sin necesidad de tocarlo, no tienes mas que especificar el ancho y el alto que deseas.

Si lo que quieres es guardarlo en dico con otro tamaño, efectivamente tendras que cambiarle el tamaño desde software.

Peaaaaaso de foro...

FWH 2007 - xHarbour - BCC55
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Escalar BMP capturado con WndBitmap
Posted: Tue Dec 15, 2009 12:28 PM
Marcelo,

FWH proporciona ResizeBmp():

http://wiki.fivetechsoft.com/doku.php?id=fivewin_function_resizebmp

ojo que el handle del bitmap resultante es distinto al original por lo que tendrás que destruir hResizedBmp usando DeleteObject( hResizedBmp) cuando termines de usarlo :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1088
Joined: Fri Oct 07, 2005 03:33 PM
Re: Escalar BMP capturado con WndBitmap
Posted: Tue Dec 15, 2009 01:56 PM

Gracias a todos por responder,

Antonio, como no hay documentacion de esta funcion ResizeBmp( hBmp ), a la prueba error, la cosa es asi creo ResizeBmp( hBmp, xPixels, yPixels )
gracias por la ayuda

saludos

Marcelo

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Escalar BMP capturado con WndBitmap
Posted: Tue Dec 15, 2009 01:58 PM
Marcelo,

Está documentada en nuestro wiki desde Septiembre :-)

http://wiki.fivetechsoft.com/doku.php?id=fivewin_function_resizebmp
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1088
Joined: Fri Oct 07, 2005 03:33 PM
Re: Escalar BMP capturado con WndBitmap
Posted: Tue Dec 15, 2009 03:55 PM

Antonio,

tienes razon, lo encontre en los fuentes winapi, muchas gracias....

Ahora otra consulta, el hecho de querer utilizar esta funcion, es crear un navegador de paginas como lo hace Acrobat Reader para el previsualizador de FW,
el problema es como crear las miniaturas desde los EMF, la opcion que veo mas aconsejable es en el rpreview.prg, pero el problema es como pasar de EMF a BMP, alguna idea? capturando el Tmetafile visualizado es posible convertirlo a BMP, pero como hacerlo todos de un tiron.

Haber si hay alguna sugerencia

saludos

Marcelo

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Escalar BMP capturado con WndBitmap
Posted: Tue Dec 15, 2009 11:39 PM

Marcelo,

Supongo que lo mas rápido es crear un nuevo bitmap en memoria, luego seleccionarlo en un hDC y en ese hDC mostrar el EMF, con lo que ya tendriamos el bitmap modificado :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Escalar BMP capturado con WndBitmap
Posted: Tue Dec 15, 2009 11:51 PM
El código (no lo he probado) sería parecido a esto:
Code (fw): Select all Collapse
local hDC := CreateCompatibleDC( 0 )
local hBmp := CreateCompatibleBitmap( hDC, nAncho, nAlto )
local hOldBmp := SelectObject( hDC, hBmp ) // ya tenemos el nuevo bitmap seleccionado en un hDC
local hEMF := GetEnhMetaFile( cFileName ) // nombre del fichero EMF

PlayEnhMetaFile( hDC, hEMF, { 0, 0, nAncho, nAlto } ) // hay que crear esta función para que tome el 3er parametro como un rect

CloseEnhMetafile( hEMF )

SelectObject( hDC, hOldBmp )
DeleteDC( hDC )

en ese momento hBmp debería contener el EMF pintado en él :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1088
Joined: Fri Oct 07, 2005 03:33 PM
Re: Escalar BMP capturado con WndBitmap
Posted: Wed Dec 16, 2009 01:24 AM
Antonio,

viendo la documentacion y codigo fuente de FW, esto deberia funcionar, para probar estoy pasando el Bmp a disco pero no obtengo resultado, he utilizado un Dialogo en lugar del BMP y si pude visualizar el EMF, alguna idea?

Code (fw): Select all Collapse
FUNCTION createBmp()

LOCAL hDib
local hDC := CreateCompatibleDC( 0 )
local hBmp := CreateCompatibleBitmap( hDC, 50, 75 )
local hOldBmp := SelectObject( hDC, hBmp ) // ya tenemos el nuevo bitmap seleccionado en un hDC
local hEMF := GetEnhMetaFile( '1.emf' ) // nombre del fichero EMF

PlayEnhMetaFile( hDC, hEMF,, .T., 50, 75 ) // hay que crear esta función para que tome el 3er parametro como un rect

CloseEnhMetafile( hEMF )

hDib := DibFromBitmap( hBmp )
DibWrite( "file.bmp" , hDib )
GloBalFree( hDib )

SelectObject( hDC, hOldBmp )
DeleteDC( hDC )


RETURN( NIL )
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Escalar BMP capturado con WndBitmap
Posted: Wed Dec 16, 2009 03:03 AM

Hola Marcelo...

Prueba hacer este cambio, pieso que podrias tener problemas en el DC que estas creando para le bitmap

local hDC1 := GetDC( GetDesktopWindow() )
local hDC := CreateCompatibleDC( hDC1 )
ocal hBmp := CreateCompatibleBitmap( hDC1, 50, 75 )

o le pasas un hDC valido a la funcion
FUNCTION createBmp( hDC1 )

el problema puede estar en que si haces un bitmap con un hDC "NULO" este se crea monocromatico
despues de crear el bitmap puedes usar DrawBitmap o PalBmpDraw para probar que este bien

Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Escalar BMP capturado con WndBitmap
Posted: Wed Dec 16, 2009 08:56 AM

Marcelo,

A que te refieres con "no obtengo resultado" ? Se crea ? Está vacio ? No se ve nada ? etc...

Como te indica Daniel, haria falta crear un segundo hDC compatible con el anterior para que no genere un bitmap en blanco y negro.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 1088
Joined: Fri Oct 07, 2005 03:33 PM
Re: Escalar BMP capturado con WndBitmap
Posted: Wed Dec 16, 2009 12:56 PM

Daniel, Antonio

Gracias por la ayuda, he probado con pasar un DC valido como parametro, tambien desde GetDC( GetDesktopWindow() ), entre esas combinaciones
el resultado ha sido un BMP de 24 bit en lugar a uno monocromatico como advirtio Daniel, pero no se pinta el EMF en el BMP.

Antonio, el programa genera el BMP de 50x75 como se especifica pero todo negro, sin el EMF dibujado en el.

Alguna otra opcion...?

Gracias

Marcelo

Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Escalar BMP capturado con WndBitmap
Posted: Wed Dec 16, 2009 01:21 PM

Hola Marcelo...

estas usando mal la funcion PlayEnhMetaFile

mira los parametros que debes pasar

PlayEnhMetaFile( hDC, hEMF, { 0, 0, 50, 75 } )

Posts: 1088
Joined: Fri Oct 07, 2005 03:33 PM
Re: Escalar BMP capturado con WndBitmap
Posted: Wed Dec 16, 2009 01:49 PM
Daniel,

del manual

PlayEnhMetaFile( <hDC>, <hEMF>, [<hWnd>], [<lPrinter>, [<nRightOffset>], [<nBottomOffset>]] ) --> lSuccess

del codigo fuente

Code (fw): Select all Collapse
#ifdef __XPP__
   CLIPPER PLAYENHMET( PARAMS ) // ()  hDC, hMetaFile, hWnd, lPrinter --> lSuccess
#else
   CLIPPER PLAYENHMETAFILE( PARAMS ) // ()  hDC, hMetaFile, hWnd, lPrinter --> lSuccess
#endif
{
   RECT rect;
   BOOL lRet;

   if( _parl( 4 ) ) 
   {
      rect.left = 0;
      rect.top  = 0;
      rect.right  = GetDeviceCaps( ( HDC ) _parnl( 1 ), HORZRES );  
      rect.bottom = GetDeviceCaps( ( HDC ) _parnl( 1 ), VERTRES ); 
      
      if( _parni( 5 ) )
         rect.right += _parni( 5 );
         
      if( _parni( 6 ) )
         rect.bottom += _parni( 6 );    
   } 
   else  
      GetClientRect ( ( HWND )_parnl( 3 ), &rect );

   lRet = ( BOOL ) PlayEnhMetaFile( ( HDC ) _parnl( 1 ), ( HENHMETAFILE ) _parnl( 2 ), &rect );

   if( ! lRet && lRet != ERROR_SUCCESS ) 
   {
      char sBuffer[ 200 ];
      
      wsprintf( sBuffer, "Error (%d) showing Enhanced Metafile\n\nError description:", GetLastError() );
        MessageBox( NULL, sBuffer, ( LPSTR ) "Printing EMF", MB_OK | MB_ICONEXCLAMATION );
   }

   _retl( lRet );
}


Otra duda del codigo que publicaste:

local hDC1 := GetDC( GetDesktopWindow() )
local hDC := CreateCompatibleDC( hDC1 )
ocal hBmp := CreateCompatibleBitmap( hDC1, 50, 75 )

Utilizas hDC1 en CreateCompatibleBitmap, no deberia ser hDC, he probado con ambos pero nada

saludos

Marcelo