Aqui esta la Clase TDirectPrint de William. Ha sido muy amable en proporcionarmela con la expresa autorizaci贸n para publicarla. Gracias William!
http://code.google.com/p/fivewin-contributions/downloads/detail?name=wtraw.prg&can=2&q=
wtraw.prg
/*
//
// 聽Fecha 聽 聽 聽 聽 聽: 22 de enero del 2010
// 聽Autor 聽 聽 聽 聽 聽: William Morales
// 聽M贸dulo 聽 聽 聽 聽 : Clase para imprimir documentos directos a la impresora de windows
// 聽Nombre 聽 聽 聽 聽 : wtraw.prg
//
*/
#include <fivewin.ch>
#xcommand @ <nRow>, <nCol> SAYDOS <Text> => ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽DevPos( <nRow>,<nCol>); DevOut(<Text>)
CLASS TDirectPrint
聽 聽DATA cIncos 聽 聽 聽 聽AS CHARACTER 聽 聽 聽 INIT "TDirectPrint v 0.1"
聽 聽DATA cBuild 聽 聽 聽 聽AS CHARACTER 聽 聽 聽 INIT "20100122"
聽 聽DATA cCredits 聽 聽 聽AS CHARACTER 聽 聽 聽 INIT "Autor: William Morales" + CRLF + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "wmormar@hotmail.com" + CRLF + CRLF + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "Tester: " + CRLF + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 " 聽 Willi Quintana" + CRLF + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 " 聽 Oscar Chacon (costa rica)"
聽 聽DATA cMsg 聽 聽 聽 聽 聽AS CHARACTER 聽 聽 聽 INIT ""
聽 聽DATA cFile 聽 聽 聽 聽 AS CHARACTER 聽 聽 聽 INIT ""
聽 聽DATA cContent 聽 聽 聽AS CHARACTER 聽 聽 聽 INIT ""
聽 聽DATA cPrinter 聽 聽 聽AS CHARACTER 聽 聽 聽 INIT GetDefaultPrinter()
聽 聽DATA cDocument 聽 聽 AS CHARACTER 聽 聽 聽 INIT "Imprimiendo documento : Powered by INCOS"
聽 聽DATA cLogo 聽 聽 聽 聽 AS CHARACTER 聽 聽 聽 INIT ""
聽 聽DATA nRow 聽 聽 聽 聽 聽AS NUMERIC 聽 聽 聽 聽 INIT 0
聽 聽DATA nCol 聽 聽 聽 聽 聽AS NUMERIC 聽 聽 聽 聽 INIT 0
聽 聽DATA nCopy 聽 聽 聽 聽 AS NUMERIC 聽 聽 聽 聽 INIT 1
聽 聽DATA nHeight 聽 聽 聽 AS NUMERIC 聽 聽 聽 聽 INIT 20
聽 聽DATA nWidth 聽 聽 聽 聽AS NUMERIC 聽 聽 聽 聽 INIT 35
聽 聽DATA lDo 聽 聽 聽 聽 聽 AS LOGICAL 聽 聽 聽 聽 INIT .f.
聽 聽METHOD new( cPrinter ) CONSTRUCTOR
聽 聽METHOD printerdefault() 聽 聽 聽 聽 聽 聽 聽 INLINE ::cPrinter := GetDefaultPrinter()
聽 聽METHOD setlpt( nPort )
聽 聽METHOD jump( nJump )
聽 聽METHOD esc( cText )
聽 聽METHOD say( nRow, nCol, cText )
聽 聽METHOD opencash( cPrinter, nCash )
聽 聽METHOD sendtoprinter()
聽 聽METHOD checkport( nPort ) 聽 聽 聽 聽 聽 聽 INLINE PrintReady( nPort )
聽 聽METHOD eject() 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽INLINE ::esc( Chr(12) )
聽 聽METHOD beginprint() 聽 聽 聽 聽 聽 聽 聽 聽 聽 INLINE (::esc( Chr(27) + Chr(64) ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::esc( Chr(27) + Chr(120), Chr( 0 ) ) ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 )
聽 聽METHOD endprint() 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 INLINE (::esc( Chr(27) + Chr(18) ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::esc( Chr(27) + Chr(50) ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::esc( Chr(27) + Chr(72) ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::esc( Chr(27) + Chr(80) ) 聽;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 )
聽 聽METHOD bold( lOnOff ) 聽 聽 聽 聽 聽 聽 聽 聽 INLINE IF( lOnOff, ::esc( Chr(27) + Chr(71) ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::esc( Chr(27) + Chr(72) ) 聽;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 )
聽 聽METHOD condensed() 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽INLINE ::esc( Chr(27) + Chr(15) )
聽 聽METHOD normal() 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 INLINE ::esc( Chr(27) + Chr(18) )
聽 聽METHOD expansive( lOnOff ) 聽 聽 聽 聽 聽 聽INLINE IF( lOnOff, ::esc( Chr(27) + Chr(14) ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::esc( Chr(27) + Chr(20) ) 聽;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 )
聽 聽METHOD superscript( lOnOff ) 聽 聽 聽 聽 聽INLINE IF( lOnOff, ::esc( Chr(27) + Chr(83) + Chr(48) ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::esc( Chr(27) + Chr(84) ) 聽;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 )
聽 聽METHOD subscript( lOnOff ) 聽 聽 聽 聽 聽 聽INLINE IF( lOnOff, ::esc( Chr(27) + Chr(83) + Chr(49) ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::esc( Chr(27) + Chr(84) ) 聽;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 )
聽 聽METHOD underline( lOnOff ) 聽 聽 聽 聽 聽 聽INLINE IF( lOnOff, ::esc( Chr(27) + Chr(45) + Chr(49) ), ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 ::esc( Chr(27) + Chr(45) + Chr(40) ) 聽;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 )
聽 聽METHOD prnfile( cFile )
聽 聽METHOD logo( cFile, nHeight, nWidth ) INLINE (::cLogo := cFile, ::nHeight := nHeight, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽::nWidth := nWidth )
聽 聽METHOD printlogo()
ENDCLASS
/**************************************************************************************/
METHOD new( cPrinter )
聽 聽LOCAL nFile := 1
聽 聽DEFAULT cPrinter := GetDefaultPrinter()
聽 聽::cPrinter := cPrinter
聽 聽::lDo 聽 聽 聽:= .t.
聽 聽::cMsg 聽 聽 := ::cIncos + " - " + ::cBuild
聽 聽::cContent := ""
聽 聽::nCol 聽 聽 := 0
聽 聽::nRow 聽 聽 := 0
聽 聽WHILE .t.
聽 聽 聽 ::cFile := "wmprn" + PadL( nFile++, 3, "0" ) + ".gcj"
聽 聽 聽 IF !File( ::cFile )
聽 聽 聽 聽 聽EXIT
聽 聽 聽 ENDIF
聽 聽 聽 sysrefresh()
聽 聽ENDDO
聽 聽SET PRINTER TO (::cFile)
聽 聽SET DEVICE TO PRINT
聽 聽RETURN Self
/**************************************************************************************/
METHOD setlpt( nPort )
聽 聽LOCAL cPort := ""
聽 聽DEFAULT nPort := 1
聽 聽::lDo := .t.
聽 聽cPort := PrinterPortToName( "LPT" + WCStr(nPort) + ":" )
聽 聽IF Empty( cPort )
聽 聽 聽 MSGINFO( "No hay impresora en el puerto seleccionado...", ::cMsg )
聽 聽 聽 ::lDo := .f.
聽 聽 聽 RETURN NIL
聽 聽ENDIF
聽 聽::cPrinter := cPort
聽 聽RETURN NIL
/**************************************************************************************/
METHOD jump( nJump )
聽 聽LOCAL x := 0
聽 聽DEFAULT nJump := 1
聽 聽FOR x := 1 TO nJump
聽 聽 聽 @ ::nRow, 00 SAYDOS ""
聽 聽 聽 ::nRow += 1
聽 聽NEXT
聽 聽::nCol := 00
聽 聽RETURN NIL
/**************************************************************************************/
METHOD esc( cText )
聽 聽@ ::nRow++, 00 SAYDOS cText
聽 聽::nCol := Len(cText) + 1
聽 聽RETURN NIL
/**************************************************************************************/
METHOD say( nRow, nCol, cText )
聽 聽IF nRow < ::nRow
聽 聽 聽 nRow := ::nRow
聽 聽ENDIF
聽 聽IF nCol < ::nCol
聽 聽 聽 nCol := ::nCol
聽 聽ENDIF
聽 聽::nRow := nRow
聽 聽::nCol := nCol
聽 聽@ ::nRow++, ::nCol SAYDOS cText
聽 聽::nCol := ::nCol + Len(cText) + 1
聽 聽RETURN NIL
/**************************************************************************************/
METHOD opencash( cPrinter, nCash )
聽 聽LOCAL cEscape 聽 聽:= ""
聽 聽DEFAULT cPrinter := "epson"
聽 聽DEFAULT nCash 聽 聽:= 0
聽 聽cEscape := Chr( 27 ) + Chr( 112 ) + WCStr( nCash ) + Chr(40) + Chr( 108 )
聽 聽IF Lower( cPrinter ) == "start"
聽 聽 聽 cEscape := Chr( 27 ) + Chr( 80 )
聽 聽ENDIF
聽 聽@ ::nRow++, 00 SAYDOS cEscape
聽 聽::nCol := Len(cEscape) + 1
聽 聽RETURN NIL
/**************************************************************************************/
METHOD sendtoprinter( lDelete )
聽 聽LOCAL x 聽 聽 := 1
聽 聽LOCAL nRet 聽:= 0
聽 聽LOCAL cMsg 聽:= ""
聽 聽LOCAL lShow := .f.
聽 聽DEFAULT lDelete := .t.
聽 聽SET DEVICE TO SCREEN
聽 聽SET PRINTER TO
聽 聽IF ::nCopy < 1
聽 聽 聽 ::nCopy := 1
聽 聽ENDIF
聽 聽FOR x := 1 TO ::nCopy
聽 聽 聽 ::printlogo()
聽 聽 聽 nRet := PrintFileRaw( ::cPrinter, ::cFile, ::cDocument )
聽 聽 聽 cMsg += "Copy " + WCStr( x ) + CRLF
聽 聽 聽 IF nRet # 1
聽 聽 聽 聽 聽lShow := .t.
聽 聽 聽 ENDIF
聽 聽 聽 SWITCH nRet
聽 聽 聽 CASE -1
聽 聽 聽 聽 聽cMsg += "Invalid parameters passed to function" ; EXIT
聽 聽 聽 CASE -2
聽 聽 聽 聽 聽cMsg += "WinAPI OpenPrinter() call failed" 聽 聽 聽; EXIT
聽 聽 聽 CASE -3
聽 聽 聽 聽 聽cMsg += "WinAPI StartDocPrinter() call failed" 聽; EXIT
聽 聽 聽 CASE -4
聽 聽 聽 聽 聽cMsg += "WinAPI StartPagePrinter() call failed" ; EXIT
聽 聽 聽 CASE -5
聽 聽 聽 聽 聽cMsg += "WinAPI malloc() of memory failed" 聽 聽 聽; EXIT
聽 聽 聽 CASE -6
聽 聽 聽 聽 聽cMsg += "File " + ::cFile + " not found" 聽 聽 聽 聽; EXIT
聽 聽 聽 DEFAULT
聽 聽 聽 聽 聽cMsg += "PRINTED OK!!!"
聽 聽 聽 END
聽 聽 聽 cMsg 聽 聽+= CRLF + CRLF
聽 聽NEXT
聽 聽IF lDelete
聽 聽 聽 FErase( ::cFile )
聽 聽ENDIF
聽 聽IF lShow
聽 聽 聽 MSGINFO( cMsg, ::cMsg )
聽 聽ENDIF
聽 聽RETURN NIL
/**************************************************************************************/
METHOD prnfile( cFile, lDeletepost )
聽 聽DEFAULT lDeletepost := .f.
聽 聽::cFile := cFile
聽 聽::sendtoprinter( lDeletepost )
聽 聽RETURN NIL
/**************************************************************************************/
METHOD printlogo()
聽 聽LOCAL cEmf := ""
聽 聽LOCAL oImg := NIL
聽 聽IF Empty( ::cLogo )
聽 聽 聽 RETURN NIL
聽 聽ENDIF
聽 聽IF !File( ::cLogo )
聽 聽 聽 MSGINFO( "Archivo logo no existe, verifique...", ::cMsg )
聽 聽 聽 RETURN NIL
聽 聽ENDIF
聽 聽//oImg := TImage()
聽 聽//oImg:LoadImage( , ::cLogo )
聽 聽//wgrabaemf( oImg:hDC, "wmlogo.xxx" )
聽 聽//PrintFileRaw( ::cPrinter, ::cLogo, ::cDocument )
聽 聽RETURN NIL
/**************************************************************************************/