共用方式為


如何:擷取印表機裝置內容

本主題描述如何擷取印表機裝置內容。 您可以直接呼叫 CreateDC 函式來擷取印表機裝置內容,也可以由 [列印 一般] 對話方塊傳回。

當您顯示 [列印 一般] 對話方塊時,使用者將能夠選取印表機、檔的頁面,以及他們想要列印的檔複本數目。 [ 列印 一般] 對話方塊會在資料結構中傳回這些選取專案。

本主題描述如何使用下列方法來取得印表機裝置內容。

呼叫 CreateDC

如果您知道您想要列印的裝置,您可以呼叫 CreateDC ,並將該資訊直接傳遞至函式。 CreateDC 會傳回裝置內容,您可以在其中轉譯要列印的內容。

擷取裝置內容最簡單的呼叫會顯示在下列程式碼範例中。 此範例中的程式碼會將裝置內容擷取至預設顯示裝置。

    hDC = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);

若要轉譯至特定印表機,您必須將 「WINSPOOL」 指定為裝置,並將印表機的正確名稱傳遞至 CreateDC。 如果您想要在建立裝置內容時為設備磁碟機提供裝置特定的初始化資料,您也可以在呼叫CreateDC中傳遞DEVMODE結構。

下列範例顯示對 CreateDC 的呼叫,其中已選取 「WINSPOOL」 驅動程式,並依名稱指定印表機名稱。

    printerDC = CreateDC( L"WINSPOOL", printerName, NULL, NULL);

您可以藉由呼叫EnumPrinters函式,取得要傳遞至CreateDC的確切印表機名稱字串。 下列程式碼範例示範如何呼叫 EnumPrinters ,並取得本機和本機連線印表機的名稱。 由於無法事先知道所需的緩衝區大小, 因此會呼叫 EnumPrinters 兩次。 第一次呼叫會傳回必要緩衝區的大小。 此資訊是用來配置所需大小的緩衝區,而對 EnumPrinters 的第二次呼叫會傳回您想要的資料。

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

顯示列印通用對話方塊

您可以選擇兩個 [列印 一般] 對話方塊來向使用者顯示;較新的對話方塊,您可以藉由呼叫 PrintDlgEx 函式和較舊的樣式對話方塊來顯示,您可以藉由呼叫 PrintDlg 函式來顯示。 下列各節說明如何從應用程式呼叫每個對話方塊。

使用 PrintDlgEx 函式

呼叫 PrintDlgEx 函式以顯示 Print 屬性工作表。 藉由使用屬性工作表,使用者可以指定列印工作的相關資訊。 例如,使用者可以選取要列印的頁面範圍、複本數目等等。 PrintDlgEx也可以擷取所選印表機裝置內容的控制碼。 您可以使用控制碼在印表機上轉譯輸出。

如需說明如何使用 PrintDlgEx 來擷取印表機裝置內容的範例程式碼,請參閱 使用通用對話方塊中的。

使用 PrintDlg 函式

如果您的應用程式必須在不支援 PrintDlgEx 函式的系統上執行,例如在執行 Windows 2000 之前的 Windows 版本系統上,或不需要 PrintDlgEx 函式所提供的額外功能,請使用 PrintDlg 函式。 下列步驟說明如何顯示較舊的樣式 [ 列印 一般] 對話方塊。

  1. 初始化 PRINTDLG 資料結構。
  2. 呼叫 PrintDlg ,向使用者顯示 [列印 一般] 對話方塊。
  3. 如果 PrintDlg 呼叫傳回 TRUE,請鎖定傳回的 DEVMODE 結構記憶體。 如果PrintDlg呼叫傳回FALSE,使用者按下 [列印通用] 對話方塊中的 [取消] 按鈕,因此不會再處理任何動作。
  4. 配置足以包含 DEVMODE 結構的複本的本機記憶體緩衝區。
  5. 將傳回的 DEVMODE 結構複製到本機配置的結構。
  6. 儲存 在 PRINTDLG 結構中傳回的其他資訊,而且您需要處理列印工作。
  7. 釋放 PRINTDLG 及其參考的記憶體緩衝區。

下列範例程式碼說明如何使用 PrintDlg 函式來取得裝置內容和所選印表機的名稱。

// 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.
}

如需 PrintDlg 函式的詳細資訊,請參閱 使用通用對話方塊中的。