Freigeben über


Senden von GDI+-Ausgabe an einen Drucker

Die Verwendung von Windows GDI+ zum Zeichnen auf einem Drucker ähnelt der Verwendung von GDI+, um auf einem Computerbildschirm zu zeichnen. Um auf einem Drucker zu zeichnen, rufen Sie ein Gerätekontexthandle für den Drucker ab, 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 vorherigen Code befinden sich die drei GDI+-Zeichenbefehle zwischen aufrufen der Funktionen StartDoc und EndDoc , die jeweils das Kontexthandle des Druckergeräts empfangen. Alle Grafikbefehle zwischen StartDoc und EndDoc werden an eine temporäre Metadatei weitergeleitet. Nach dem Aufruf von EndDoc konvertiert der Druckertreiber die Daten in der Metadatei in das Format, das für den jeweiligen verwendeten Drucker erforderlich ist.

Hinweis

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

 

Im Allgemeinen möchten Sie den Namen eines Druckers nicht hart codieren, wie dies in der vorherigen Konsolenanwendung der Fall war. Eine Alternative zur harten Codierung des Namens besteht darin , GetDefaultPrinter aufzurufen, um den Namen des Standarddruckers abzurufen. 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 unter 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;
}