Condividi tramite


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