Compartilhar via


Documentos de várias páginas

Este artigo descreve o protocolo de impressão do Windows e explica como imprimir documentos que contêm mais de uma página. O artigo aborda os seguintes tópicos:

O protocolo de impressão

Para imprimir um documento de várias páginas, a estrutura e a exibição interagem da maneira a seguir. Primeiro, a estrutura exibe a caixa de diálogo Imprimir , cria um contexto de dispositivo para a impressora e chama a função membro StartDoc do objeto CDC . Em seguida, para cada página do documento, a estrutura chama a função membro StartPage do CDC objeto, instrui o objeto de exibição a imprimir a página e chama a função membro EndPage . Se o modo de impressora precisar ser alterado antes de iniciar uma página específica, o modo de exibição chamará ResetDC, que atualiza a estrutura DEVMODE que contém as novas informações do modo de impressora. Quando todo o documento tiver sido impresso, a estrutura chamará a função de membro EndDoc .

Substituindo funções de classe de exibição

A classe CView define várias funções de membro que são chamadas pela estrutura durante a impressão. Ao substituir essas funções em sua classe de exibição, você fornece as conexões entre a lógica de impressão da estrutura e a lógica de impressão da classe de exibição. A tabela a seguir lista essas funções de membro.

Funções substituíveis do CView para impressão

Nome Motivo para substituição
OnPreparePrinting Para inserir valores na caixa de diálogo Imprimir, especialmente o comprimento do documento
OnBeginPrinting Para alocar fontes ou outros recursos de GDI
OnPrepareDC Para ajustar atributos do contexto do dispositivo para uma determinada página ou para fazer paginação em tempo de impressão
OnPrint Para imprimir uma determinada página
OnEndPrinting Para desalocar recursos de GDI

Você também pode fazer processamento relacionado à impressão em outras funções, mas essas funções são as que impulsionam o processo de impressão.

A figura a seguir ilustra as etapas envolvidas no processo de impressão e mostra onde cada uma das CViewfunções de membro de impressão é chamada. O restante deste artigo explica a maioria dessas etapas com mais detalhes. Partes adicionais do processo de impressão são descritas no artigo Alocando recursos GDI.

Processo de loop de impressão.
O loop de impressão

Paginação

A estrutura armazena grande parte das informações sobre um trabalho de impressão em uma estrutura CPrintInfo . Vários dos valores referentes CPrintInfo à paginação; esses valores são acessíveis, conforme mostrado na tabela a seguir.

Informações de número de página armazenadas no CPrintInfo

Variável de membro ou

nome(s) da função
Número de página referenciado
GetMinPage/SetMinPage Primeira página do documento
GetMaxPage/SetMaxPage Última página do documento
GetFromPage Primeira página a ser impressa
GetToPage Última página a ser impressa
m_nCurPage Página que está sendo impressa no momento

Os números de página começam em 1, ou seja, a primeira página é numerada 1, não 0. Para obter mais informações sobre esses e outros membros do CPrintInfo, consulte a Referência do MFC.

No início do processo de impressão, a estrutura chama a função de membro OnPreparePrinting do modo de exibição, passando um ponteiro para uma CPrintInfo estrutura. O Assistente de Aplicativo fornece uma implementação que OnPreparePrinting chama DoPreparePrinting, outra função membro de CView. DoPreparePrinting é a função que exibe a caixa de diálogo Imprimir e cria um contexto de dispositivo de impressora.

