Envio da saída GDI+ para uma impressora
Usar o Windows GDI+ para desenhar em uma impressora é semelhante ao uso de GDI+ para desenhar em uma tela de computador. Para desenhar em uma impressora, obtenha um identificador de contexto do dispositivo para a impressora e, em seguida, passe esse identificador para um construtor gráfico .
O aplicativo de console a seguir desenha uma linha, um retângulo e uma elipse em uma impressora chamada 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;
}
No código anterior, os três comandos de desenho GDI+ estão entre chamadas para as funções StartDoc e EndDoc , cada uma das quais recebe o identificador de contexto do dispositivo de impressora. Todos os comandos gráficos entre StartDoc e EndDoc são roteados para um metarquivo temporário. Após a chamada para EndDoc, o driver da impressora converte os dados no metarquivo no formato exigido pela impressora específica que está sendo usada.
Observação
Se o spooling não estiver habilitado para a impressora que está sendo usada, a saída gráfica não será roteada para um metarquivo. Em vez disso, os comandos gráficos individuais são processados pelo driver da impressora e enviados para a impressora.
Geralmente, você não vai querer codificar o nome de uma impressora como foi feito no aplicativo de console anterior. Uma alternativa para codificar o nome é chamar GetDefaultPrinter para obter o nome da impressora padrão. Antes de chamar GetDefaultPrinter, você deve alocar um buffer grande o suficiente para manter o nome da impressora. Você pode determinar o tamanho do buffer necessário chamando GetDefaultPrinter, passando NULL como o primeiro argumento.
Observação
A função GetDefaultPrinter tem suporte apenas no Windows 2000 e posterior.
O aplicativo de console a seguir obtém o nome da impressora padrão e desenha um retângulo e uma elipse nessa impressora. A chamada Graphics::D rawRectangle está entre chamadas para StartPage e EndPage, portanto, o retângulo está em uma página por si só. Da mesma forma, a elipse está em uma página por si só.
#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;
}