Freigeben über


Anzeigen eines Dialogfelds "Drucken"

Eine Möglichkeit zum Abrufen eines Gerätekontexthandles für einen Drucker besteht darin, ein Druckdialogfeld anzuzeigen und dem Benutzer die Auswahl eines Druckers zu ermöglichen. Die PrintDlg-Funktion (die das Dialogfeld anzeigt) verfügt über einen Parameter, der die Adresse einer PRINTDLG-Struktur darstellt. Die PRINTDLG-Struktur verfügt über mehrere Member, aber Sie können die meisten elemente auf ihre Standardwerte festlegen. Die beiden Elemente, die Sie festlegen müssen, sind lStructSize und Flags. Legen Sie lStructSize auf die Größe einer PRINTDLG-Variablen fest, und legen Sie Flags auf PD_RETURNDC fest. Festlegen von Flags auf PC_RETURNDC gibt an, dass die PrintDlg-Funktion das hDC-Feld mit einem Gerätekontexthandle für den vom Benutzer ausgewählten Drucker füllen soll.

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