// GdiPlus support classes. (c) FiveTech Software 2011-2013
#include "FiveWin.ch"
#DEFINE GDI_PEN_ROUND 1
//----------------------------------------------------------------------------//
CLASS Graphics
DATA hGraphics
METHOD New( hDC, lNoHighQuality )
METHOD SetHighQuality() INLINE GdiPlusHighQuality( ::hGraphics )
METHOD SetNormalQuality() INLINE GdiPlusNormalQuality( ::hGraphics )
METHOD DrawLine( oPen, nLeft, nTop, nRight, nBottom ) INLINE ;
GdiPlusDrawLine( ::hGraphics, If( ! Empty( oPen ), oPen:hPen, NIL ),;
nLeft, nTop, nRight, nBottom )
METHOD DrawRect( oPen, oBrush, nLeft, nTop, nWidth, nHight ) INLINE ;
GdiPlusDrawRect( ::hGraphics, If( ! Empty( oPen ), oPen:hPen, NIL ),;
If( ! Empty( oBrush ), oBrush:hBrush, NIL ), nLeft, nTop, nWidth, nHight )
METHOD DrawEllipse( oPen, oBrush, nLeft, nTop, nWidth, nHight ) INLINE ;
GdiPlusDrawEllipse( ::hGraphics, If( ! Empty( oPen ), oPen:hPen, NIL ),;
If( ! Empty( oBrush ), oBrush:hBrush, NIL), nLeft, nTop, nWidth, nHight )
METHOD DrawArc( oPen, nLeft, nTop, nWidth, nHeight,startAngle, sweepAngle ) INLINE ;
GdiPlusDrawArc( oPen:hPen, nLeft, nTop, nWidth, nHeight, startAngle, sweepAngle )
METHOD DrawPath( oPen, oPath ) INLINE GdiPlusDrawPath( ::hGraphics, oPen:hPen, oPath:hPath )
METHOD DrawImage( oBmp,nTop,nleft, nWidth, nHeight )
METHOD Destroy()
DESTRUCTOR Destroy()
ENDCLASS
//----------------------------------------------------------------------------//
METHOD New( hDC , lNoHighQuality ) CLASS Graphics
::hGraphics = GdiPlusNewGraphics( hDC )
SetPageUnit2Pixel( ::hGraphics )
DEFAULT lNoHighQuality := .F.
if lNoHighQuality
::SetNormalQuality()
else
::SetHighQuality()
endif
return Self
//----------------------------------------------------------------------------//
METHOD Destroy() CLASS Graphics
GdiPlusDeleteGraphics( ::hGraphics )
::hGraphics = nil
return nil
//----------------------------------------------------------------------------//
METHOD DrawImage( oImage, nTop, nleft, nWidth, nHeight ) CLASS Graphics
if Empty(nWidth ) .or. Empty( nHeight )
GdiPlusDrawImage( ::hGraphics, oImage:hImage, nTop, nLeft )
else
GdiPlusDrawImage( ::hGraphics, oImage:hImage,nTop,nLeft, nWidth, nHeight )
endif
Return nil
//----------------------------------------------------------------------------//
CLASS Pen
DATA hPen
METHOD New( nTrans, nRed, nGreen, nBlue, nSize, lRound, lAlign )
METHOD SetSize( nSize ) INLINE GdiPlusPenSize( ::hPen , nSize )
METHOD SetStyle( nStyle )
METHOD SetInset( ) INLINE GdiPlusAlign( ::hPen )
METHOD SetNoInset( ) INLINE GdiPlusNoAlign( ::hPen )
METHOD SetColor( nTrans, nRed, nGreen, nBlue ) INLINE ;
GdiPlusPenSetClr( ::hPen, nTrans, nRed, nGreen, nBlue )
METHOD Destroy()
DESTRUCTOR Destroy()
ENDCLASS
//----------------------------------------------------------------------------//
METHOD New( nTrans, nRed, nGreen, nBlue, nSize, lRound, lAlign ) CLASS Pen
::hPen = GdiPlusNewPen( nTrans, nRed, nGreen, nBlue )
DEFAULT nSize := 1 , lRound := .F. , lAlign := .F.
::SetSize( nSize )
if lRound
::SetStyle ( GDI_PEN_ROUND )
endif
if lAlign
::SetAlign ( )
endif
return Self
//----------------------------------------------------------------------------//
METHOD SetStyle( nStyle ) CLASS Pen
do case
case nStyle == GDI_PEN_ROUND
GdiPlusPenStyle( ::hPen, 2 )
endcase
return nil
//----------------------------------------------------------------------------//
METHOD Destroy() CLASS Pen
GdiPlusDeletePen( ::hPen )
::hPen = nil
return nil
//----------------------------------------------------------------------------//
CLASS Brush
DATA hBrush
METHOD NewSolidBrush( nTrans, nRed, nGreen, nBlue )
METHOD Destroy()
DESTRUCTOR Destroy()
ENDCLASS
//----------------------------------------------------------------------------//
METHOD NewSolidBrush( nTrans, nRed, nGreen, nBlue ) CLASS Brush
::hBrush = GdiPlusNewSolidBrush( nTrans, nRed, nGreen, nBlue )
return Self
//----------------------------------------------------------------------------//
METHOD Destroy() CLASS Brush
GdiPlusDeleteBrush( ::hBrush )
::hBrush = nil
return nil
//----------------------------------------------------------------------------//
init procedure GdiPlusStart()
GdiPlusStartup()
return
//----------------------------------------------------------------------------//
exit procedure GdiPlusEnd()
GdiPlusShutdown()
return
//----------------------------------------------------------------------------//
CLASS Path
DATA hPath
METHOD New()
METHOD Destroy()
METHOD AddLINE ( nLeft, nTop, nRight, nBottom ) INLINE ;
GdiPlusPathAddLine( ::hPath, nLeft, nTop, nRight, nBottom )
METHOD AddRectangle ( nLeft, nTop, nRight, nBottom ) INLINE ;
GdiPlusPathAddRectangle ( ::hPath, nLeft, nTop, nRight, nBottom )
METHOD AddRoundRect( x, y, width, height, nRadius )
METHOD AddArc( nLeft, nTop, nWidth, nHeight, nStartAngle, nSweepAngle ) INLINE ;
GdiPlusPathAddArc( ::hPath, nLeft, nTop, nWidth, nHeight, nStartAngle, nSweepAngle )
METHOD CloseFigure() INLINE GdiPlusPathCloseFigure( ::hPath )
DESTRUCTOR Destroy()
ENDCLASS
//----------------------------------------------------------------------------//
METHOD New() CLASS Path
::hPath = GdiPlusCreatePath()
return Self
//----------------------------------------------------------------------------//
METHOD AddRoundRect( x, y, width, height, nRadius ) CLASS Path
if ( nRadius == 0)
::AddRectangle( x, y, width, height )
else
::AddLine( x + nRadius, y, x + width - nRadius, y )
::AddArc( x + width - nRadius, y, nRadius, nRadius, 270, 90 )
::AddLine( x + width, y + nRadius, x + width, y + height - nRadius )
::AddArc( x + width - nRadius, y + height - nRadius, nRadius, nRadius, 0, 90 )
::AddLine( x + width - nRadius, y + height, x + nRadius, y + height )
::AddArc( x, y + height - nRadius, nRadius, nRadius, 90, 90 )
::AddLine( x, y + height - nRadius, x, y + nRadius )
::AddArc( x, y, nRadius, nRadius, 180, 90 )
::CloseFigure()
endif
Return nil
//----------------------------------------------------------------------------//
METHOD Destroy() CLASS Path
GdiPlusDeletePath( ::hPath )
::hPath = nil
return nil
//----------------------------------------------------------------------------//
CLASS GDIImage
DATA hImage
DATA aCLSID
DATa aExtIni, aExtEnd
METHOD New(cFile)
METHOD Destroy()
METHOD Save( cFile )
DESTRUCTOR Destroy()
ENDCLASS
//----------------------------------------------------------------------------//
METHOD New( cFile ) CLASS GDIImage
::hImage = GdiPlusCreateImageFromFile( AnsiToWide( cFile ) )
::aExtIni := { "BMP", "JPG", "GIF", "TIF", "PNG" }
::aExtEnd := { "BMP", "JPG", "GIF", "TIF", "PNG" }
::aCLSID := { "{557CF400-1A04-11D3-9A73-0000F81EF32E}" ,;
"{557CF401-1A04-11D3-9A73-0000F81EF32E}" ,;
"{557CF402-1A04-11D3-9A73-0000F81EF32E}" ,;
"{557CF405-1A04-11D3-9A73-0000F81EF32E}" ,;
"{557CF406-1A04-11D3-9A73-0000F81EF32E}" ;
}
return Self
//----------------------------------------------------------------------------//
METHOD Save( cFile ) CLASS GDIImage
local cExtension := Upper(cFileExt(cFile))
local cCLSID
local nScan:= aScan( ::aExtEnd, cExtension )
if nScan == 0
msginfo( "Formato no soportado" )
Return .f.
endif
cCLSID := ::aCLSID[ nScan ]
cCLSID = AnsiToWide( cCLSID )
cFile = AnsiToWide( cFile )
GdiPlusImageSave( ::hImage, cFile, cCLSID )
Return nil
//----------------------------------------------------------------------------//
METHOD Destroy() CLASS GDIImage
::hImage = nil
return nil
//----------------------------------------------------------------------------//
Function GDIPlusConvertImage( cImageIni, cImageEnd )
local cExtIni := Upper(cFileExt( cImageIni ))
local cExtEnd := Upper(cFileExt( cImageEnd ))
local oImage
local nScan
if cImageIni == cImageEnd
msginfo( "Error. La imagen inicial y final son la misma" )
Return .f.
endif
oImage:= GDIImage():New( cImageIni )
if( nScan:= aScan( oImage:aExtIni, cExtIni )) == 0
Msginfo( " el archivo "+ cImageIni + " tiene un formato no soportado")
return .f.
endif
if( nScan:= aScan( oImage:aExtEnd, cExtEnd )) == 0
Msginfo( " el archivo "+ cImageEnd + " tiene un formato no soportado")
return .f.
endif
oImage:Save( cImageEnd )
oImage:Destroy()
Return nil
//----------------------------------------------------------------------------//
// GdiPlus support (c) FiveTech Software
#include <hbapi.h>
#include <windows.h>
#include <gdiplus.h>
using namespace Gdiplus;
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSNEWGRAPHICS )
{
hb_retnl( ( HB_LONG ) new Graphics( ( HDC ) hb_parnl( 1 ) ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSDELETEGRAPHICS )
{
delete ( ( Graphics * ) hb_parnl( 1 ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSHIGHQUALITY )
{
Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
graphics->SetSmoothingMode( SmoothingModeHighQuality );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSNORMALQUALITY )
{
Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
graphics->SetSmoothingMode( SmoothingModeDefault );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSNEWPEN )
{
Color clr = Color( hb_parnl( 1 ), hb_parnl( 2 ), hb_parnl( 3 ), hb_parnl( 4 ) );
hb_retnl( ( HB_LONG ) new Pen( clr ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSPENSIZE )
{
Pen * pen = ( Pen * ) hb_parnl( 1 );
pen->SetWidth( hb_parnl( 2 ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSPENSETCLR )
{
Pen * pen = ( Pen * ) hb_parnl( 1 );
Color clr = Color( hb_parnl( 2 ), hb_parnl( 3 ), hb_parnl( 4 ), hb_parnl( 5 ) );
hb_retni( pen->SetColor( clr ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSPENSTYLE )
{
Pen * pen = ( Pen * ) hb_parnl( 1 );
pen->SetLineCap( ( LineCap ) hb_parnl( 2 ), ( LineCap ) hb_parnl( 2 ),
( DashCap ) hb_parnl( 2 ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSALIGN )
{
Pen * pen = ( Pen * ) hb_parnl( 1 );
pen->SetAlignment(PenAlignmentInset);
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSNOALIGN )
{
Pen * pen = ( Pen * ) hb_parnl( 1 );
pen->SetAlignment(PenAlignmentCenter);
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSDELETEPEN )
{
delete ( ( Pen * ) hb_parnl( 1 ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSNEWSOLIDBRUSH )
{
Color clr = Color( hb_parnl( 1 ), hb_parnl( 2 ), hb_parnl( 3 ), hb_parnl( 4 ) );
hb_retnl( ( HB_LONG ) new SolidBrush( clr ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSDELETEBRUSH )
{
delete ( ( Brush * ) hb_parnl( 1 ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSDRAWLINE )
{
Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
if HB_ISNUM( 2 ) // if pen-object
{
Pen * pen = ( Pen * ) hb_parnl( 2 );
graphics->DrawLine( pen, ( float ) hb_parnd( 3 ),
( float ) hb_parnd( 4 ), ( float ) hb_parnd( 5 ),
( float ) hb_parnd( 6 ) );
}
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSDRAWRECT )
{
Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
// Pen * pen = ( Pen * ) hb_parnl( 2 );
float nLeft = hb_parnd( 4 );
float nTop = hb_parnd( 5 );
float nWidth = hb_parnd( 6 );
float nHeight = hb_parnd( 7 );
if HB_ISNUM( 3 ) // if brush-object
{
Brush * brush = ( Brush * ) hb_parnl( 3 );
graphics->FillRectangle( brush, nLeft, nTop, nWidth, nHeight );
}
if HB_ISNUM( 2 ) //if pen-object
{
Pen * pen = ( Pen * ) hb_parnl( 2 );
graphics->DrawRectangle( pen, nLeft, nTop, nWidth, nHeight );
}
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSDRAWELLIPSE )
{
Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
// Pen * pen = ( Pen * ) hb_parnl( 2 );
float nLeft = hb_parnd( 4 );
float nTop = hb_parnd( 5 );
float nWidth = hb_parnd( 6 );
float nHeight = hb_parnd( 7 );
if HB_ISNUM( 3 ) //if brush-object
{
Brush * brush = ( Brush * ) hb_parnl( 3 );
graphics->FillEllipse( brush, nLeft, nTop, nWidth, nHeight );
}
if HB_ISNUM( 2 ) //if pen-object
{
Pen * pen = ( Pen * ) hb_parnl( 2 );
graphics->DrawEllipse( pen, nLeft, nTop, nWidth, nHeight );
}
}
//----------------------------------------------------------------------------//
/*
HB_FUNC( GDIPLUSDRAWTEXT )
{
Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
// if HB_ISNUM( 3 ) //if brush-object
// {
Brush * brush = ( Brush * ) hb_parnl( 3 );
// }
graphics->DrawString(hb_parc(2) , -1,NUL,NUL,NUL, brush );
}
*/
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSCREATEPATH )
{
hb_retnl( ( HB_LONG ) new GraphicsPath() );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSPATHSTARTFIGURE )
{
GraphicsPath * graphicPath = ( GraphicsPath * ) hb_parnl( 1 );
graphicPath->StartFigure();
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSDELETEPATH )
{
delete ( ( GraphicsPath * ) hb_parnl( 1 ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSPATHADDLINE )
{
GraphicsPath * graphicPath = ( GraphicsPath * ) hb_parnl( 1 );
int nLeft = hb_parnd( 2 );
int nTop = hb_parnd( 3 );
int nRight = hb_parnd( 4 );
int nBottom = hb_parnd( 5 );
graphicPath->AddLine( nLeft, nTop, nRight, nBottom ) ;
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSPATHADDRECTANGLE )
{
GraphicsPath * graphicPath = ( GraphicsPath * ) hb_parnl( 1 );
int nLeft = hb_parnd( 2 );
int nTop = hb_parnd( 3 );
int nRight = hb_parnd( 4 );
int nBottom = hb_parnd( 5 );
Rect pathRect = Rect( nLeft, nTop, nRight, nBottom );
graphicPath->AddRectangle( pathRect ) ;
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSPATHADDARC )
{
GraphicsPath * graphicPath = ( GraphicsPath * ) hb_parnl( 1 );
int nLeft = hb_parnd( 2 );
int nTop = hb_parnd( 3 );
int nRight = hb_parnd( 4 );
int nBottom = hb_parnd( 5 );
float startAngle = hb_parnd( 6 );
float sweepAngle = hb_parnd( 7 );
Rect pathRect = Rect( nLeft, nTop, nRight, nBottom );
graphicPath->AddArc( pathRect, startAngle, sweepAngle ) ;
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSPATHCLOSEFIGURE )
{
GraphicsPath * graphicPath = ( GraphicsPath * ) hb_parnl( 1 );
graphicPath->CloseFigure();
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSDRAWPATH )
{
Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
Pen * pen = ( Pen * ) hb_parnl( 2 );
GraphicsPath * graphicPath = ( GraphicsPath * ) hb_parnl( 3 );
graphics->DrawPath( pen, graphicPath );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSCREATEPOINTF )
{
float nLeft = hb_parnd( 1 );
float nTop = hb_parnd( 2 );
hb_retnl( ( HB_LONG )new PointF( nLeft , nTop ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSDRAWARC )
{
Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
Pen * pen = ( Pen * ) hb_parnl( 2 );
float nLeft = hb_parnd( 3 );
float nTop = hb_parnd( 4 );
float nWidth = hb_parnd( 5 );
float nHeight = hb_parnd( 6 );
float startAngle = hb_parnd( 7 );
float sweepAngle = hb_parnd( 8 );
// Draw the arc.
graphics->DrawArc( pen, nLeft, nTop, nWidth, nHeight, startAngle, sweepAngle);
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSSTARTUP )
{
hb_retl( GdiplusStartup( &gdiplusToken, &gdiplusStartupInput, NULL ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSSHUTDOWN )
{
GdiplusShutdown( gdiplusToken );
}
//----------------------------------------------------------------------------//
HB_FUNC( SETPAGEUNIT2PIXEL )
{
Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
graphics->SetPageUnit( UnitPixel ); // Unit to Pixel
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSCREATEIMAGEFROMFILE )
{
Image * newImage = new Image( (LPCWSTR) hb_parc(1) );
hb_retnl( ( HB_LONG ) newImage );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSDRAWIMAGE )
{
int iParams = hb_pcount();
Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
Image * newImage = ( Image * ) hb_parnl( 2 );
int nLeft ;
int nTop ;
int nWidth ;
int nHeight;
switch (iParams){
case 4:
nLeft = hb_parni( 3 );
nTop = hb_parni( 4 );
graphics->DrawImage( newImage, nLeft, nTop );
case 6:
nLeft = hb_parni( 3 );
nTop = hb_parni( 4 );
nWidth = hb_parni( 5 );
nHeight = hb_parni( 6 );
graphics->DrawImage( newImage, nLeft, nTop,nWidth,nHeight);
}
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSIMAGESAVE )
{
Image * newImage = ( Image * ) hb_parnl( 1 );
CLSID cClsid ;
LPWSTR file = (LPWSTR) hb_parc(2);
LPWSTR identificador = (LPWSTR) hb_parc(3);
CLSIDFromString( identificador, &cClsid ) ;
newImage->Save( file , &cClsid, NULL);
}
//----------------------------------------------------------------------------//
* nuevos metodos para la clase Graphics :
DrawArc : Permite dibujar un arco .
DrawPath: Dibuja los trazos de un path previamente creado
DrawImage: pinta una Imagen dentro de los formatos soportados por gdi+ .
DrawRoundRect : Utilizamos internamente el objeto path para dibujar un Roundrect.
* nuevo metodo para la calse Pen:
SetColor : permite definir un nuevo color para el pen sin tener que construir uno nuevo :
sus parametros son Transparencia, nRed, nGreen, nBlue por ese orden.
* Nueva clase path : permite dibujar varios y distintos trazos y luego pintarlos en pantalla.
Sus metodos son :
New : crea un nuevo path
Destroy : lo destruye.
AddLine : Añade una linea.
AddRectangle : Añade un rectangulo
AddRoundRect : Añade un roundRect.
AddArc : Añade un Arco.
CloseFigure : Cierra una figura dibujada con los anteriores metodos .
( para ejemplo de uso se puede mirar el codigo usado para el methodo addroundrect) .
* Nueva clase GDIBmp : Permite el uso de imagenes.
Sus metodos son :
New( cFile, cResname ) : Crea el objeto GdiBmp , este puede ser creado desde un archivo o desde recursos si se trata de un bmp ( por el momento )
Destroy : destruye el objeto
Save( cFile ) Graba el objeto en un nuevo archivo que puede ser cualquiera de los formatos soportados.
* Nueva Funcion GDIPlusConvertImage( cImageIni, cImageEnd )
Permite pasar una imagen de un formato a otro ,solo expecificando un archivo origen y un archivo destino .
// GdiPlus support classes. (c) FiveTech Software 2011-2013
#include "FiveWin.ch"
#DEFINE GDI_PEN_ROUND 1
//----------------------------------------------------------------------------//
CLASS Graphics
DATA hGraphics
METHOD New( hDC, lNoHighQuality )
METHOD SetHighQuality() INLINE GdiPlusHighQuality( ::hGraphics )
METHOD SetNormalQuality() INLINE GdiPlusNormalQuality( ::hGraphics )
METHOD DrawLine( oPen, nLeft, nTop, nRight, nBottom ) INLINE ;
GdiPlusDrawLine( ::hGraphics, If( ! Empty( oPen ), oPen:hPen, NIL ),;
nLeft, nTop, nRight, nBottom )
METHOD DrawRect( oPen, oBrush, nLeft, nTop, nWidth, nHight ) INLINE ;
GdiPlusDrawRect( ::hGraphics, If( ! Empty( oPen ), oPen:hPen, NIL ),;
If( ! Empty( oBrush ), oBrush:hBrush, NIL ), nLeft, nTop, nWidth, nHight )
METHOD DrawEllipse( oPen, oBrush, nLeft, nTop, nWidth, nHight ) INLINE ;
GdiPlusDrawEllipse( ::hGraphics, If( ! Empty( oPen ), oPen:hPen, NIL ),;
If( ! Empty( oBrush ), oBrush:hBrush, NIL), nLeft, nTop, nWidth, nHight )
METHOD DrawArc( oPen, nLeft, nTop, nWidth, nHeight,startAngle, sweepAngle ) INLINE ;
GdiPlusDrawArc( oPen:hPen, nLeft, nTop, nWidth, nHeight, startAngle, sweepAngle )
METHOD DrawPath( oPen, oPath ) INLINE GdiPlusDrawPath( ::hGraphics, oPen:hPen, oPath:hPath )
METHOD DrawImage( oBmp,nTop,nleft, nWidth, nHeight )
METHOD DrawRoundRect(oPen, oBrush, nLeft, nTop, nWidth, nHight )
METHOD Destroy()
DESTRUCTOR Destroy()
ENDCLASS
//----------------------------------------------------------------------------//
METHOD New( hDC , lNoHighQuality ) CLASS Graphics
::hGraphics = GdiPlusNewGraphics( hDC )
SetPageUnit2Pixel( ::hGraphics )
DEFAULT lNoHighQuality := .F.
if lNoHighQuality
::SetNormalQuality()
else
::SetHighQuality()
endif
return Self
//----------------------------------------------------------------------------//
METHOD Destroy() CLASS Graphics
GdiPlusDeleteGraphics( ::hGraphics )
::hGraphics = nil
return nil
//----------------------------------------------------------------------------//
METHOD DrawImage( oImage, nTop, nleft, nWidth, nHeight ) CLASS Graphics
if Empty(nWidth ) .or. Empty( nHeight )
GdiPlusDrawImage( ::hGraphics, oImage:hBmp, nTop, nLeft )
else
GdiPlusDrawImage( ::hGraphics, oImage:hBmp,nTop,nLeft, nWidth, nHeight )
endif
Return nil
//----------------------------------------------------------------------------//
METHOD DrawRoundRect(oPen, oBrush, nLeft, nTop, nWidth, nHeight ) CLASS Graphics
local oPath:= Path():new()
oPath:AddRoundRect( nLeft, nTop, nWidth, nHeight,8 )
::DrawPath( oPen, oPath )
Return nil
//----------------------------------------------------------------------------//
CLASS Pen
DATA hPen
METHOD New( nTrans, nRed, nGreen, nBlue, nSize, lRound, lAlign )
METHOD SetSize( nSize ) INLINE GdiPlusPenSize( ::hPen , nSize )
METHOD SetStyle( nStyle )
METHOD SetInset( ) INLINE GdiPlusAlign( ::hPen )
METHOD SetNoInset( ) INLINE GdiPlusNoAlign( ::hPen )
METHOD SetColor( nTrans, nRed, nGreen, nBlue ) INLINE ;
GdiPlusPenSetClr( ::hPen, nTrans, nRed, nGreen, nBlue )
METHOD Destroy()
DESTRUCTOR Destroy()
ENDCLASS
//----------------------------------------------------------------------------//
METHOD New( nTrans, nRed, nGreen, nBlue, nSize, lRound, lAlign ) CLASS Pen
::hPen = GdiPlusNewPen( nTrans, nRed, nGreen, nBlue )
DEFAULT nSize := 1 , lRound := .F. , lAlign := .F.
::SetSize( nSize )
if lRound
::SetStyle ( GDI_PEN_ROUND )
endif
if lAlign
::SetAlign ( )
endif
return Self
//----------------------------------------------------------------------------//
METHOD SetStyle( nStyle ) CLASS Pen
do case
case nStyle == GDI_PEN_ROUND
GdiPlusPenStyle( ::hPen, 2 )
endcase
return nil
//----------------------------------------------------------------------------//
METHOD Destroy() CLASS Pen
GdiPlusDeletePen( ::hPen )
::hPen = nil
return nil
//----------------------------------------------------------------------------//
CLASS Brush
DATA hBrush
METHOD NewSolidBrush( nTrans, nRed, nGreen, nBlue )
METHOD Destroy()
DESTRUCTOR Destroy()
ENDCLASS
//----------------------------------------------------------------------------//
METHOD NewSolidBrush( nTrans, nRed, nGreen, nBlue ) CLASS Brush
::hBrush = GdiPlusNewSolidBrush( nTrans, nRed, nGreen, nBlue )
return Self
//----------------------------------------------------------------------------//
METHOD Destroy() CLASS Brush
GdiPlusDeleteBrush( ::hBrush )
::hBrush = nil
return nil
//----------------------------------------------------------------------------//
init procedure GdiPlusStart()
GdiPlusStartup()
return
//----------------------------------------------------------------------------//
exit procedure GdiPlusEnd()
GdiPlusShutdown()
return
//----------------------------------------------------------------------------//
CLASS Path
DATA hPath
METHOD New()
METHOD Destroy()
METHOD AddLINE ( nLeft, nTop, nRight, nBottom ) INLINE ;
GdiPlusPathAddLine( ::hPath, nLeft, nTop, nRight, nBottom )
METHOD AddRectangle ( nLeft, nTop, nRight, nBottom ) INLINE ;
GdiPlusPathAddRectangle ( ::hPath, nLeft, nTop, nRight, nBottom )
METHOD AddRoundRect( x, y, width, height, nRadius )
METHOD AddArc( nLeft, nTop, nWidth, nHeight, nStartAngle, nSweepAngle ) INLINE ;
GdiPlusPathAddArc( ::hPath, nLeft, nTop, nWidth, nHeight, nStartAngle, nSweepAngle )
METHOD CloseFigure() INLINE GdiPlusPathCloseFigure( ::hPath )
DESTRUCTOR Destroy()
ENDCLASS
//----------------------------------------------------------------------------//
METHOD New() CLASS Path
::hPath = GdiPlusCreatePath()
return Self
//----------------------------------------------------------------------------//
METHOD AddRoundRect( x, y, width, height, nRadius ) CLASS Path
if ( nRadius == 0)
::AddRectangle( x, y, width, height )
else
::AddLine( x + nRadius, y, x + width - nRadius, y )
::AddArc( x + width - nRadius, y, nRadius, nRadius, 270, 90 )
::AddLine( x + width, y + nRadius, x + width, y + height - nRadius )
::AddArc( x + width - nRadius, y + height - nRadius, nRadius, nRadius, 0, 90 )
::AddLine( x + width - nRadius, y + height, x + nRadius, y + height )
::AddArc( x, y + height - nRadius, nRadius, nRadius, 90, 90 )
::AddLine( x, y + height - nRadius, x, y + nRadius )
::AddArc( x, y, nRadius, nRadius, 180, 90 )
::CloseFigure()
endif
Return nil
//----------------------------------------------------------------------------//
METHOD Destroy() CLASS Path
GdiPlusDeletePath( ::hPath )
::hPath = nil
return nil
//----------------------------------------------------------------------------//
CLASS GDIBmp
DATA hBmp
DATA aCLSID
DATa aExtIni, aExtEnd
METHOD New( cFile, cResname )
METHOD Destroy()
METHOD Save( cFile )
DESTRUCTOR Destroy()
ENDCLASS
//----------------------------------------------------------------------------//
METHOD New( cFile , cResname ) CLASS GDIBmp
local aBmpPal
::aExtIni := { "BMP", "JPG", "GIF", "TIF", "PNG","EMF","WMF","ICO" }
::aExtEnd := { "BMP", "JPG", "GIF", "TIF", "PNG" }
::aCLSID := { "{557CF400-1A04-11D3-9A73-0000F81EF32E}" ,;
"{557CF401-1A04-11D3-9A73-0000F81EF32E}" ,;
"{557CF402-1A04-11D3-9A73-0000F81EF32E}" ,;
"{557CF405-1A04-11D3-9A73-0000F81EF32E}" ,;
"{557CF406-1A04-11D3-9A73-0000F81EF32E}" ,;
"{557CF403-1A04-11D3-9A73-0000F81EF32E}" ,;
"{557CF404-1A04-11D3-9A73-0000F81EF32E}" ,;
"{557CF407-1A04-11D3-9A73-0000F81EF32E}" ;
}
if ! Empty( cResName )
aBmpPal = PalBmpLoad( cResName )
::hBmp = GdiPlusCreateImageFromRes( aBmpPal[ 1 ], aBmpPal[ 2 ] )
elseif File( cFile )
::hBmp = GdiPlusCreateImageFromFile( AnsiToWide( cFile ) )
else
msginfo( "ficheros no encontrados" )
endif
return Self
//----------------------------------------------------------------------------//
METHOD Save( cFile ) CLASS GDIBmp
local cExtension := Upper(cFileExt(cFile))
local cCLSID
local nScan:= aScan( ::aExtEnd, cExtension )
if nScan == 0
msginfo( "Formato no soportado" )
Return .f.
endif
cCLSID := ::aCLSID[ nScan ]
cCLSID = AnsiToWide( cCLSID )
cFile = AnsiToWide( cFile )
GdiPlusImageSave( ::hBmp, cFile, cCLSID )
Return nil
//----------------------------------------------------------------------------//
METHOD Destroy() CLASS GDIBmp
::hBmp = nil
return nil
//----------------------------------------------------------------------------//
Function GDIPlusConvertImage( cImageIni, cImageEnd )
local cExtIni := Upper(cFileExt( cImageIni ))
local cExtEnd := Upper(cFileExt( cImageEnd ))
local oImage
local nScan
if cImageIni == cImageEnd
msginfo( "Error. La imagen inicial y final son la misma" )
Return .f.
endif
oImage:= GDIBmp():New( cImageIni )
if( nScan:= aScan( oImage:aExtIni, cExtIni )) == 0
Msginfo( " el archivo "+ cImageIni + " tiene un formato no soportado")
return .f.
endif
if( nScan:= aScan( oImage:aExtEnd, cExtEnd )) == 0
Msginfo( " el archivo "+ cImageEnd + " tiene un formato no soportado")
return .f.
endif
oImage:Save( cImageEnd )
oImage:Destroy()
Return nil
//----------------------------------------------------------------------------//
// GdiPlus support (c) FiveTech Software
#include <hbapi.h>
#include <windows.h>
#include <gdiplus.h>
using namespace Gdiplus;
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSNEWGRAPHICS )
{
hb_retnl( ( HB_LONG ) new Graphics( ( HDC ) hb_parnl( 1 ) ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSDELETEGRAPHICS )
{
delete ( ( Graphics * ) hb_parnl( 1 ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSHIGHQUALITY )
{
Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
graphics->SetSmoothingMode( SmoothingModeHighQuality );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSNORMALQUALITY )
{
Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
graphics->SetSmoothingMode( SmoothingModeDefault );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSNEWPEN )
{
Color clr = Color( hb_parnl( 1 ), hb_parnl( 2 ), hb_parnl( 3 ), hb_parnl( 4 ) );
hb_retnl( ( HB_LONG ) new Pen( clr ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSPENSIZE )
{
Pen * pen = ( Pen * ) hb_parnl( 1 );
pen->SetWidth( hb_parnl( 2 ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSPENSETCLR )
{
Pen * pen = ( Pen * ) hb_parnl( 1 );
Color clr = Color( hb_parnl( 2 ), hb_parnl( 3 ), hb_parnl( 4 ), hb_parnl( 5 ) );
hb_retni( pen->SetColor( clr ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSPENSTYLE )
{
Pen * pen = ( Pen * ) hb_parnl( 1 );
pen->SetLineCap( ( LineCap ) hb_parnl( 2 ), ( LineCap ) hb_parnl( 2 ),
( DashCap ) hb_parnl( 2 ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSALIGN )
{
Pen * pen = ( Pen * ) hb_parnl( 1 );
pen->SetAlignment(PenAlignmentInset);
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSNOALIGN )
{
Pen * pen = ( Pen * ) hb_parnl( 1 );
pen->SetAlignment(PenAlignmentCenter);
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSDELETEPEN )
{
delete ( ( Pen * ) hb_parnl( 1 ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSNEWSOLIDBRUSH )
{
Color clr = Color( hb_parnl( 1 ), hb_parnl( 2 ), hb_parnl( 3 ), hb_parnl( 4 ) );
hb_retnl( ( HB_LONG ) new SolidBrush( clr ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSDELETEBRUSH )
{
delete ( ( Brush * ) hb_parnl( 1 ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSDRAWLINE )
{
Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
if HB_ISNUM( 2 ) // if pen-object
{
Pen * pen = ( Pen * ) hb_parnl( 2 );
graphics->DrawLine( pen, ( float ) hb_parnd( 3 ),
( float ) hb_parnd( 4 ), ( float ) hb_parnd( 5 ),
( float ) hb_parnd( 6 ) );
}
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSDRAWRECT )
{
Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
// Pen * pen = ( Pen * ) hb_parnl( 2 );
float nLeft = hb_parnd( 4 );
float nTop = hb_parnd( 5 );
float nWidth = hb_parnd( 6 );
float nHeight = hb_parnd( 7 );
if HB_ISNUM( 3 ) // if brush-object
{
Brush * brush = ( Brush * ) hb_parnl( 3 );
graphics->FillRectangle( brush, nLeft, nTop, nWidth, nHeight );
}
if HB_ISNUM( 2 ) //if pen-object
{
Pen * pen = ( Pen * ) hb_parnl( 2 );
graphics->DrawRectangle( pen, nLeft, nTop, nWidth, nHeight );
}
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSDRAWELLIPSE )
{
Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
// Pen * pen = ( Pen * ) hb_parnl( 2 );
float nLeft = hb_parnd( 4 );
float nTop = hb_parnd( 5 );
float nWidth = hb_parnd( 6 );
float nHeight = hb_parnd( 7 );
if HB_ISNUM( 3 ) //if brush-object
{
Brush * brush = ( Brush * ) hb_parnl( 3 );
graphics->FillEllipse( brush, nLeft, nTop, nWidth, nHeight );
}
if HB_ISNUM( 2 ) //if pen-object
{
Pen * pen = ( Pen * ) hb_parnl( 2 );
graphics->DrawEllipse( pen, nLeft, nTop, nWidth, nHeight );
}
}
//----------------------------------------------------------------------------//
/*
HB_FUNC( GDIPLUSDRAWTEXT )
{
Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
// if HB_ISNUM( 3 ) //if brush-object
// {
Brush * brush = ( Brush * ) hb_parnl( 3 );
// }
graphics->DrawString(hb_parc(2) , -1,NUL,NUL,NUL, brush );
}
*/
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSCREATEPATH )
{
hb_retnl( ( HB_LONG ) new GraphicsPath() );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSPATHSTARTFIGURE )
{
GraphicsPath * graphicPath = ( GraphicsPath * ) hb_parnl( 1 );
graphicPath->StartFigure();
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSDELETEPATH )
{
delete ( ( GraphicsPath * ) hb_parnl( 1 ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSPATHADDLINE )
{
GraphicsPath * graphicPath = ( GraphicsPath * ) hb_parnl( 1 );
int nLeft = hb_parnd( 2 );
int nTop = hb_parnd( 3 );
int nRight = hb_parnd( 4 );
int nBottom = hb_parnd( 5 );
graphicPath->AddLine( nLeft, nTop, nRight, nBottom ) ;
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSPATHADDRECTANGLE )
{
GraphicsPath * graphicPath = ( GraphicsPath * ) hb_parnl( 1 );
int nLeft = hb_parnd( 2 );
int nTop = hb_parnd( 3 );
int nRight = hb_parnd( 4 );
int nBottom = hb_parnd( 5 );
Rect pathRect = Rect( nLeft, nTop, nRight, nBottom );
graphicPath->AddRectangle( pathRect ) ;
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSPATHADDARC )
{
GraphicsPath * graphicPath = ( GraphicsPath * ) hb_parnl( 1 );
int nLeft = hb_parnd( 2 );
int nTop = hb_parnd( 3 );
int nRight = hb_parnd( 4 );
int nBottom = hb_parnd( 5 );
float startAngle = hb_parnd( 6 );
float sweepAngle = hb_parnd( 7 );
Rect pathRect = Rect( nLeft, nTop, nRight, nBottom );
graphicPath->AddArc( pathRect, startAngle, sweepAngle ) ;
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSPATHCLOSEFIGURE )
{
GraphicsPath * graphicPath = ( GraphicsPath * ) hb_parnl( 1 );
graphicPath->CloseFigure();
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSDRAWPATH )
{
Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
Pen * pen = ( Pen * ) hb_parnl( 2 );
GraphicsPath * graphicPath = ( GraphicsPath * ) hb_parnl( 3 );
graphics->DrawPath( pen, graphicPath );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSCREATEPOINTF )
{
float nLeft = hb_parnd( 1 );
float nTop = hb_parnd( 2 );
hb_retnl( ( HB_LONG )new PointF( nLeft , nTop ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSDRAWARC )
{
Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
Pen * pen = ( Pen * ) hb_parnl( 2 );
float nLeft = hb_parnd( 3 );
float nTop = hb_parnd( 4 );
float nWidth = hb_parnd( 5 );
float nHeight = hb_parnd( 6 );
float startAngle = hb_parnd( 7 );
float sweepAngle = hb_parnd( 8 );
// Draw the arc.
graphics->DrawArc( pen, nLeft, nTop, nWidth, nHeight, startAngle, sweepAngle);
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSSTARTUP )
{
hb_retl( GdiplusStartup( &gdiplusToken, &gdiplusStartupInput, NULL ) );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSSHUTDOWN )
{
GdiplusShutdown( gdiplusToken );
}
//----------------------------------------------------------------------------//
HB_FUNC( SETPAGEUNIT2PIXEL )
{
Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
graphics->SetPageUnit( UnitPixel ); // Unit to Pixel
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSCREATEIMAGEFROMFILE )
{
Bitmap * newImage = new Bitmap( (LPCWSTR) hb_parc(1) );
hb_retnl( ( HB_LONG ) newImage );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSCREATEIMAGEFROMRES )
{
Bitmap * newImage = new Bitmap( (HBITMAP) hb_parnl(1), (HPALETTE) hb_parnl(2) );
hb_retnl( ( HB_LONG ) newImage );
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSDRAWIMAGE )
{
int iParams = hb_pcount();
Graphics * graphics = ( Graphics * ) hb_parnl( 1 );
Bitmap * newImage = ( Bitmap * ) hb_parnl( 2 );
int nLeft ;
int nTop ;
int nWidth ;
int nHeight;
switch (iParams){
case 4:
nLeft = hb_parni( 3 );
nTop = hb_parni( 4 );
graphics->DrawImage( newImage, nLeft, nTop );
case 6:
nLeft = hb_parni( 3 );
nTop = hb_parni( 4 );
nWidth = hb_parni( 5 );
nHeight = hb_parni( 6 );
graphics->DrawImage( newImage, nLeft, nTop,nWidth,nHeight);
}
}
//----------------------------------------------------------------------------//
HB_FUNC( GDIPLUSIMAGESAVE )
{
Bitmap * newImage = ( Bitmap * ) hb_parnl( 1 );
CLSID cClsid ;
LPWSTR file = (LPWSTR) hb_parc(2);
LPWSTR identificador = (LPWSTR) hb_parc(3);
CLSIDFromString( identificador, &cClsid ) ;
newImage->Save( file , &cClsid, NULL);
}
//----------------------------------------------------------------------------//
// GdiPlus example following Microsoft tutorial:
// http://msdn.microsoft.com/en-us/library ... 95(v=VS.85).aspx
#include "FiveWin.ch"
//----------------------------------------------------------------------------//
function Main()
local oWnd
DEFINE WINDOW oWnd TITLE "Testing GDI+ Class" FROM 5,5 TO 600, 800 PIXEL
// ownd:setcolor(nrgb(120,120,120),nrgb(120,120,120))
@28,4 button "rectangle" size 120,30 Action Drawrectangle(ownd)
@28,24 button "roundrect" size 120,30 Action Drawroundrect(ownd)
@28,44 button "drawImage" size 120,30 Action DrawImage(ownd)
@28,64 button "drawEllipse" size 120,30 Action DrawEllipse(ownd)
@28,84 button "drawlight" size 120,30 Action Drawlight(ownd)
ACTIVATE WINDOW oWnd
return nil
//----------------------------------------------------------------------------//
function Drawrectangle(ownd)
local hdc:= oWnd:getdc()
local oGraphics := Graphics():New( ownd:hDC )
local oPen := Pen():New( 255, 0, 0, 255 , 10 , .T.)
oGraphics:DrawRect( oPen, , 300, 300, 70, 60 )
oGraphics:destroy()
oWnd:releasedc()
Return nil
function Drawroundrect(ownd)
local hdc:= oWnd:getdc()
local oGraphics := Graphics():New( ownd:hDC )
local oPen2 := Pen():New( 255, 255, 0, 0 , 3 )
local oPath:= Path():new()
oPath:AddRoundRect( 30, 30 , 50, 50 , 9 )
oGraphics:DrawPath( oPen2, oPath )
oGraphics:destroy()
oWnd:releasedc()
Return nil
function DrawImage(ownd)
local hdc:= oWnd:getdc()
local oGraphics := Graphics():New( ownd:hDC )
local oImage:= GDIBmp():new("C:\fwh\bitmaps\pngs\image2.png" )
oGraphics:DrawImage( oImage , 60 ,60 )
oGraphics:destroy()
oWnd:releasedc()
Return nil
function DrawEllipse(ownd)
local hdc:= oWnd:getdc()
local oGraphics := Graphics():New( ownd:hDC )
local oBrush2 := Brush():NewSolidBrush( 150, 0, 255, 167 )
local oPen2 := Pen():New( 255, 255, 0, 0 , 3 )
oGraphics:DrawEllipse( oPen2, oBrush2 , 500, 100, 60, 60 )
oGraphics:destroy()
oWnd:releasedc()
Return nil
function Drawlight(ownd)
local hdc:= oWnd:getdc()
local oGraphics := Graphics():New( ownd:hDC )
local oPen
local n
oPen := Pen():New( 255 , 0, 0 , 0 , .T.)
oGraphics:DrawRoundRect( oPen, , 400 , 200, 100 , 150 )
oPen:setColor( 255 , 214, 234, 249 )
oPen:setsize(1)
for n = 1 to 10
oPen:setcolor( 255-n*25 , 214, 234, 249 )
oGraphics:DrawRoundRect( oPen, , 400-n , 200-n, 100+n*2 , 150+ n*2 )
next
open:destroy()
oGraphics:destroy()
oWnd:releasedc()
Return nil
jmartial wrote:Manuel,
¿Cómo se compila gdiplus.cpp con bcc582?
Como un prg con #pragma o necesita algunos parámetros ?
jmartial wrote:Ok!
Gracias Manuel, lo pruebo.
HB_FUNC( GDIPLUSHBMPFROMFILE )
{
FILE * fil = fopen ( hb_parc(1) , "rb" ) ;
fseek ( fil , 0 , SEEK_END ) ;
int filesize = ftell ( fil ) ;
fseek ( fil , 0 , SEEK_SET ) ;
HGLOBAL hglobal = GlobalAlloc ( GMEM_MOVEABLE , filesize ) ;
char * adr = (char *)GlobalLock ( hglobal ) ;
int nbytes = fread ( adr , 1 , filesize , fil ) ;
fclose ( fil ) ;
if ( nbytes != filesize )
{
MessageBox( GetActiveWindow(), "fallo", "No carga la imagen", 0x30 );
} ;
LPSTREAM pstm = NULL ;
GlobalUnlock ( hglobal ) ;
CreateStreamOnHGlobal ( hglobal, TRUE, &pstm ) ;
Bitmap *original = new Bitmap( pstm,FALSE );
HBITMAP handle;
original->GetHBITMAP( Color( 0,0,0 ), &handle );
delete original ;
pstm->Release();
GlobalFree( hglobal );
hb_retnl( ( HB_LONG ) handle );
}
FUNCTION cGetBmpName( cBmp )
LOCAL aName:={}
LOCAL aToken
LOCAL nLen
IF ValType( cBmp ) != "N"
aToken:= hb_atokens(cBmp,"|")
nLen := Len(aToken )
IF nLen == 1
aName:= { cBmp , nil, nil }
ELSEIF nLen == 2
aName:= { AllTrim(aToken[1]) , Val(aToken[2]), nil }
ELSEIF nLen == 3
aName:= { AllTrim(aToken[1]) , Val(aToken[2]), Val(aToken[2]) }
ELSE
aName:= { AllTrim(aToken[1]) , nil , nil }
ENDIF
ELSE
aName:= { cBmp , nil, nil }
ENDIF
RETURN aName
HB_FUNC( GDIPLUSHBMPFROMFILE )
{
FILE * fil = fopen ( hb_parc(1) , "rb" ) ;
fseek ( fil , 0 , SEEK_END ) ;
int filesize = ftell ( fil ) ;
fseek ( fil , 0 , SEEK_SET ) ;
HGLOBAL hglobal = GlobalAlloc ( GMEM_MOVEABLE , filesize ) ;
char * adr = (char *)GlobalLock ( hglobal ) ;
int nbytes = fread ( adr , 1 , filesize , fil ) ;
fclose ( fil ) ;
if ( nbytes != filesize )
{
MessageBox( GetActiveWindow(), "fallo", "No carga la imagen", 0x30 );
} ;
LPSTREAM pstm = NULL ;
GlobalUnlock ( hglobal ) ;
CreateStreamOnHGlobal ( hglobal, TRUE, &pstm ) ;
Bitmap *original = new Bitmap( pstm,FALSE );
int nWidth = hb_parni(2) ;
int nHeight = hb_parni(3) ;
Bitmap* newImage = new Bitmap( nWidth, nHeight, original->GetPixelFormat() );
Graphics * graphics = new Graphics( newImage );
graphics->DrawImage( original ,0, 0, nWidth, nHeight);
HBITMAP handle;
newImage->GetHBITMAP( Color( 0,0,0 ), &handle );
delete graphics ;
delete original ;
delete newImage ;
pstm->Release();
GlobalFree( hglobal );
hb_retnl( ( HB_LONG ) handle );
Return to FiveWin para Harbour/xHarbour
Users browsing this forum: pablovidal and 40 guests