Visualizzazione di una finestra di dialogo Stampa
Un modo per ottenere un handle del contesto di dispositivo per una stampante consiste nel visualizzare una finestra di dialogo di stampa e consentire all'utente di scegliere una stampante. La funzione PrintDlg (che visualizza la finestra di dialogo) ha un parametro che corrisponde all'indirizzo di una struttura PRINTDLG . La struttura PRINTDLG include diversi membri, ma è possibile lasciare la maggior parte dei membri impostati sui valori predefiniti. I due membri da impostare sono lStructSize e Flags. Impostare lStructSize sulle dimensioni di una variabile PRINTDLG e impostare Flag su PD_RETURNDC. Impostando Flag su PC_RETURNDC specifica che si vuole che la funzione PrintDlg riempia il campo hDC con un handle di contesto di dispositivo per la stampante scelta dall'utente.
#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);
DOCINFO docInfo;
ZeroMemory(&docInfo, sizeof(docInfo));
docInfo.cbSize = sizeof(docInfo);
docInfo.lpszDocName = "GdiplusPrint";
// Create a PRINTDLG structure, and initialize the appropriate fields.
PRINTDLG printDlg;
ZeroMemory(&printDlg, sizeof(printDlg));
printDlg.lStructSize = sizeof(printDlg);
printDlg.Flags = PD_RETURNDC;
// Display a print dialog box.
if(!PrintDlg(&printDlg))
{
printf("Failure\n");
}
else
{
// Now that PrintDlg has returned, a device context handle
// for the chosen printer is in printDlg->hDC.
StartDoc(printDlg.hDC, &docInfo);
StartPage(printDlg.hDC);
Graphics* graphics = new Graphics(printDlg.hDC);
Pen* pen = new Pen(Color(255, 0, 0, 0));
graphics->DrawRectangle(pen, 200, 500, 200, 150);
graphics->DrawEllipse(pen, 200, 500, 200, 150);
graphics->DrawLine(pen, 200, 500, 400, 650);
delete pen;
delete graphics;
EndPage(printDlg.hDC);
EndDoc(printDlg.hDC);
}
if(printDlg.hDevMode)
GlobalFree(printDlg.hDevMode);
if(printDlg.hDevNames)
GlobalFree(printDlg.hDevNames);
if(printDlg.hDC)
DeleteDC(printDlg.hDC);
GdiplusShutdown(gdiplusToken);
return 0;
}