11 de agosto de 2015

Marcas de agua en tus informes con GdiPlusX

Artículo original: Watermark your reports with GdiPlusX
http://vfpimaging.blogspot.com/2007/07/watermark-your-reports-with-gdiplusx.html
Autor: Cesar Ch.
Traducido por: Luis María Guayán


Aquí está un ReportListener que genera imágenes como marcas de agua en informes.

Muy simple para configurar, solo establezca algunas propiedades, como la imagen del logo, el ancho, la altura y el porcentaje de transparencia.

_SCREEN.AddProperty("System", NEWOBJECT("xfcSystem", LOCFILE("system.vcx","vcx")))

LOCAL loListener as ReportListener 
loListener = CREATEOBJECT("WatermarkListener")
loListener.LISTENERTYPE = 1
loListener.WaterMarkImage = ADDBS(HOME()) + "Graphics\Gifs\morphfox.gif"
loListener.WaterMarkType = 2 && 1 = Color ; 2 = Escala de grises
loListener.WaterMarkTransparency = 0.25 && 0 = Transparente ; 1 = Opaco
loListener.WaterMarkWidthRatio = 0.75 && 0 - 1
loListener.WaterMarkHeightRatio = 0.75 && 0 - 1

* Ejecute el informe usando el nuevo motor de informes (la salida objeto-asistida)
REPORT FORM (ADDBS(HOME()) + "samples/solution/europa/employeesmd.frx") OBJECT loListener
RETURN

Abajo están algunos ejemplos generados con la clase WaterMarkListener. (El código fuente está al final de este artículo)

IMPORTANTE

Requiere VFP9 y GdiPlusX para funcionar.

¡Por favor asegúrese que tiene la última versión!

http://www.codeplex.com/VFPX/Wiki/View.aspx?title=GDIPlusX&referringTitle=Home

1.

WaterMarkType = 1 && 1 = Color ; 2 = Escala de grises
WaterMarkTransparency = 1 && 0 = Transparent ; 1 = Opaco
WaterMarkWidthRatio = 0.90 && 0 - 1
WaterMarkHeightRatio = 0.90 && 0 - 1

2.

WaterMarkType = 1 && 1 = Color ; 2 = Escala de grises
WaterMarkTransparency = 0.25 && 0 = Transparent ; 1 = Opaco
WaterMarkWidthRatio = 0.50 && 0 - 1
WaterMarkHeightRatio = 0.50 && 0 - 1

3.

WaterMarkType = 2 && 1 = Color ; 2 = Escala de grises
WaterMarkTransparency = 0.10 && 0 = Transparent ; 1 = Opaco
WaterMarkWidthRatio = 1 && 0 - 1
WaterMarkHeightRatio = 1 && 0 - 1

4.

WaterMarkType = 2 && 1 = Color ; 2 = Escala de grises
WaterMarkTransparency = 0.25 && 0 = Transparent ; 1 = Opaco
WaterMarkWidthRatio = 0.75 && 0 - 1
WaterMarkHeightRatio = 0.75 && 0 - 1

