Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Toto téma popisuje, jak načíst kontext zařízení tiskárny. Kontext zařízení tiskárny můžete načíst tak, že přímo zavoláte funkci CreateDC, nebo jej může vrátit běžné dialogové okno Tisk.
Když zobrazíte Tisk společné dialogové okno, bude uživatel moct vybrat tiskárnu, stránky dokumentu a počet kopií dokumentu, které chtějí vytisknout. Dialogové okno Tisk běžné vrátí tyto výběry ve struktuře dat.
Toto téma popisuje, jak získat kontext zařízení tiskárny pomocí následujících metod.
Zavolat CreateDC
Pokud znáte zařízení, do kterého chcete tisknout, můžete zavolat CreateDC a předat dané informace přímo funkci. CreateDC vrátí kontext zařízení, do kterého můžete vykreslit obsah k tisku.
Nejjednodušší volání pro načtení kontextu zařízení je znázorněno v následujícím příkladu kódu. Kód v tomto příkladu načte kontext zařízení na výchozí zobrazovací zařízení.
hDC = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
Pro tisk na konkrétní tiskárnu musíte jako zařízení zadat "WINSPOOL" a předat správný název tiskárny do CreateDC. Při zavolání CreateDC můžete také předat strukturu DEVMODE, pokud chcete poskytnout data inicializace specifická pro zařízení ovladače při vytváření kontextu zařízení.
Následující příklad ukazuje volání CreateDC, ve kterém je vybrán ovladač WINSPOOL a název tiskárny je určen názvem.
printerDC = CreateDC( L"WINSPOOL", printerName, NULL, NULL);
Přesný řetězec názvu tiskárny můžete získat zavoláním funkce EnumPrinters a předat ho do CreateDC. Následující příklad kódu ukazuje, jak volat EnumPrinters a získat názvy místních a místně připojených tiskáren. Vzhledem k tomu, že velikost požadované vyrovnávací paměti nemůže být známa předem, EnumPrinters je volána dvakrát. První volání vrátí velikost požadované vyrovnávací paměti. Tyto informace slouží k přidělení vyrovnávací paměti požadované velikosti a druhé volání EnumPrinters vrátí požadovaná data.
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
}
}
Zobrazení běžného dialogového okna Tisk
Můžete si vybrat ze dvou tisk běžných dialogových oknech, která se zobrazí uživateli; novější dialogové okno, které můžete zobrazit voláním PrintDlgEx funkce, a starší styl dialogové okno, které můžete zobrazit voláním PrintDlg funkce. Následující části popisují, jak volat každé dialogové okno z aplikace.
Použití funkce PrintDlgEx
Voláním funkce PrintDlgEx zobrazte seznam vlastností Print. Pomocí seznamu vlastností může uživatel zadat informace o tiskové úloze. Uživatel může například vybrat rozsah stránek, které se mají vytisknout, počet kopií atd. PrintDlgEx může také načíst popisovač kontextu zařízení pro vybranou tiskárnu. K vykreslení výstupu na tiskárně můžete použít úchyt.
Vzorový kód, který znázorňuje použití PrintDlgEx k načtení kontextu zařízení tiskárny, najdete v tématu Použití seznamu vlastností tisku v Použití běžných dialogových oken.
Použití funkce PrintDlg
Pokud vaše aplikace musí běžet v systému, který nepodporuje funkci PrintDlgEx, například v systému, na kterém běží verze Systému Windows starší než Windows 2000, nebo nepotřebuje další funkce, které poskytuje funkce PrintDlgEx, použijte funkci PrintDlg. Následující kroky popisují, jak zobrazit běžné dialogové okno tisku ve starším stylu .
- Inicializujte datovou strukturu PRINTDLG.
- Pro zavolání PrintDlg k zobrazení společného dialogového okna Tisk uživateli.
- Pokud volání PrintDlg vrátí TRUE, zamkněte paměť vrácené struktury DEVMODE. Pokud volání funkce PrintDlg vrátí FALSE, uživatel stiskl tlačítko Zrušit ve společném dialogovém okně Tisk, a proto není třeba nic dalšího zpracovávat.
- Přidělte lokální vyrovnávací paměť, která je dostatečně velká, aby obsahovala kopii struktury DEVMODE .
- Zkopírujte vrácenou strukturu DEVMODE do místně přidělené struktury.
- Uložte další informace, které jsou vráceny ve struktuře PRINTDLG, a které budete potřebovat ke zpracování tiskové úlohy.
- Uvolněte PRINTDLG a paměťové vyrovnávací paměti, na které odkazuje.
Následující příklad kódu ukazuje, jak pomocí funkce PrintDlg získat kontext zařízení a název vybrané tiskárny.
// 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.
}
Další informace o funkci PrintDlg naleznete v tématu "Zobrazení dialogového okna tisk" v Použití běžných dialogových oken.