Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
Print straight to the printer
Message
 
À
26/03/2006 21:26:33
Information générale
Forum:
Visual FoxPro
Catégorie:
Gestionnaire de rapports & Rapports
Versions des environnements
Visual FoxPro:
VFP 9 SP1
OS:
Windows XP SP2
Network:
Windows 2003 Server
Database:
Visual FoxPro
Divers
Thread ID:
01107836
Message ID:
01107955
Vues:
19
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
Précédent
Répondre
Fil
Voir

Click here to load this message in the networking platform