列印對話方塊

[ 列印] 對話方塊可讓使用者選取特定列印工作的選項。 例如,使用者可以指定要使用的印表機、要列印的頁面範圍,以及複本數目。

您可以使用PrintDlgEx函數來顯示Print 屬性工作表,其中包含類似[列印] 對話方塊之控制項的 [一般] 頁面。 屬性工作表也可以在 [ 一般 ] 頁面之後,擁有其他應用程式特定和驅動程式特定的屬性頁。

您可以藉由初始化PRINTDLG結構,並將結構傳遞至PrintDlg函式,來建立並顯示 [列印] 對話方塊。

下圖顯示一般 [列印] 對話方塊。

print dialog box

如果使用者按一下 [ 確定 ] 按鈕, PrintDlg 會傳回 TRUE ,並使用 PRINTDLG 結構傳回使用者選取專案的相關資訊。 例如, hDevModehDevNames 成員通常會傳回 和 DEVNAMES 結構的全域記憶體控制碼。 您可以使用這些結構中的資訊,為選取的印表機建立裝置內容或資訊內容。

如果使用者取消 [ 列印 ] 對話方塊或發生錯誤, PrintDlg 會傳回 FALSE。 您可以使用 CommDlgExtendedError 函式來擷取擴充的錯誤值來判斷錯誤的原因。

[ 列印 ] 對話方塊包含選項按鈕的 [列印範圍] 群組,指出使用者是要列印所有頁面、一個頁面範圍,還是只列印選取的文字。 呼叫 PrintDlg之前,您可以設定其中一個 PD_ALLPAGESPD_SELECTIONPD_PAGENUMS 旗標,以指出一開始選取哪一個按鈕。 當 PrintDlg傳回TRUE時,函式會設定其中一個旗標來指出使用者的選取專案。 如果已設定PD_PAGENUMSPRINTDLG結構的nFromPagenToPage成員會包含使用者指定的開始和結束頁面。 若要停用 Pages 選項按鈕及其相關聯的 FromTo 編輯控制項,請設定 PD_NOPAGENUMS 旗標。 若要停用 [選取範圍 ] 選項按鈕,請設定 PD_NOSELECTION 旗標。

對話方塊包含編輯控制項,使用者可以在其中輸入要列印的複本數目。 如果PRINTDLG 結構的 hDevMode成員為非Null,則 結構的dmCopies成員會指定這個編輯控制項的初始值。 如果hDevModeNullPRINTDLG結構的nCopies成員會指定初始值。 當 PrintDlg傳回時,nCopies通常會指出使用者指定的複本數目。 不過,如果您在建立對話方塊時設定PD_USEDEVMODECOPIESANDCOLLATE旗標,則 nCopies一律會在傳回時設定為 1,而 DEVMODEdmCopies成員表示要列印的複本數目。

[ 定序 ] 核取方塊會指出使用者是否想要在列印多個複本時排序頁面。 如果選取 [定序] 核取方塊,就會設定PD_COLLATE旗標。 如果您的應用程式不支援多個複本或模擬定序,請在PRINTDLG結構的Flags成員中設定PD_USEDEVMODECOPIESANDCOLLATE旗標。 除非印表機驅動程式支援多個複本和定序,否則這會停用 [定 序] 核取方塊和 [ 複本數目 ] 編輯控制項。

[ 列印到檔案 ] 核取方塊指出使用者是否要將輸出傳送至檔案,而不是印表機。 您可以設定 PD_PRINTTOFILE 旗標,以便一開始選取核取方塊。 若要隱藏核取方塊,請設定 PD_HIDEPRINTTOFILE 旗標。 若要停用它,請設定 PD_DISABLEPRINTTOFILE 旗標。 如果使用者選取 [列印到檔案] 選項,PrintDlg會設定PD_PRINTTOFILE旗標,並在DEVNAMES結構的wOutputOffset成員所指示的位移傳回 「FILE:」。 當您呼叫 函式以啟動列印工作時,請在 結構的 lpszOutput 成員中指定這個 「FILE:」 字串。 指定此字串會導致列印子系統查詢使用者是否有輸出檔的名稱。

