local oGraphics,oCanvas oGraphics=createobject('GdiPlusX2Any') oGraphics.oCanvas = .CreateCanvas( _screen.hwnd ) or oGraphics.oCanvas = .CreateCanvas( thisform.hwnd ) or oGraphics.oCanvas = .CreateCanvas( thisform.ScrollableContainer.ImageCanvas ) or,or,or *Then I can parse that whole oGraphics object all over the place *and do drawing from where ever we want procedure myCustomDrawings lparameters oGraphics oGraphics.DrawString(,,,'VFPX Rocks!', ,,,,, ) oGraphics.DrawThis() oGraphics.DrawThat() oGraphics.DoThis() oGraphics.DoThat() oGraphics.oCanvas.Refresh() && or .draw() For all screen based surfaces ** state should be preserved **And then finally but very important for printing oGraphics.oCanvas.ToPrinter(cPrinterName,'A3','LANDSCAPE',,,,,,,,,,,,,)Now parameters (',,,,,,,,,,,,' part) by all means are not supposed to be binary API structures like in those scarry API samples but plain chars/numbers (as you people already did there in ToPrinter() method !).