Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym temacie opisano sposób pobierania kontekstu urządzenia drukarki. Kontekst urządzenia drukarki można pobrać, wywołując bezpośrednio funkcję CreateDC lub uzyskując go za pomocą wspólnego okna dialogowego Drukuj.
Wyświetlając Drukuj w typowym oknie dialogowym, użytkownik będzie mógł wybrać drukarkę, strony dokumentu i liczbę kopii dokumentu, które chcą wydrukować. Typowe okno dialogowe Drukuj zwraca te opcje w strukturze danych.
W tym temacie opisano sposób uzyskiwania kontekstu urządzenia drukarki przy użyciu następujących metod.
Wywołanie CreateDC
Jeśli znasz urządzenie, do którego chcesz wydrukować, możesz wywołać CreateDC i przekazać te informacje bezpośrednio do funkcji. createDC zwraca kontekst urządzenia, w którym można renderować zawartość do drukowania.
Najprostsze wywołanie pobierania kontekstu urządzenia jest pokazane w poniższym przykładzie kodu. Kod w tym przykładzie pobiera kontekst urządzenia do domyślnego urządzenia wyświetlania.
hDC = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
Aby drukować na określonej drukarce, należy wskazać "WINSPOOL" jako urządzenie i podać poprawną nazwę drukarki do CreateDC. Możesz również przekazać strukturę DEVMODE w wywołaniu do CreateDC, jeśli chcesz podać dane inicjowania specyficzne dla urządzenia dla sterownika urządzenia podczas tworzenia kontekstu urządzenia.
W poniższym przykładzie pokazano wywołanie CreateDC, w którym wybrano sterownik "WINSPOOL", a nazwa drukarki jest określona przez nazwę.
printerDC = CreateDC( L"WINSPOOL", printerName, NULL, NULL);
Można uzyskać dokładny ciąg nazwy drukarki, który ma zostać przekazany do CreateDC, wywołując funkcjęEnumPrinters. Poniższy przykład kodu pokazuje, jak wywołać EnumPrinters i pobrać nazwy lokalnych i lokalnie podłączonych drukarek. Ponieważ rozmiar wymaganego buforu nie może być wcześniej znany, enumPrinters jest wywoływany dwa razy. Pierwsze wywołanie zwraca rozmiar wymaganego buforu. Te informacje służą do przydzielenia bufora wymaganego rozmiaru, a drugie wywołanie funkcji EnumPrinters zwraca żądane dane.
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
}
}
Wyświetl standardowe okno dialogowe Drukowanie
Do wyświetlenia użytkownikowi można wybrać jedną z dwóch Drukuj typowych okien dialogowych; nowsze okno dialogowe, które można wyświetlić, wywołując funkcję PrintDlgEx, a starsze okno dialogowe w starym stylu, które można wyświetlić, wywołując funkcję PrintDlg. W poniższych sekcjach opisano sposób wywoływania każdego okna dialogowego z aplikacji.
Korzystanie z funkcji PrintDlgEx
Wywołaj funkcję PrintDlgEx, aby wyświetlić arkusz właściwości drukowania . Za pomocą arkusza właściwości użytkownik może określić informacje o zadaniu drukowania. Na przykład użytkownik może wybrać zakres stron do wydrukowania, liczbę kopii itd. PrintDlgEx może również pobrać uchwyt do kontekstu urządzenia dla wybranej drukarki. Uchwyt umożliwia renderowanie danych wyjściowych na drukarce.
Aby uzyskać przykładowy kod ilustrujący użycie PrintDlgEx do pobrania kontekstu urządzenia drukarki, znajdziesz w części "Korzystanie z arkusza właściwości drukowania" w korzystanie z typowych okien dialogowych.
Korzystanie z funkcji PrintDlg
Jeśli aplikacja musi działać w systemie, który nie obsługuje funkcji PrintDlgEx, takiej jak w systemie z systemem z systemem starszym niż Windows 2000 lub nie wymaga dodatkowej funkcjonalności zapewnianej przez funkcję PrintDlgEx, użyj funkcji PrintDlg. W poniższych krokach opisano sposób wyświetlania starszego stylu okna dialogowego Print.
- Zainicjuj strukturę danych PRINTDLG.
- Wywołaj PrintDlg, aby wyświetlić Drukuj typowe okno dialogowe dla użytkownika.
- Jeśli wywołanie PrintDlg zwróci TRUE, zablokuj zwróconą pamięć struktury DEVMODE. Jeśli wywołanie PrintDlg zwróci FALSE, użytkownik nacisnął przycisk Anuluj w typowym oknie dialogowym Drukuj, więc nie ma nic więcej do zrobienia.
- Przydziel lokalny bufor pamięci, który jest wystarczająco duży, aby zawierać kopię struktury DEVMODE.
- Skopiuj zwróconą strukturę DEVMODE do lokalnie przydzielonej struktury.
- Zapisz inne informacje zwrócone w strukturze PRINTDLG i które będą potrzebne do przetworzenia zadania drukowania.
- Zwolnij PRINTDLG i bufory pamięci, do których się odnosi.
Poniższy przykładowy kod ilustruje sposób użycia funkcji PrintDlg w celu pobrania kontekstu urządzenia i nazwy wybranej drukarki.
// 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.
}
Aby uzyskać więcej informacji na temat funkcji PrintDlg, zobacz "Wyświetlanie okna dialogowego drukowania" w Używanie Typowych Okien Dialogowych.