Partilhar via


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;
}