.

Breaking News
recent

-

¿Cómo enviar datos a la impresora desde un programa C o C+

Lo más sencillo es usar la impresora directamente, aunque no estoy seguro de que esto funcione, ya que tengo la impresora averiada:

#include <fstream>

using namespace std;

int main()
{
ofstream impresora;
impresora.open("LPT1" ) ;

impresora << "Hola, mundof" << endl;
impresora.close();
return 0;
}


El carácter 'f' es el form-feed, sirve para finalizar la página y expulsar el papel.

Ahora bien, usando el API, y el spooler de la impresora, es más complicado, aunque también más recomendable.

No es un tema corto de explicar, pero te haré un pequeño resumen.

Hay varias funciones del API que debes usar:

DeviceCapabilities: Te ayudará a saber cosas como las dimensiones del papel, la resolución en puntos por pulgada, etc.
StartDoc : Comienza la generación de un documento a imprimir.
StartPage : Comienza una página.
EndPage : Termina la página actual.
EndDoc : Termina la impresión del documento actual.


El mecanismo sigue la siguiente estructura:

Crear el contexto de dispositivo para la impresora (DC).
Comenzar el documento: StartDoc.
Salida al DC de impresora comenzando y terminando las páginas necesarias: StartPage, EndPage.
Terminar el documento. EndDoc.
Liberar el DC de impresora.


Ahí va un ejemplo, antes de nada necesitamos un DC para la impresora. Todas las funciones gráficas que sirven para un DC de pantalla se pueden usar también en un DC de impresora:

BOOL PrintRect(HDC hPrintDC)
{
DOCINFO diInfo;
char DocName[5] = "hello";

diInfo.cbSize = sizeof(DOCINFO);
diInfo.lpszDocName = (LPSTR)DocName;
diInfo.lpszOutput = NULL;
StartDoc(hPrintDC, (LPDOCINFO)&diInfo);
StartPage(hPrintDC);
Rectangle(hPrintDC, 0, 0, 100, 100);
EndPage(hPrintDC);
EndDoc(hPrintDC);
}


Para crear un DC de impresora se necesita la función:

HDC CreateDC(
LPCTSTR lpszDriver, // address of string specifying driver name
LPCTSTR lpszDevice, // address of string specifying device name
LPCTSTR lpszOutput, // do not use; set to NULL
CONST DEVMODE *lpInitData // address of optional printer data
);


Los parámetros necesarios se pueden obtener del registro, si quieres usar la impresora por defecto. O también puedes obtener una lista de las impresoras del sistema:

BOOL EnumPrinters(
DWORD Flags, // types of printer objects to enumerate
LPTSTR Name, // name of printer object
DWORD Level, // specifies type of printer info structure
LPBYTE pPrinterEnum, // pointer to buffer to receive printer info structures
DWORD cbBuf, // size, in bytes, of array
LPDWORD pcbNeeded, // pointer to variable with no. of bytes copied (or required)
LPDWORD pcReturned // pointer to variable with no. of printer info. structures copied
);


Para usarla:

LPBYTE buffer;
PRINTER_INFO_1 *piPrinter;
DWORD necesita, noprinters;

EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 1, buffer, 0, &necesita, &noprinters);
buffer = new BYTE[necesita];
EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 1, buffer, necesita, &necesita, &noprinters);
piPrinter = (PRINTER_INFO_1*)buffer;


PRINTER_INFO_1 tiene esta estructura:

typedef struct _PRINTER_INFO_1 { // pri1
DWORD Flags;
LPTSTR pDescription;
LPTSTR pName;
LPTSTR pComment;
} PRINTER_INFO_1;

No hay comentarios:

Publicar un comentario

-

Con la tecnología de Blogger.