Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I det här avsnittet beskrivs hur du hämtar en skrivarenhetskontext. Du kan hämta en skrivarenhetskontext genom att anropa funktionen CreateDC direkt, eller så kan den returneras av en gemensam utskriftsdialogruta .
När du visar en Skriv ut gemensam dialogruta kan en användare välja skrivare, sidorna i dokumentet och antalet dokumentkopior som de vill skriva ut. Dialogrutan Print common returnerar dessa val i en datastruktur.
Det här avsnittet beskriver hur du hämtar en skrivarenhetskontext med hjälp av följande metoder.
Anropa CreateDC
Om du känner till den enhet som du vill skriva ut till kan du anropa CreateDC- och skicka informationen direkt till funktionen. CreateDC- returnerar en enhetskontext där du kan återge innehållet som ska skrivas ut.
Det enklaste anropet för att hämta en enhetskontext visas i kodexemplet som följer. Koden i det här exemplet hämtar en enhetskontext till standardvisningsenheten.
hDC = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
Om du vill rendera till en viss skrivare måste du ange "WINSPOOL" som enhet och skicka rätt namn på skrivaren till CreateDC-. Du kan också skicka en DEVMODE- struktur i anropet till CreateDC- om du vill ange enhetsspecifika initieringsdata för enhetsdrivrutinen när du skapar enhetskontexten.
I följande exempel visas ett anrop till CreateDC- där "WINSPOOL"-drivrutinen är markerad och skrivarnamnet anges med namn.
printerDC = CreateDC( L"WINSPOOL", printerName, NULL, NULL);
Du kan genom att anropa funktionen EnumPrinters få den exakta strängen för skrivarnamnet som ska skickas till CreateDC. I följande kodexempel visas hur du anropar EnumPrinters och hämtar namnen på de lokala och lokalt anslutna skrivarna. Eftersom storleken på den nödvändiga bufferten inte kan identifieras i förväg anropas EnumPrinters två gånger. Det första anropet returnerar storleken på den buffert som krävs. Den informationen används för att allokera en buffert av den storlek som krävs, och det andra anropet till EnumPrinters returnerar de data som du vill använda.
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
}
}
Visa en gemensam dialogruta för utskrift
Du kan välja mellan två Skriv ut vanliga dialogrutor som ska visas för en användare. den nyare dialogrutan, som du kan visa genom att anropa funktionen PrintDlgEx och den äldre stildialogrutan, som du kan visa genom att anropa funktionen PrintDlg. I följande avsnitt beskrivs hur du anropar varje dialogruta från ett program.
Använda PrintDlgEx-funktionen
Anropa funktionen PrintDlgEx för att visa egenskapsbladet Print. Med hjälp av egenskapsbladet kan användaren ange information om utskriftsjobbet. Användaren kan till exempel välja ett intervall med sidor att skriva ut, antalet kopior och så vidare. PrintDlgEx kan också hämta ett handtag till en enhetskontext för den valda skrivaren. Du kan använda handtaget för att återge utdata på skrivaren.
Exempelkod som illustrerar användningen av PrintDlgEx för att hämta en skrivarenhetskontext finns i "Använda egenskapsbladet för utskrift" i Använda vanliga dialogrutor.
Använda funktionen PrintDlg
Om programmet måste köras på ett system som inte stöder funktionen PrintDlgEx, till exempel på ett system som kör en version av Windows tidigare än Windows 2000 eller inte behöver de extra funktioner som funktionen PrintDlgEx tillhandahåller, använder du funktionen PrintDlg. Följande steg beskriver hur du visar den äldre stilen gemensam dialogruta Skriv ut.
- Initiera PRINTDLG- datastruktur.
- Anropa PrintDlg för att visa den gemensamma dialogrutan Skriv ut för användaren.
- Om PrintDlg--anropet returnerar TRUE-, lås det returnerade DEVMODE--strukturminnet. Om PrintDlg--anropet returnerar FALSE-, tryckte användaren på knappen Avbryt i den gemensamma dialogrutan Skriv ut, så det finns inget mer att bearbeta.
- Allokera en lokal minnesbuffert som är tillräckligt stor för att innehålla en kopia av DEVMODE- struktur.
- Kopiera den returnerade DEVMODE- struktur till den lokalt allokerade strukturen.
- Spara annan information som returneras i PRINTDLG--strukturen och som du måste bearbeta för att kunna hantera utskriftsjobbet.
- Frigör PRINTDLG och minnesbuffrarna det hänvisas till.
Följande exempelkod visar hur du använder funktionen PrintDlg för att hämta enhetskontexten och namnet på den valda skrivaren.
// 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.
}
Mer information om funktionen PrintDlg finns i "Visa dialogrutan Skriv ut" i Använda vanliga dialogrutor.