根據預設, [列印] 對話方塊一開始會顯示目前預設印表機的相關資訊。 若要顯示另一部已安裝印表機的資訊,請初始化 和 DEVNAMES 結構,並將全域記憶體控制碼指派給 結構給 hDevModehDevNames 成員。 您在DEVMODE結構的dmDeviceName成員和DEVNAMES結構的wDriverOffset成員中指定的裝置名稱,必須識別也列在Win.ini檔案的 [Devices] 區段中的印表機裝置。 如果未列出裝置, PrintDlg 會傳回錯誤。

您可以指示PrintDlgPRINTDLG結構的Flags成員中設定PD_RETURNDCPD_RETURNIC旗標,以建立印表機的裝置內容或資訊內容。 函式會傳回 hDC 成員中裝置內容或資訊內容的控制碼。 如果您使用 PD_RETURNDC 旗標,您可以使用裝置內容來產生印表機的輸出。

若要擷取預設印表機的相關資訊,而不顯示 [ 列印 ] 對話方塊,請設定 PD_RETURNDEFAULT 旗標。 在此情況下, PrintDlg 會在設定 hDevModehDevNames 成員之後立即傳回,以處理包含資訊的結構。

根據預設, PrintDlg 會在發生錯誤時顯示訊息方塊。 例如,函式會在未安裝印表機時顯示錯誤訊息。 若要防止函式顯示這些警告訊息,請設定 PD_NOWARNING 旗標。

本節將討論下列主題。

自訂列印對話方塊

例如,如果您想要包含應用程式唯一的其他控制項,您可以提供 [ 列印 ] 對話方塊的自訂範本。 PrintDlg函式會使用您的自訂範本取代預設範本。

若要提供 [ 列印 ] 對話方塊的自訂範本:

  1. 修改 Prnsetup.dlg 檔案中指定的預設範本,以建立自訂範本。 預設 [列印 ] 對話方塊範本中使用的控制項識別碼定義于 Dlgs.h 檔案中。
  2. 使用 PRINTDLG 結構來啟用範本,如下所示:
    • 如果您的自訂範本是應用程式或動態連結程式庫中的資源,請在Flags成員中設定PD_ENABLEPRINTTEMPLATE旗標。 使用 結構的 hInstancelpPrintTemplateName 成員來識別模組和資源名稱。

      -或者-

    • 如果您的自訂範本已在記憶體中,請設定 PD_ENABLEPRINTTEMPLATEHANDLE 旗標。 使用 hPrintTemplate 成員來識別包含範本的記憶體物件。

您可以為 [列印] 對話方塊提供PrintHookProc攔截程式。 攔截程式可以處理傳送至對話方塊的訊息。 它也可以將訊息傳送至對話方塊。 如果您使用自訂範本來定義其他控制項,則必須提供勾點程式來處理控制項的輸入。

若要啟用 [ 列印 ] 對話方塊的勾點程式:

  1. PRINTDLG結構的Flags成員中設定PD_ENABLEPRINTHOOK旗標。
  2. lpfnPrintHook 成員中指定攔截程式的位址。

處理其 WM_INITDIALOG 訊息之後,對話方塊程式會將 WM_INITDIALOG 訊息傳送至攔截程式。 此訊息的 lParam 參數是用來初始化對話方塊之 PRINTDLG 結構的指標。

您可以在呼叫 PrintDlg函式時設定PD_PRINTSETUP旗標,以建立並顯示 [列印設定] 對話方塊。 不過,[頁面設定] 對話方塊已取代 [列印安裝] 對話方塊,不應該用於新的應用程式中。

下列旗標僅適用于 [列印設定] 對話方塊:

  • PD_ENABLESETUPHOOK
  • PD_ENABLESETUPTEMPLATE
  • PD_ENABLESETUPTEMPLATEHANDLE