_SCREEN.AddProperty("System", NEWOBJECT("xfcSystem", LOCFILE("system.vcx","vcx"))) 
LOCAL loListener as ReportListener 
loListener = CREATEOBJECT("WatermarkListener")
loListener.LISTENERTYPE = 1
loListener.WaterMarkImage = ADDBS(HOME()) + "Graphics\Gifs\morphfox.gif"
loListener.WaterMarkType = 2 && 1 = Color ; 2 = Escala de grises
loListener.WaterMarkTransparency = 0.25 && 0 = Transparent ; 1 = Opaco
loListener.WaterMarkWidthRatio = 0.75 && 0 - 1
loListener.WaterMarkHeightRatio = 0.75 && 0 - 1
* Ejecute el informe usando el nuevo motor de informes (la salida objeto-asistida)
REPORT FORM (ADDBS(HOME()) + "samples/solution/europa/employeesmd.frx") OBJECT loListener
RETURN
 
 
DEFINE CLASS WatermarkListener AS _ReportListener OF ADDBS(HOME()) + "FFC\" + "_ReportListener.VCX"
  NewPage = .T.
  oGDIGraphics = NULL
  WaterMarkImage = ""
  WaterMarkType = 1 && 1 = Color ; 2 = Escala de grises
  WaterMarkTransparency = 0.50 && 0 = Transparente ; 1 = Opaco
  WaterMarkWidthRatio = 0.50
  WaterMarkHeightRatio = 0.50

  FUNCTION BEFOREREPORT
    DODEFAULT()
    This.oGDIGraphics = _SCREEN.SYSTEM.Drawing.Graphics.New() && CREATEOBJECT('GPGraphics')
  ENDFUNC
  FUNCTION BEFOREBAND(nBandObjCode, nFRXRecNo)
    #DEFINE FRX_OBJCOD_PAGEHEADER 1
    IF nBandObjCode==FRX_OBJCOD_PAGEHEADER
      This.NewPage = .T.
      IF NOT This.IsSuccessor
        This.SharedGDIPlusGraphics = This.GDIPLUSGRAPHICS
      ENDIF
      This.oGDIGraphics.Handle = This.SharedGDIPlusGraphics
    ENDIF
    DODEFAULT(nBandObjCode, nFRXRecNo)
  ENDFUNC
  PROCEDURE RENDER(nFRXRecNo,;
      nLeft,nTop,nWidth,nHeight,;
      nObjectContinuationType, ;
      cContentsToBeRendered, GDIPlusImage)
    WITH _SCREEN.SYSTEM.Drawing
      IF This.NewPage
        LOCAL lnX, lnY, lnWidth, lnHeight
        lnX = (1 - This.WaterMarkWidthRatio) / 2
        lnY = (1 - This.WaterMarkHeightRatio) / 2
        lnWidth = This.WaterMarkWidthRatio
        lnHeight = This.WaterMarkHeightRatio
        * Creo un Rectangulo de tamaño 60% de la página del informe
        LOCAL loRect AS xfcRectangle
        loRect = .Rectangle.New(lnX * This.sharedPageWidth, ;
          lnY * This.sharedPageHeight, ;
          This.sharedPageWidth * lnWidth, ;
          This.sharedPageHeight * lnHeight)
        * Cargo el archivo de imagen a GDI+
        LOCAL loBmp as xfcBitmap
        loBmp = .Bitmap.New(This.WaterMarkImage)
  
        LOCAL loClrMatrix AS xfcColorMatrix

        IF This.WaterMarkType = 2 && 1 = Color ; 2 = Escala de grises
          loClrMatrix = .Imaging.ColorMatrix.New( ; 
            .33, .33, .33, 0 , 0, ; 
            .33, .33, .33, 0 , 0, ; 
            .33, .33, .33, 0 , 0, ;
            0, 0, 0, This.WaterMarkTransparency, 0, ; 
            0, 0, 0, 0, 0)
        ELSE
          loClrMatrix = .Imaging.ColorMatrix.New()
          loClrMatrix.Matrix33 = This.WaterMarkTransparency
        ENDIF 
        LOCAL loAttr AS xfcImageAttributes
        loAttr = .Imaging.ImageAttributes.New() 
        loAttr.SetColorMatrix(loClrMatrix)
        This.oGdiGraphics.DrawImage(loBmp, loRect, loBmp.GetBounds(), 2, loAttr)
        This.NewPage = .F.
      ENDIF
    ENDWITH
    DODEFAULT(nFRXRecNo,;
      nLeft,nTop,nWidth,nHeight,;
      nObjectContinuationType, ;
      cContentsToBeRendered, GDIPlusImage)
  ENDPROC
ENDDEFINE

No hay comentarios. :

Publicar un comentario

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.