LOCAL lcPrinter, oPrinter lcPrinter = GETPRINTER() lcTitle = "RTF Printout" SET PROCEDURE TO PrtClass.PRG ADDITIVE oPrinter = CREATEOBJECT("PrintObj",lcPrinter) WITH oPrinter .StartDoc(.hDC, lcTitle) .StartPage(.hDC) This.Parent.Rtfcontrol1.Olecontrol1.SelPrint(.hDC) .EndPage(.hDC) .EndDoc(.hDC) ENDWITH RELEASE oPrinter RELEASE PROCEDURE PrtClassHere is prtclass.prg, which contains the class definition:
DEFINE CLASS PrintObj AS LINE hDC = 0 && holds the printer device context PROTECTED lnHeap, lnDoc lnHeap = 0 lnDoc = 0 PROCEDURE INIT(tcPrinter) && optionally, specify printer *Set up the Win API calls we'll need THIS.DeclareDLLs() * Create the Device Context THIS.hDC = THIS.CreateDC(tcPrinter) ENDPROC PROCEDURE DESTROY DeleteDC(THIS.hDC) ENDPROC PROCEDURE CreateDC(tcPrinter) * If no printer is specified, use the * first from APRINTERS() IF TYPE("tcPrinter")<>"C" OR EMPTY(tcPrinter) LOCAL laPrint[1,2], lncount lncount = APRINTERS(laPrint) IF lncount > 0 tcPrintar = laPrint[1,1] ELSE tcPrinter = "" ENDIF ENDIF RETURN CreateDC("WINSPOOL",tcPrinter,0,0) PROCEDURE DeclareDLLs( ) DECLARE INTEGER StartDoc IN Win32Api INTEGER, STRING DECLARE INTEGER StartPage IN Win32Api INTEGER DECLARE INTEGER EndPage IN Win32Api INTEGER DECLARE INTEGER EndDoc IN Win32Api INTEGER DECLARE INTEGER CreateDC IN Win32Api STRING, STRING, INTEGER, INTEGER DECLARE INTEGER DeleteDC IN Win32Api INTEGER DECLARE INTEGER HeapCreate IN Win32Api INTEGER, INTEGER, INTEGER DECLARE INTEGER HeapDestroy IN Win32Api INTEGER DECLARE INTEGER HeapAlloc IN Win32Api INTEGER, INTEGER, INTEGER DECLARE INTEGER HeapFree IN Win32Api INTEGER, INTEGER, INTEGER DECLARE Istrcpy IN Win32Api INTEGER, STRING ENDPROC PROCEDURE StartDoc(tnhDC, toDocName) * Run the Win API StartDoc function tcDocName = IIF(TYPE("tcDocName")<> "C","", tcDocName) LOCAL lnHeap, lnDoc, lcStruct * Create a Windows string w/ pointer for the queue name THIS.lnHeap = HeapCreate(0, 8192, 8192) THIS.lnDoc = HeapAlloc(THIS.lnHeap, 0, LEN(tcDocName)+1 ) Istrcpy ( THIS. lnDoc, tcDocName ) * Create a structure lcStruct = THIS.Toint(12) + ; THIS.Toint( ; IIF(EMPTY(tcDocName), 0, THIS.lnDoc)) + ; THIS.Toint(0) * Call the win API function StartDoc(tnhDC, lcStruct) ENDPROC FUNCTION Toint(tiNumber) && convert number to Intel * four byte string in low-byte, high-byte format LOCAL cString, nT cString = '' FOR nT = 1 TO 4 cString = cString + CHR(tiNumber%256) tiNumber = INT(tiNumber /256) ENDFOR RETURN cString PROCEDURE EndDoc(tnhDC) * Release the Heap, if allocated IF THIS.lnHeap <> 0 OR THIS.lnDoc <> 0 * Free the memory allocated above HeapFree(THIS.lnBeap, 0, THIS.lnDoc) HeapDestroy(THIS.lnHeap) ENDIF RETURN EndDoc(tnhDC) PROCEDURE StartPage(tnhDC) RETURN StartPage(tnhDC) PROCEDURE EndPage(tnhDC) RETURN EndPage(tnhDC) ENDDEFINEWorks find on WinXX but doesn't appear to work on W2K, yet.