FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Antonio , Nuevo c贸digo para gdi+
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Antonio , Nuevo c贸digo para gdi+
Posted: Thu Dec 04, 2014 02:37 PM
Pongo aqui lo ultimo que he a帽adido a gdi+ ....

EN el archivo gdiplus.cpp
Code (fw): Select all Collapse
HB_FUNC( GDIPLUSISEMPTYGRAPHICS)
{
聽 聽Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
聽 聽
聽 聽hb_retl( ( BOOL ) 聽 graphics->IsClipEmpty() ) ;
聽 
}

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

HB_FUNC( GDIPLUSSETSMOOTHINGGRAPHICS )
{
聽 聽Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
聽 聽int nType = 聽hb_parni( 2 );
聽 聽 聽
聽 聽switch (nType){
聽 聽聽
聽 聽聽case 1:
聽 聽聽 聽graphics->SetSmoothingMode( SmoothingModeNone ) ;
聽 聽聽case 2:
聽 聽聽 graphics->SetSmoothingMode( SmoothingModeDefault );
聽 聽 case 3:
聽 聽聽 graphics->SetSmoothingMode( 聽SmoothingModeHighSpeed );聽 
聽 聽聽case 4:
聽 聽聽 graphics->SetSmoothingMode( 聽SmoothingModeHighQuality );聽 聽 聽
聽 聽 case 5:
聽 聽聽 graphics->SetSmoothingMode( 聽SmoothingModeAntiAlias );聽 聽
聽 
聽 聽 } 聽 
聽 聽 聽 聽 聽
}
//----------------------------------------------------------------------------//

HB_FUNC( GDIPLUSIMAGECREATETHUMB )
{ 
聽 Bitmap * newImage = ( Bitmap * ) hb_parnl( 1 );
聽 int nWidth = 聽hb_parni( 2 );
聽 int nHeight = hb_parni( 3 );
聽
聽 Image * hThumb = newImage->GetThumbnailImage( nWidth , nHeight, NULL, NULL );
聽 
聽 hb_retnl( ( HB_LONG ) hThumb );
聽 聽
聽 }

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

HB_FUNC( GDIPLUSCREATEHBITMAPIMAGE )
{ 
聽HBITMAP聽 聽 handle;
聽 聽 int聽聽 聽 聽 聽 error;
聽 聽 
聽Bitmap * newImage = ( Bitmap * ) hb_parnl( 1 );
聽error = 聽newImage->GetHBITMAP( Color( 0,0,0 ), &handle );
聽 
聽 聽 if ( error != 0 )
聽 聽 { 聽
聽 hb_retnl( ( HB_LONG ) NULL );聽
}

聽hb_retnl( ( HB_LONG ) handle );

}

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

HB_FUNC( GDIPLUSGETWIDTHBITMAP)
{
聽 Bitmap * newImage = ( Bitmap * ) hb_parnl( 1 );
聽 hb_retnl( ( HB_LONG ) 聽newImage->GetWidth() );
}

HB_FUNC( GDIPLUSGETHEIGHTBITMAP)
{
聽 Bitmap * newImage = ( Bitmap * ) hb_parnl( 1 );
聽 hb_retnl( ( HB_LONG ) 聽newImage->GetHeight());
}


Aparte tengo este c贸digo que no consigo que funcione ....Me devuelve un numero de hbitmap pero no pinta nada ...

Code (fw): Select all Collapse
HB_FUNC( GDIPLUSCREATEBITMAPFROMSTREAM )
{ 
聽 聽 聽 
聽 聽 聽IStream *pStream = NULL;
聽 聽 聽HGLOBAL m_hBuffer = GlobalAlloc(GMEM_MOVEABLE, 0);
聽 聽 
聽 聽 聽
聽 // HGLOBAL m_hBuffer 聽= GlobalAlloc(GMEM_FIXED, IMAGE_SIZE);
聽 聽 聽 聽 聽 聽 
聽 聽if (CreateStreamOnHGlobal(m_hBuffer, FALSE, &pStream ) != S_OK )
聽 聽{
聽 聽聽聽 聽 GlobalFree( m_hBuffer );
聽 聽聽聽 聽 hb_retl ( (bool) FALSE 聽);
聽 聽聽}
聽 聽聽
聽 聽size_t size = GlobalSize(m_hBuffer);
聽 聽FILE *f;
聽 聽f = fopen("app.bmp", "rb");
聽 聽
聽 聽if( f == NULL)
聽 聽 MessageBox( GetActiveWindow(), "fallo", "No carga la imagen", 0x30 );
聽 
聽 
聽 聽fread( m_hBuffer,1,size,f);
聽 聽 聽 
聽 聽fclose(f);
聽 聽
聽聽 聽GlobalFree( m_hBuffer );
聽
聽 聽// create Bitmap
聽 聽Bitmap* bitmap = new Bitmap( pStream );
聽 聽//聽 聽 Bitmap* bitmap = new Bitmap( L"app.bmp" );
聽
聽 聽 hb_retnl( ( HB_LONG ) bitmap );
聽 聽聽
}