Neste ponto, o aplicativo não sabe quantas páginas estão no documento. Ele usa os valores padrão 1 e 0xFFFF para os números da primeira e última página do documento. Se você souber quantas páginas seu documento tem, substitua OnPreparePrinting e chame [SetMaxPage]--brokenlink--(reference/cprintinfo-class.md#setmaxpage) para a CPrintInfo estrutura antes de enviá-la para DoPreparePrinting. Isso permite que você especifique o comprimento do documento.

DoPreparePrinting em seguida, exibe a caixa de diálogo Imprimir. Quando retorna, a CPrintInfo estrutura contém os valores especificados pelo usuário. Se o usuário quiser imprimir apenas um intervalo de páginas selecionado, ele poderá especificar os números de página inicial e final na caixa de diálogo Imprimir. A estrutura recupera esses valores usando as funções e GetToPage o GetFromPageCPrintInfo. Se o usuário não especificar um intervalo de páginas, a estrutura chamará GetMinPage e GetMaxPage usará os valores retornados para imprimir todo o documento.

Para cada página de um documento a ser impresso, a estrutura chama duas funções membro em sua classe de exibição, OnPrepareDC e OnPrint, e passa a cada função dois parâmetros: um ponteiro para um objeto CDC e um ponteiro para uma CPrintInfo estrutura. Cada vez que a estrutura chama OnPrepareDC e OnPrintpassa um valor diferente no membro m_nCurPage da CPrintInfo estrutura. Dessa forma, a estrutura informa à exibição qual página deve ser impressa.

A função de membro OnPrepareDC também é usada para exibição de tela. Ele faz ajustes no contexto do dispositivo antes que o desenho ocorra. OnPrepareDC serve uma função semelhante na impressão, mas há algumas diferenças: primeiro, o CDC objeto representa um contexto de dispositivo de impressora em vez de um contexto de dispositivo de tela e, em segundo lugar, um CPrintInfo objeto é passado como um segundo parâmetro. (Esse parâmetro é NULL quando OnPrepareDC é chamado para exibição de tela.) Substitua OnPrepareDC para fazer ajustes no contexto do dispositivo com base em qual página está sendo impressa. Por exemplo, você pode mover a origem do visor e a região de recorte para garantir que a parte apropriada do documento seja impressa.

A função membro OnPrint executa a impressão real da página. O artigo How Default Printing Is Done mostra como a estrutura chama OnDraw com um contexto de dispositivo de impressora para executar a impressão. Mais precisamente, a estrutura chama com uma CPrintInfo estrutura e um contexto de dispositivo e OnPrint passa o contexto do dispositivo para OnDraw.OnPrint Substitua OnPrint para executar qualquer renderização que deve ser feita somente durante a impressão e não para exibição de tela. Por exemplo, para imprimir cabeçalhos ou rodapés (consulte o artigo Cabeçalhos e Rodapés para obter mais informações). Em seguida, chame OnDraw da substituição para OnPrint fazer a renderização comum à exibição de tela e impressão.

O fato de fazer OnDraw a renderização para exibição de tela e impressão significa que seu aplicativo é WYSIWYG: "O que você vê é o que você obtém". No entanto, suponha que você não esteja escrevendo um aplicativo WYSIWYG. Por exemplo, considere um editor de texto que usa uma fonte em negrito para impressão, mas exibe códigos de controle para indicar texto em negrito na tela. Em tal situação, você usa OnDraw estritamente para exibição de tela. Quando você substituir, substitua OnPrinta chamada por OnDraw uma chamada para uma função de desenho separada. Essa função desenha o documento da maneira como ele aparece no papel, usando os atributos que você não exibe na tela.

Páginas da Impressora vs. Páginas de Documento

Quando você se refere a números de página, às vezes é necessário distinguir entre o conceito da impressora de uma página e o conceito de um documento de uma página. Do ponto de vista da impressora, uma página é uma folha de papel. No entanto, uma folha de papel não é necessariamente igual a uma página do documento. Por exemplo, se você estiver imprimindo um boletim informativo, em que as planilhas devem ser dobradas, uma folha de papel poderá conter a primeira e a última páginas do documento, lado a lado. Da mesma forma, se você estiver imprimindo uma planilha, o documento não consistirá em páginas. Em vez disso, uma folha de papel pode conter linhas de 1 a 20, colunas de 6 a 10.

Todos os números de página na estrutura CPrintInfo referem-se a páginas de impressora. A estrutura chama OnPrepareDC e OnPrint uma vez para cada folha de papel que passará pela impressora. Ao substituir a função OnPreparePrinting para especificar o comprimento do documento, você deve usar páginas de impressora. Se houver uma correspondência um-para-um (ou seja, uma página de impressora é igual a uma página de documento), então isso é fácil. Se, por outro lado, páginas de documentos e páginas de impressora não corresponderem diretamente, você deverá traduzir entre elas. Por exemplo, considere imprimir uma planilha. Ao substituir OnPreparePrinting, você deve calcular quantas folhas de papel serão necessárias para imprimir toda a planilha e, em seguida, usar esse valor ao chamar a SetMaxPage função membro de CPrintInfo. Da mesma forma, ao substituir OnPrepareDC, você deve traduzir m_nCurPage para o intervalo de linhas e colunas que aparecerão nessa planilha específica e, em seguida, ajustar a origem do visor adequadamente.

Paginação Print-Time

Em algumas situações, sua classe de exibição pode não saber com antecedência quanto tempo o documento fica até que ele seja realmente impresso. Por exemplo, suponha que seu aplicativo não seja WYSIWYG, portanto, o comprimento de um documento na tela não corresponde ao seu comprimento quando impresso.

Isso causa um problema quando você substitui o OnPreparePrinting para sua classe de exibição: você não pode passar um valor para a SetMaxPage função da estrutura CPrintInfo , porque você não sabe o comprimento de um documento. Se o usuário não especificar um número de página para parar usando a caixa de diálogo Imprimir, a estrutura não saberá quando interromper o loop de impressão. A única maneira de determinar quando interromper o loop de impressão é imprimir o documento e ver quando ele termina. Sua classe de exibição deve verificar o final do documento enquanto ele está sendo impresso e, em seguida, informar a estrutura quando o final é atingido.

A estrutura depende da função OnPrepareDC da classe de exibição para informá-la quando parar. Após cada chamada, OnPrepareDCa estrutura verifica um membro da CPrintInfo estrutura chamada m_bContinuePrinting. Seu valor padrão é TRUE. Desde que permaneça assim, a estrutura continuará o loop de impressão. Se estiver definido como FALSE, a estrutura será interrompida. Para executar a paginação em tempo de impressão, substitua OnPrepareDC para verificar se o final do documento foi atingido e defina m_bContinuePrinting como FALSE quando ele tiver.

A implementação padrão de OnPrepareDC conjuntos m_bContinuePrinting como FALSE se a página atual for maior que 1. Isso significa que, se o comprimento do documento não foi especificado, a estrutura pressupõe que o documento tenha uma página. Uma consequência disso é que você deve ter cuidado se chamar a versão da classe base de OnPrepareDC. Não suponha que m_bContinuePrinting será TRUE depois de chamar a versão da classe base.

O que você quer saber mais sobre

Consulte também

Impressão
Classe CView
Classe CDC