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