Aqui el codigo tGdiplus y una funci贸n para crear thumbnails ....

Code (fw): Select all Collapse
METHOD CreateHbitmap( ) INLINE 聽GdiPlusCreateHBitmapImage( ::hBmp 聽) 聽//devuelve un hbitmap GDI normal 
METHOD getWidth() 聽INLINE GdiPlusGetWidthBitmap( ::hbmp ) 
聽METHOD getHeight() INLINE GdiPlusGetHeightBitmap( ::hbmp ) 

METHOD CreateThumbnail( nWidth, nHeight ) CLASS GDIBmp
local oThumb:= gdiBmp():new()
local hImage
local nRatio
  if Empty( nHeight )
     nRatio := ::getWidth()/::getHeight()
     nHeight := nWidth * nRatio
  endif
  hImage := GdiPlusImageCreateThumb( ::hbmp, nWidth, nHeight )
  oThumb:hBmp := hImage
Return oThumb


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

Function GDIPlusSaveThumbnail( cImageIni, cImageEnd , nWhidth, nHeight )

local cExtIni := Upper(cFileExt( cImageIni ))
local oImage:= GDIBmp():New( cImageIni )
local oThumb
local nScan
聽if( nScan:= aScan( oImage:aExtIni, cExtIni )) == 0 
聽 聽 Msginfo( " el archivo "+ cImageIni + " tiene un formato no soportado") 
聽 聽 return .f.
聽endif 

聽oThumb:= oImage:CreateThumbmail( nWhidth, nHeight )
聽oThumb:Save( cImageEnd )
聽
oImage:Destroy()
oThumb:Destroy()

return .t.


Por ahora es lo que tengo nuevo .
Un Ejemplo del paso desde gdi+ a gdi normal :
Code (fw): Select all Collapse
function Main()

聽 聽local oWnd
聽 聽local oImage 

聽 聽DEFINE WINDOW oWnd TITLE "Testing GDI+ Class" FROM 5,5 TO 600, 800 PIXEL
聽 聽
聽 聽@ 3, 38 BITMAP oimage File "hola" size 120,120 of oWnd // cargamos la imagen en vacio.

聽 聽ACTIVATE WINDOW oWnd ;
聽 聽 聽 ON PAINT Gditest( 聽oImage )

return nil

function Gditest( 聽oImage )
聽 
聽 聽local cfile:= cGetfile("escoge una imagen") 聽// funciona tambi茅n con png 
// 聽local cFile := "c:\fwh\bitmaps\pngs\image6.png"

聽 聽local obmp:= gdiBmp():new( cFile )
聽 oImage:hBitmap := obmp:CreateHbitmap( ) 聽
聽 oImage:HasAlpha()
聽 oimage:refresh()

聽Return nil
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: Antonio , Nuevo c贸digo para gdi+
Posted: Fri Dec 05, 2014 10:22 AM

Manuel,

Much铆simas gracias :-)

Puedes enviarme por email los ficheros ?

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 458
Joined: Tue Mar 14, 2006 07:26 PM
Re: Antonio , Nuevo c贸digo para gdi+
Posted: Fri Jan 30, 2015 05:50 PM

Hola Manuel,

Estoy intentando pintar un png en un panel con un color de fondo y se ve fatal, el png es transparente y el dibujo en blanco.

Lo he convertido a BMP y lo he grabado con un canal alfa, y ya se ve bastante bien, pero los bordes no est谩n perfectos, se ven dientes de sierra.

Creo que con GDI+ se ver铆a perfecto y adem谩s el PNG directamente sin usar freeimage.dll

Cuando he ido a probar este c贸digo que pones, me dice al compilar, que no existe GDIBMP() y no s茅 donde has puesto el c贸digo de todo esto que explicas.

Tengo FWHSept2014.

Un Saludo,

Joaqu铆n Mart铆nez
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: Antonio , Nuevo c贸digo para gdi+
Posted: Fri Jan 30, 2015 06:39 PM
jmartial wrote:
Tengo FWHSept2014.

La parte de Gdi+ que maneja las im谩genes se ha incluido inicialmente a partir de la version de fwh 11.14 y se ha ido mejorando y aumentando en las 3 versiones siguientes .
El fichero gdiplus.cpp no viene incluido dentro del c贸digo que libera fwh al ser un archivo c++ .
Antonio liber贸 en este foro ( en el otro post ) el c贸digo de gdiplus.cpp . A ese archivo le puedes ir a帽adiendo las funciones que se han publicado en los post relativos a gdi+ y tambi茅n el c贸digo que yo te pasar茅 para que puedas resolver el problema ...
Lo primero la imagen png a colocar 驴 es desde recurso o desde archivo ? ...
Posts: 458
Joined: Tue Mar 14, 2006 07:26 PM
Re: Antonio , Nuevo c贸digo para gdi+
Posted: Fri Jan 30, 2015 07:51 PM

Manuel,

Es desde un fichero de disco, le tengo que cambiar el tama帽o y que quede con bordes suaves.

Un Saludo,

Joaqu铆n Mart铆nez

Continue the discussion