Partager via


Envoi d’une sortie GDI+ vers une imprimante

L’utilisation de Windows GDI+ pour dessiner sur une imprimante est similaire à l’utilisation de GDI+ pour dessiner sur un écran d’ordinateur. Pour dessiner sur une imprimante, obtenez une poignée de contexte d’appareil pour l’imprimante, puis transmettez ce handle à un constructeur Graphics .

L’application console suivante dessine une ligne, un rectangle et une ellipse sur une imprimante nommée 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;
}

Dans le code précédent, les trois commandes de dessin GDI+ se trouvent entre les appels aux fonctions StartDoc et EndDoc , chacune recevant le handle de contexte du périphérique d’imprimante. Toutes les commandes graphiques entre StartDoc et EndDoc sont routées vers un métafichier temporaire. Après l’appel à EndDoc, le pilote d’imprimante convertit les données du métafichier dans le format requis par l’imprimante spécifique utilisée.

Notes

Si le spoulage n’est pas activé pour l’imprimante utilisée, la sortie graphique n’est pas routée vers un métafichier. Au lieu de cela, les commandes graphiques individuelles sont traitées par le pilote d’imprimante, puis envoyées à l’imprimante.

 

En règle générale, vous ne souhaitez pas coder en dur le nom d’une imprimante comme cela a été fait dans l’application console précédente. Une alternative au codage en dur du nom consiste à appeler GetDefaultPrinter pour obtenir le nom de l’imprimante par défaut. Avant d’appeler GetDefaultPrinter, vous devez allouer une mémoire tampon suffisamment grande pour contenir le nom de l’imprimante. Vous pouvez déterminer la taille de la mémoire tampon requise en appelant GetDefaultPrinter, en passant NULL comme premier argument.

Notes

La fonction GetDefaultPrinter est prise en charge uniquement sur Windows 2000 et versions ultérieures.

 

L’application console suivante obtient le nom de l’imprimante par défaut, puis dessine un rectangle et une ellipse sur cette imprimante. L’appel Graphics::D rawRectangle se trouve entre les appels à StartPage et EndPage, de sorte que le rectangle se trouve sur une page par lui-même. De même, l’ellipse est sur une page par elle-même.

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