here's a reportlistener that generates watermark pictures in reports.
very simple to setup, just set some properties, like the logo image, width and height ratio, transparency ratio.
do locfile("system.app")
local lolistener as reportlistener 
lolistener = createobject("watermarklistener")
lolistener.listenertype = 1
lolistener.watermarkimage = addbs(home()) + "graphics\gifs\morphfox.gif"
lolistener.watermarktype = 2 && 1 = colored ; 2 = greyscale
lolistener.watermarktransparency = 0.25 && 0 = transparent ; 1 = opaque
lolistener.watermarkwidthratio = 0.75 && 0 - 1
lolistener.watermarkheightratio = 0.75 && 0 - 1
* run the report using the new report engine (object-assisted output)
report form (addbs(home()) + "samples/solution/europa/employeesmd.frx") object lolistener
return
below are some samples generated by the watermarklistener class. (source code at the end of this post)
requires vfp9 and gdiplusx to run.
please make sure that you have the latest version!
http://www.codeplex.com/vfpx/wiki/view.aspx?title=gdiplusx&referringtitle=home
1 -
      watermarktype = 1 && 1 = colored ; 2 = greyscale
      watermarktransparency = 1 && 0 = transparent ; 1 = opaque
      watermarkwidthratio = 0.90 && 0 - 1
      watermarkheightratio = 0.90 && 0 - 1
2 -
      watermarktype = 1 && 1 = colored ; 2 = greyscale
      watermarktransparency = 0.25 && 0 = transparent ; 1 = opaque
      watermarkwidthratio = 0.50 && 0 - 1
      watermarkheightratio = 0.50 && 0 - 1
3 -
      watermarktype = 2 && 1 = colored ; 2 = greyscale
      watermarktransparency = 0.10 && 0 = transparent ; 1 = opaque
      watermarkwidthratio = 1 && 0 - 1
      watermarkheightratio = 1 && 0 - 1
4 -
      watermarktype = 2 && 1 = colored ; 2 = greyscale
      watermarktransparency = 25 && 0 = transparent ; 1 = opaque
      watermarkwidthratio = 0.75 && 0 - 1
      watermarkheightratio = 0.75 && 0 - 1
do locfile("system.app")
local lolistener as reportlistener 
lolistener = createobject("watermarklistener")
lolistener.listenertype = 1
lolistener.watermarkimage = addbs(home()) + "graphics\gifs\morphfox.gif"
lolistener.watermarktype = 2 && 1 = colored ; 2 = greyscale
lolistener.watermarktransparency = 0.25 && 0 = transparent ; 1 = opaque
lolistener.watermarkwidthratio = 0.75 && 0 - 1
lolistener.watermarkheightratio = 0.75 && 0 - 1
* run the report using the new report engine (object-assisted output)
report form home() + "samples/solution/europa/employeesmd.frx") object lolistener
return
 
define class watermarklistener as _reportlistener of home() + "ffc\" + "_reportlistener.vcx"
newpage = .t.
ogdigraphics = null
watermarkimage = ""
watermarktype = 1 && 1 = colored ; 2 = greyscale
watermarktransparency = 0.50 && 0 = transparent ; 1 = opaque
watermarkwidthratio = 0.50
watermarkheightratio = 0.50
function beforereport
   dodefault()
   this.ogdigraphics = _screen.system.drawing.graphics.new()
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
         * create a rectangle of the size of 60% of the report page
         local lorect as xfcrectangle
         lorect = .rectangle.new(lnx * this.sharedpagewidth, ;
            lny * this.sharedpageheight, ;
            this.sharedpagewidth * lnwidth, ;
            this.sharedpageheight * lnheight)
         * load the image file to gdi+
         local lobmp as xfcbitmap
         lobmp = .bitmap.new(this.watermarkimage)
 
         local loclrmatrix as xfccolormatrix
         if this.watermarktype = 2 && 1 = colored ; 2 = greyscale
            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
 
Great stuff, please keep on inventing.
ReplyDeleteCan we use this water mark technique in forms ?
ReplyDeletei wanted to use my company logo in semi transparent in middle of top level form.
when i maximize form logo pic used appears in multiple times.
thanks.
Imran,
Please have a look at my newer posts, there I show how to transform logos in transparent, I'm sure this will help you to get started.
Hope this helps
Cesar
Este articulo estra traducido al español en PortalFox en:
ReplyDelete-- Marcas de agua en tus informes con GdiPlusX --
http://www.portalfox.com/article.php?sid=2481
This is a great utility - Thanks. Can you help witha problem. When printing the report with a Watermark, it only seem to print on every other page. Can you tell me if there is anything else I should do.
ReplyDeleteHi Ken,
I hope to publish a new version of this class soon. Please keep in touch, and tell me how it works !
Thians in advance
Cesar
Love this!
ReplyDeleteAny news on the new version?
What is the best way to include all this in an install ??
If I start watermark program from a .prg file I do not have any problem.
ReplyDeleteIf I start this prg file from menu every time I get an error.
Where did I make a mistake?
Hi Sandor,
ReplyDeleteIf you don't tell me anything about the error you are having, it will be difficult to provide any help.
For example LOLISTENER IS NOT AN OBJECT.
ReplyDelete