Envío de la salida de GDI+ a una impresora
El uso de Windows GDI+ para dibujar en una impresora es similar al uso de GDI+ para dibujar en una pantalla de equipo. Para dibujar en una impresora, obtenga un controlador de contexto de dispositivo para la impresora y, a continuación, pase ese identificador a un constructor gráfico .
La siguiente aplicación de consola dibuja una línea, un rectángulo y una elipse en una impresora denominada MyPrinter:
#include <windows.h>
#include <gdiplus.h>
#include <stdio.h>
using namespace Gdiplus;
INT main()
{
// Initialize GDI+.
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
// Get a device context for the printer.
HDC hdcPrint = CreateDC(NULL, TEXT("\\\\printserver\\print1"), NULL, NULL);
DOCINFO docInfo;
ZeroMemory(&docInfo, sizeof(docInfo));
docInfo.cbSize = sizeof(docInfo);
docInfo.lpszDocName = "GdiplusPrint";
StartDoc(hdcPrint, &docInfo);
StartPage(hdcPrint);
Graphics* graphics = new Graphics(hdcPrint);
Pen* pen = new Pen(Color(255, 0, 0, 0));
graphics->DrawLine(pen, 50, 50, 350, 550);
graphics->DrawRectangle(pen, 50, 50, 300, 500);
graphics->DrawEllipse(pen, 50, 50, 300, 500);
delete pen;
delete graphics;
EndPage(hdcPrint);
EndDoc(hdcPrint);
DeleteDC(hdcPrint);
GdiplusShutdown(gdiplusToken);
return 0;
}
En el código anterior, los tres comandos de dibujo de GDI+ se encuentran entre las llamadas a las funciones StartDoc y EndDoc , cada una de las cuales recibe el identificador de contexto del dispositivo de impresora. Todos los comandos gráficos entre StartDoc y EndDoc se enrutan a un metarchivo temporal. Después de la llamada a EndDoc, el controlador de impresora convierte los datos del metarchivo en el formato requerido por la impresora específica que se está usando.
Nota
Si la cola no está habilitada para la impresora que se usa, la salida de gráficos no se enruta a un metarchivo. En su lugar, el controlador de impresora procesa los comandos gráficos individuales y, a continuación, se envían a la impresora.
Por lo general, no querrá codificar de forma rígida el nombre de una impresora como se hizo en la aplicación de consola anterior. Una alternativa a codificar de forma rígida el nombre es llamar a GetDefaultPrinter para obtener el nombre de la impresora predeterminada. Antes de llamar a GetDefaultPrinter, debe asignar un búfer lo suficientemente grande como para contener el nombre de la impresora. Puede determinar el tamaño del búfer necesario llamando a GetDefaultPrinter y pasando NULL como primer argumento.
Nota
La función GetDefaultPrinter solo se admite en Windows 2000 y versiones posteriores.
La siguiente aplicación de consola obtiene el nombre de la impresora predeterminada y, a continuación, dibuja un rectángulo y una elipse en esa impresora. La llamada Graphics::D rawRectangle está entre llamadas a StartPage y EndPage, por lo que el rectángulo está en una página por sí misma. Del mismo modo, la elipse se encuentra en una página por sí misma.
#include <windows.h>
#include <gdiplus.h>
#include <stdio.h>
using namespace Gdiplus;
INT main()
{
// Initialize GDI+.
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
DWORD size;
HDC hdcPrint;
DOCINFO docInfo;
ZeroMemory(&docInfo, sizeof(docInfo));
docInfo.cbSize = sizeof(docInfo);
docInfo.lpszDocName = "GdiplusPrint";
// Get the size of the default printer name.
GetDefaultPrinter(NULL, &size);
// Allocate a buffer large enough to hold the printer name.
TCHAR* buffer = new TCHAR[size];
// Get the printer name.
if(!GetDefaultPrinter(buffer, &size))
{
printf("Failure");
}
else
{
// Get a device context for the printer.
hdcPrint = CreateDC(NULL, buffer, NULL, NULL);
StartDoc(hdcPrint, &docInfo);
Graphics* graphics;
Pen* pen = new Pen(Color(255, 0, 0, 0));
StartPage(hdcPrint);
graphics = new Graphics(hdcPrint);
graphics->DrawRectangle(pen, 50, 50, 200, 300);
delete graphics;
EndPage(hdcPrint);
StartPage(hdcPrint);
graphics = new Graphics(hdcPrint);
graphics->DrawEllipse(pen, 50, 50, 200, 300);
delete graphics;
EndPage(hdcPrint);
delete pen;
EndDoc(hdcPrint);
DeleteDC(hdcPrint);
}
delete buffer;
GdiplusShutdown(gdiplusToken);
return 0;
}