Antonio , Nuevo código para gdi+

Antonio , Nuevo código para gdi+

Postby mastintin » Thu Dec 04, 2014 2:37 pm

Pongo aqui lo ultimo que he añadido a gdi+ ....

EN el archivo gdiplus.cpp
Code: Select all  Expand view


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: Select all  Expand view


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: Select all  Expand view


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: Select all  Expand view


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

 
User avatar
mastintin
 
Posts: 1516
Joined: Thu May 27, 2010 2:06 pm

Re: Antonio , Nuevo código para gdi+

Postby Antonio Linares » Fri Dec 05, 2014 10:22 am

Manuel,

Muchísimas gracias :-)

Puedes enviarme por email los ficheros ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 42080
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Antonio , Nuevo código para gdi+

Postby jmartial » Fri Jan 30, 2015 5: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
jmartial
 
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm

Re: Antonio , Nuevo código para gdi+

Postby mastintin » Fri Jan 30, 2015 6: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 ? ...
User avatar
mastintin
 
Posts: 1516
Joined: Thu May 27, 2010 2:06 pm

Re: Antonio , Nuevo código para gdi+

Postby jmartial » Fri Jan 30, 2015 7: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
jmartial
 
Posts: 458
Joined: Tue Mar 14, 2006 7:26 pm


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 69 guests