Vorgehensweise: Abrufen eines Druckergerätekontexts
In diesem Thema wird beschrieben, wie Sie einen Druckergerätekontext abrufen. Sie können den Kontext eines Druckergeräts abrufen, indem Sie die CreateDC-Funktion direkt aufrufen, oder sie kann von einem Dialogfeld "Gemeinsames Drucken " zurückgegeben werden.
Wenn Sie ein allgemeines Dialogfeld Drucken anzeigen, kann ein Benutzer den Drucker, die Seiten des Dokuments und die Anzahl der Dokumentkopien auswählen, die er drucken möchte. Das Dialogfeld Gemeinsames Drucken gibt diese Auswahl in einer Datenstruktur zurück.
In diesem Thema wird beschrieben, wie Sie mithilfe der folgenden Methoden einen Druckergerätekontext abrufen.
Aufrufen von CreateDC
Wenn Sie das Gerät kennen, auf dem Sie drucken möchten, können Sie CreateDC aufrufen und diese Informationen direkt an die Funktion übergeben. CreateDC gibt einen Gerätekontext zurück, in den Sie den zu druckenden Inhalt rendern können.
Der einfachste Aufruf zum Abrufen eines Gerätekontexts wird im folgenden Codebeispiel gezeigt. Der Code in diesem Beispiel ruft einen Gerätekontext zum Standardanzeigegerät ab.
hDC = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
Zum Rendern auf einem bestimmten Drucker müssen Sie "WINSPOOL" als Gerät angeben und den richtigen Namen des Druckers an CreateDC übergeben. Sie können auch eine DEVMODE-Struktur im Aufruf von CreateDC übergeben, wenn Sie beim Erstellen des Gerätekontexts gerätespezifische Initialisierungsdaten für den Gerätetreiber bereitstellen möchten.
Das folgende Beispiel zeigt einen Aufruf von CreateDC , in dem der Treiber "WINSPOOL" ausgewählt und der Druckername durch Den Namen angegeben wird.
printerDC = CreateDC( L"WINSPOOL", printerName, NULL, NULL);
Sie können die genaue Druckernamenzeichenfolge abrufen, die an CreateDC übergeben werden soll, indem Sie die EnumPrinters-Funktion aufrufen. Im folgenden Codebeispiel wird gezeigt, wie Sie EnumPrinters aufrufen und die Namen der lokalen und lokal verbundenen Drucker abrufen. Da die Größe des erforderlichen Puffers nicht im Voraus bekannt sein kann, werden die EnumPrinters zweimal aufgerufen. Der erste Aufruf gibt die Größe des erforderlichen Puffers zurück. Diese Informationen werden verwendet, um einen Puffer der erforderlichen Größe zuzuweisen, und der zweite Aufruf von EnumPrinters gibt die gewünschten Daten zurück.
fnReturn = EnumPrinters(
PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
NULL,
1L, // printer info level
(LPBYTE)NULL,
0L,
&dwNeeded,
&dwReturned);
if (dwNeeded > 0)
{
pInfo = (PRINTER_INFO_1 *)HeapAlloc(
GetProcessHeap(), 0L, dwNeeded);
}
if (NULL != pInfo)
{
dwReturned = 0;
fnReturn = EnumPrinters(
PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
NULL,
1L, // printer info level
(LPBYTE)pInfo,
dwNeeded,
&dwNeeded,
&dwReturned);
}
if (fnReturn)
{
// Review the information from all the printers
// returned by EnumPrinters.
for (i=0; i < dwReturned; i++)
{
// pThisInfo[i]->pName contains the printer
// name to use in the CreateDC function call.
//
// When this desired printer is found in the list of
// returned printer, set the printerName value to
// use in the call to CreateDC.
// printerName = pThisInfo[i]->pName
}
}
Anzeigen eines allgemeinen Dialogfelds "Drucken"
Sie können zwischen zwei allgemeinen Dialogfeldern drucken auswählen, die einem Benutzer angezeigt werden sollen. das neuere Dialogfeld, das Sie anzeigen können, indem Sie die PrintDlgEx-Funktion aufrufen, und das ältere Formatdialogfeld, das Sie durch Aufrufen der PrintDlg-Funktion anzeigen können. In den folgenden Abschnitten wird beschrieben, wie die einzelnen Dialogfelder aus einer Anwendung aufgerufen werden.
Verwenden der PrintDlgEx-Funktion
Rufen Sie die PrintDlgEx-Funktion auf, um das Eigenschaftenblatt Print anzuzeigen. Mithilfe des Eigenschaftenblatts kann der Benutzer Informationen zum Druckauftrag angeben. Der Benutzer kann beispielsweise einen Bereich von zu druckenden Seiten, die Anzahl der Kopien usw. auswählen. PrintDlgEx kann auch ein Handle für einen Gerätekontext für den ausgewählten Drucker abrufen. Sie können den Handle verwenden, um die Ausgabe auf dem Drucker zu rendern.
Beispielcode, der die Verwendung von PrintDlgEx zum Abrufen eines Druckergerätekontexts veranschaulicht, finden Sie unter Verwenden des Druckeigenschaftenblatts unter Verwenden allgemeiner Dialogfelder.
Verwenden der PrintDlg-Funktion
Wenn Ihre Anwendung auf einem System ausgeführt werden muss, das die PrintDlgEx-Funktion nicht unterstützt, z. B. auf einem System, auf dem eine Version von Windows vor Windows 2000 ausgeführt wird, oder nicht die zusätzliche Funktionalität benötigt, die die PrintDlgEx-Funktion bietet, verwenden Sie die PrintDlg-Funktion . In den folgenden Schritten wird beschrieben, wie sie das Dialogfeld " Common" im älteren Stil anzeigen.
- Initialisieren Sie die PRINTDLG-Datenstruktur .
- Rufen Sie PrintDlg auf, um dem Benutzer das Dialogfeld Gemeinsames Drucken anzuzeigen.
- Wenn der PrintDlg-AufrufTRUE zurückgibt, sperren Sie den zurückgegebenen DEVMODE-Strukturspeicher . Wenn der PrintDlg-AufrufFALSE zurückgibt, hat der Benutzer im Dialogfeld Gemeinsames Drucken die Schaltfläche Abbrechen gedrückt, sodass nichts mehr zu verarbeiten ist.
- Ordnen Sie einen lokalen Speicherpuffer zu, der groß genug ist, um eine Kopie der DEVMODE-Struktur zu enthalten.
- Kopieren Sie die zurückgegebene DEVMODE-Struktur in die lokal zugeordnete Struktur.
- Speichern Sie andere Informationen, die in der PRINTDLG-Struktur zurückgegeben werden und die Sie zum Verarbeiten des Druckauftrags benötigen.
- Geben Sie die PRINTDLG-Datei und die Speicherpuffer frei, auf die verwiesen wird.
Der folgende Beispielcode veranschaulicht, wie Sie die PrintDlg-Funktion verwenden, um den Gerätekontext und den Namen des ausgewählten Druckers abzurufen.
// Display the printer dialog box so the user can select the
// printer and the number of copies to print.
BOOL printDlgReturn = FALSE;
HDC printerDC = NULL;
PRINTDLG printDlgInfo = {0};
LPWSTR localPrinterName = NULL;
PDEVMODE returnedDevmode = NULL;
PDEVMODE localDevmode = NULL;
int localNumberOfCopies = 0;
// Initialize the print dialog box's data structure.
printDlgInfo.lStructSize = sizeof( printDlgInfo );
printDlgInfo.Flags =
// Return a printer device context.
PD_RETURNDC
// Don't allow separate print to file.
// Remove these flags if you want to support this feature.
| PD_HIDEPRINTTOFILE
| PD_DISABLEPRINTTOFILE
// Don't allow selecting individual document pages to print.
// Remove this flag if you want to support this feature.
| PD_NOSELECTION;
// Display the printer dialog and retrieve the printer DC.
printDlgReturn = PrintDlg(&printDlgInfo);
// Check the return value.
if (TRUE == printDlgReturn)
{
// The user clicked OK so the printer dialog box data
// structure was returned with the user's selections.
// Copy the relevant data from the data structure and
// save them to a local data structure.
//
// Get the HDC of the selected printer
printerDC = printDlgInfo.hDC;
// In this example, the DEVMODE structure returned by
// the printer dialog box is copied to a local memory
// block and a pointer to the printer name that is
// stored in the copied DEVMODE structure is saved.
//
// Lock the handle to get a pointer to the DEVMODE structure.
returnedDevmode = (PDEVMODE)GlobalLock(printDlgInfo.hDevMode);
localDevmode = (LPDEVMODE)HeapAlloc(
GetProcessHeap(),
HEAP_ZERO_MEMORY | HEAP_GENERATE_EXCEPTIONS,
returnedDevmode->dmSize);
if (NULL != localDevmode)
{
memcpy(
(LPVOID)localDevmode,
(LPVOID)returnedDevmode,
returnedDevmode->dmSize);
// Save the printer name from the DEVMODE structure.
// This is done here just to illustrate how to access
// the name field. The printer name can also be accessed
// by referring to the dmDeviceName in the local
// copy of the DEVMODE structure.
localPrinterName = localDevmode->dmDeviceName;
// Save the number of copies as entered by the user
localNumberOfCopies = printDlgInfo.nCopies;
}
else
{
// Unable to allocate a new structure so leave
// the pointer as NULL to indicate that it's empty.
}
// Free the DEVMODE structure returned by the print
// dialog box.
if (NULL != printDlgInfo.hDevMode)
{
GlobalFree(printDlgInfo.hDevMode);
}
}
else
{
// The user cancelled out of the print dialog box.
}
Weitere Informationen zur PrintDlg-Funktion finden Sie unter "Anzeigen des Dialogfelds Drucken" unter Verwenden allgemeiner Dialogfelder.