Condividi tramite


Invio di un output GDI+ a una stampante

L'uso di Windows GDI+ per disegnare su una stampante è simile all'uso di GDI+ per disegnare su uno schermo del computer. Per disegnare su una stampante, ottenere un handle del contesto di dispositivo per la stampante e quindi passare tale handle a un costruttore Graphics .

L'applicazione console seguente disegna una linea, un rettangolo e un'ellisse su una stampante denominata 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;
}

Nel codice precedente, i tre comandi di disegno GDI+ si trovano tra le chiamate alle funzioni StartDoc e EndDoc , ognuna delle quali riceve l'handle del contesto di dispositivo della stampante. Tutti i comandi grafici tra StartDoc e EndDoc vengono indirizzati a un metafile temporaneo. Dopo la chiamata a EndDoc, il driver della stampante converte i dati nel metafile nel formato richiesto dalla stampante specifica in uso.

Nota

Se lo spooling non è abilitato per la stampante in uso, l'output grafico non viene instradato a un metafile. Al contrario, i singoli comandi grafici vengono elaborati dal driver della stampante e quindi inviati alla stampante.

 

In genere non si vuole impostare come hardcoded il nome di una stampante come è stato fatto nell'applicazione console precedente. Un'alternativa alla codifica hardcoded del nome consiste nel chiamare GetDefaultPrinter per ottenere il nome della stampante predefinita. Prima di chiamare GetDefaultPrinter, è necessario allocare un buffer sufficientemente grande da contenere il nome della stampante. È possibile determinare le dimensioni del buffer richiesto chiamando GetDefaultPrinter, passando NULL come primo argomento.

Nota

La funzione GetDefaultPrinter è supportata solo in Windows 2000 e versioni successive.

 

L'applicazione console seguente ottiene il nome della stampante predefinita e quindi disegna un rettangolo e un'ellisse sulla stampante. La chiamata Graphics::D rawRectangle è compresa tra le chiamate a StartPage e EndPage, quindi il rettangolo si trova in una pagina da sola. Analogamente, l'ellisse si trova in una pagina da sola.

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