Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este tópico descreve como coletar informações de tarefa de impressão do utilizador.
Visão geral
Colete informações de trabalho de impressão do usuário chamando a função PrintDlg. Esta função exibe a caixa de diálogo comum Imprimir ao utilizador e retorna as informações do trabalho de impressão numa estrutura de dados PRINTDLG.
A caixa de diálogo Imprimir comum é exibida quando o usuário inicia um trabalho de impressão. A caixa de diálogo Imprimir comum é uma caixa de diálogo modal, o que significa que o usuário não pode interagir com a janela principal até que a caixa de diálogo comum seja fechada.
Recolha de informações sobre trabalhos de impressão
Inicialize o elemento de estrutura PRINTDLG.
Antes que um programa possa exibir a caixa de diálogo Imprimir comum, ele deve alocar e inicializar a estruturaPRINTDLG. Em seguida, ele passa essa estrutura para a função PrintDlg, que exibe a caixa de diálogo e retorna os dados do trabalho de impressão na mesma estrutura. O exemplo de código a seguir mostra como o programa de exemplo executa essa etapa.
// Initialize the print dialog box's data structure. pd.lStructSize = sizeof( pd ); pd.Flags = // Return a printer device context PD_RETURNDC // Don't allow separate print to file. | PD_HIDEPRINTTOFILE | PD_DISABLEPRINTTOFILE // Don't allow selecting individual document pages to print. | PD_NOSELECTION;Apresente a caixa de diálogo comum Imprimir.
Chame PrintDlg com a estrutura PRINTDLG inicializada para exibir a caixa de diálogo comum de impressão Print e recolher os dados do utilizador, conforme mostrado no exemplo de código a seguir.
// Display the printer dialog and retrieve the printer DC pdReturn = PrintDlg(&pd);Salve os campos da estrutura PRINTDLG e inicie o trabalho de impressão.
A estruturaPRINTDLG contém os dados que descrevem as seleções que o usuário fez na caixa de diálogo de impressão. Alguns membros da estrutura PRINTDLG são identificadores de objetos de memória global. O Print Sample Program copia os dados dos objetos de memória global para blocos de memória que o programa controla e copia outros campos da estrutura PRINTDLG para campos em uma estrutura de dados definida pelo programa.
Depois de armazenar os dados da estrutura de PRINTDLG na estrutura de dados do programa, pode abrir a caixa de diálogo de progresso da impressão. O procedimento da caixa de diálogo de progresso da impressão lida com as mensagens da caixa de diálogo e inicia o thread de processamento de impressão.
O exemplo de código a seguir mostra como copiar os dados da estruturaPRINTDLG para a estrutura de dados do programa e como iniciar o trabalho de impressão.
// A printer was returned so copy the information from // the dialog box structure and save it to the application's // data structure. // // Lock the handles to get pointers to the memory they refer to. PDEVMODE devmode = (PDEVMODE)GlobalLock(pd.hDevMode); LPDEVNAMES devnames = (LPDEVNAMES)GlobalLock(pd.hDevNames); // Free any old devmode structures and allocate a new one and // copy the data to the application's data structure. if (NULL != threadInfo->devmode) { HeapFree(GetProcessHeap(), 0L, threadInfo->devmode); } threadInfo->devmode = (LPDEVMODE)HeapAlloc( GetProcessHeap(), PRINT_SAMPLE_HEAP_FLAGS, devmode->dmSize); if (NULL != threadInfo->devmode) { memcpy( (LPVOID)threadInfo->devmode, devmode, devmode->dmSize); } else { // Unable to allocate a new structure so leave // the pointer as NULL to indicate that it's empty. } // Save the printer name from the devmode structure // This is to make it easier to use. It could be // used directly from the devmode structure. threadInfo->printerName = threadInfo->devmode->dmDeviceName; // Set the number of copies as entered by the user threadInfo->copies = pd.nCopies; // Some implementations might support printing more than // one package in a print job. For this program, only // one package (XPS document) can be printed per print job. threadInfo->packages = 1; // free allocated buffers from PRINTDLG structure if (NULL != pd.hDevMode) GlobalFree(pd.hDevMode); if (NULL != pd.hDevNames) GlobalFree(pd.hDevNames); // Display the print progress dialog box DialogBox( threadInfo->applicationInstance, MAKEINTRESOURCE(IDD_PRINT_DLG), hWnd, PrintDlgProc);Se o usuário clicar no botão Cancelar na caixa de diálogo Imprimir comum, nenhum processamento adicional será executado.