Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 CView
funçõ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.
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 GetFromPage
CPrintInfo. 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 OnPrint
passa 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 OnPrint
a 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, OnPrepareDC
a 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.