Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Print straight to the printer
Message
 
To
26/03/2006 21:26:33
General information
Forum:
Visual FoxPro
Category:
Reports & Report designer
Environment versions
Visual FoxPro:
VFP 9 SP1
OS:
Windows XP SP2
Network:
Windows 2003 Server
Database:
Visual FoxPro
Miscellaneous
Thread ID:
01107836
Message ID:
01107955
Views:
20
Here's the code I use to print direct to the printer. Note that this requires the Struct class available in the downloads area of this forum.
LPARAMETERS c_sendthis
#DEFINE HANDLE INTEGER
#DEFINE BOOLEAN LONG

DECLARE LONG EndPagePrinter IN winspool.drv LONG hPrinter
DECLARE LONG StartPagePrinter IN winspool.drv LONG hPrinter
DECLARE LONG GetLastError IN WIN32API AS GetLastError
DECLARE BOOLEAN OpenPrinterA IN WINSPOOL.DRV AS OpenPrinter ;
   STRING pPrinterName, ;
   HANDLE @phPrinter, ;
   LONG pDefault
DECLARE LONG StartDocPrinterA IN WINSPOOL.DRV AS StartDocPrinter ;
   LONG hPrinter, ;
   LONG LEVEL, ;
   STRING pDocInfo
DECLARE BOOLEAN EndDocPrinter IN WINSPOOL.DRV AS EndDocPrinter ;
   HANDLE hPrinter
DECLARE BOOLEAN WritePrinter IN WINSPOOL.DRV AS WritePrinter ;
   HANDLE hPrinter, ;
   STRING pBuf, ;
   LONG cbBuf, ;
   LONG @pcWritten
DECLARE BOOLEAN ClosePrinter IN WINSPOOL.DRV AS ClosePrinter ;
   HANDLE hPrinter
LOCAL cPtrName, lhPrinter, lReturn, lpcWritten, lDoc, sWrittenData, ;
   lDocInfo, dwBytesWritten, libload, lcStruct, cProcFileName
STORE 0 TO lhPrinter, lReturn, lpcWritten, lDoc, dwBytesWritten
sWrittenData = ""
*lpData = "Hello World."
dwCount=LEN(c_sendthis)
m.cPtrName=GETPRINTER()
IF ISBLANK(m.cPtrName)
   RETURN .F.
ENDIF

*typedef struct _DOC_INFO_1 {
*  LPTSTR pDocName;
*  LPTSTR pOutputFile;
*  LPTSTR pDatatype;
*} DOC_INFO_1

IF OpenPrinter(cPtrName, @lhPrinter, 0) = 0
   MESSAGEBOX("The Printer Name you typed wasn't recognized.")
   RETURN
ENDIF

*!* Create a DOCINFO structure to pass to StartDoc
*!* Requires API structure class definition in foxstruct.prg
IF ATC("foxstruct.",SET("PROCEDURE"))=0
   cProcFileName = JUSTPATH(SYS(16)) + "\foxstruct"
   SET PROC TO (cProcFileName + ".prg") ADDITIVE
   libload = .T.
ENDIF

REPLICATE(CHR(0), 16)
lDocInfo = CREATEOBJECT('struct')
lDocInfo.AddField( 'pDocName',    '@STRING', "Document" )
lDocInfo.AddField( 'pOutputFile', '@STRING', "" )
lDocInfo.AddField( 'pDatatype',   '@STRING', 0 )
lcStruct = lDocInfo.STRUCTURE
IF StartDocPrinter( lhPrinter, 1, @lcStruct ) = 0    && Inform the spooler the document is beginning.
   MESSAGEBOX("Error calling StartDoc" + CHR(13) + ;
      " Error code : " + ALLTRIM(STR(GetLastError())),48)
   ClosePrinter(lhPrinter)
   RETURN FALSE
ENDIF
IF StartPagePrinter(lhPrinter) =0                     && Start a page.
   EndDocPrinter(lhPrinter)
   ClosePrinter(lhPrinter)
   RETURN FALSE
ENDIF
IF WritePrinter(lhPrinter, c_sendthis, dwCount, @dwBytesWritten ) = 0   && Send the data to the printer.
   EndPagePrinter(lhPrinter)
   EndDocPrinter(lhPrinter)
   ClosePrinter(lhPrinter)
   RETURN FALSE
ENDIF
IF EndPagePrinter(lhPrinter) = 0                      && End the page.
   EndDocPrinter(lhPrinter)
   ClosePrinter(lhPrinter)
   RETURN FALSE
ENDIF
IF EndDocPrinter(lhPrinter) = 0                       && Inform the spooler that the document is ending.
   ClosePrinter(lhPrinter)
   RETURN FALSE
ENDIF
ClosePrinter(lhPrinter)                               && Tidy up the printer handle.
IF libload
   RELE PROC (cProcFileName + ".fxp")
ENDIF
Previous
Reply
Map
View

Click here to load this message in the networking platform