>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 PrtClass >>
>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) > >ENDDEFINE > >>