Senden von GDI+-Ausgabe an einen Drucker

Die Windows GDI+ zeichnen auf einem Drucker ähnelt der Verwendung von GDI+ zum Zeichnen auf einem Computerbildschirm. Um auf einem Drucker zu zeichnen, erhalten Sie ein Gerätekontexthand handle für den Drucker, und übergeben Sie dieses Handle dann an einen Grafikkonstruktor.

Die folgende Konsolenanwendung zeichnet eine Linie, ein Rechteck und eine Ellipse auf einem Drucker namens 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;
}

Im vorangehenden Code befinden sich die drei GDI+ Zeichenbefehle zwischen Aufrufen der Funktionen StartDoc und EndDoc, von denen jeder das Druckergerätekontexthand handle empfängt. Alle Grafikbefehle zwischen StartDoc und EndDoc werden an eine temporäre Metadatei geroutet. Nach dem Aufruf von EndDoc konvertiert der Druckertreiber die Daten in der Metadatei in das Format, das für den verwendeten Drucker erforderlich ist.

Hinweis

Wenn das Spoolen für den verwendeten Drucker nicht aktiviert ist, wird die Grafikausgabe nicht an eine Metadatei geroutet. Stattdessen werden einzelne Grafikbefehle vom Druckertreiber verarbeitet und dann an den Drucker gesendet.

Im Allgemeinen möchten Sie den Namen eines Druckers nicht wie in der vorherigen Konsolenanwendung hart codieren. Eine Alternative zum hart codierenden Namen ist der Aufruf von GetDefaultPrinter, um den Namen des Standarddruckers zu erhalten. Bevor Sie GetDefaultPrinter aufrufen, müssen Sie einen Puffer zuordnen, der groß genug ist, um den Druckernamen zu speichern. Sie können die Größe des erforderlichen Puffers ermitteln, indem Sie GetDefaultPrinter aufrufen und NULL als erstes Argument übergeben.

Hinweis

Die GetDefaultPrinter-Funktion wird nur in Windows 2000 und höher unterstützt.

Die folgende Konsolenanwendung ruft den Namen des Standarddruckers ab und zeichnet dann ein Rechteck und eine Ellipse auf diesem Drucker. Der Graphics::D rawRectangle-Aufruf befindet sich zwischen Aufrufen von StartPage und EndPage,sodass sich das Rechteck allein auf einer Seite befindet. Ebenso befindet sich die Ellipse allein auf einer Seite.

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