Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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 seguinte maneira. Primeiro, a estrutura exibe a caixa de diálogo Imprimir , cria um contexto de dispositivo para a impressora e chama a função de membro StartDoc do objeto CDC . Em seguida, para cada página do documento, a estrutura chama a função membro StartPage do objeto, instrui o objeto de visualização a imprimir a página, e chama a função membro CDC. Se for necessário alterar o modo da impressora antes de começar uma página específica, a vista chamará ResetDC, que atualiza a estrutura DEVMODE que contém as informações do novo modo de impressora. Quando todo o documento tiver sido impresso, o framework chamará a função de membro EndDoc.
Sobreposição de Funções da Classe de Visualizaçã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 sobreponíveis da CView para impressão
| Nome | Motivo da substituição |
|---|---|
| OnPreparePrinting | Para inserir valores na caixa de diálogo Imprimir, especialmente o comprimento do documento |
| AoIniciarImpressão | Para alocar fontes ou outros recursos 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 do GDI |
Você também pode fazer o 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 são chamadas cada uma das funções membro de impressão do CView. O restante deste artigo explica a maioria dessas etapas com mais detalhes. Partes adicionais do processo de impressão são descritas no artigo Alocação de Recursos GDI.
O Loop de Impressão
Paginação
A estrutura armazena muitas das informações sobre um trabalho de impressão em uma estrutura CPrintInfo . Vários dos valores em CPrintInfo referem-se à paginação, esses valores são acessíveis como mostrado na tabela a seguir.
Informações de número de página armazenadas no CPrintInfo
| Membro variável 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 imprimir |
GetToPage |
Última página a imprimir |
m_nCurPage |
Página atualmente a ser impressa |
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 MFC.
No início do processo de impressão, o framework chama a função-membro OnPreparePrinting da vista, passando um ponteiro para uma CPrintInfo estrutura. O Assistente de Aplicação fornece uma implementação de OnPreparePrinting que chama DoPreparePrinting, outra função-membro de CView.
DoPreparePrinting é a função que apresenta a caixa de diálogo de Impressão e cria um contexto de dispositivo para a 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 da última página do documento. Se tu souberes quantas páginas o teu documento tem, substitui OnPreparePrinting e chama [SetMaxPage]--brokenlink--(reference/cprintinfo-class.md#setmaxpage) para a estrutura CPrintInfo antes de o enviares para DoPreparePrinting. Isso permite especificar o tamanho 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 desejar imprimir apenas um intervalo selecionado de páginas, ele pode especificar os números de página inicial e final na caixa de diálogo Imprimir. A estrutura recupera esses valores usando as GetFromPage funções e GetToPage de 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 o documento inteiro.
Para cada página de um documento a ser impresso, a estrutura chama duas funções de membro em sua classe de exibição, OnPrepareDC e OnPrint, e passa para 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, ela passa um valor diferente no membro m_nCurPage da CPrintInfo estrutura. Desta forma, o framework indica à vista qual página deve ser impressa.
A função de membro OnPrepareDC também é usada para apresentação no ecrã. Ele faz ajustes no contexto do dispositivo antes do desenho ocorrer.
OnPrepareDC desempenha um papel 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, segundo, um CPrintInfo objeto é passado como um segundo parâmetro. (Este parâmetro é NULL quando OnPrepareDC é chamado para exibição na tela.) Substituir OnPrepareDC para fazer ajustes no contexto do dispositivo com base na página que está sendo impressa. Por exemplo, pode mover a origem da janela de visualização e a região de recorte para garantir que a parte apropriada do documento seja impressa.
A função de membro OnPrint executa a impressão real da página. O artigo How Default Printing Is Done mostra como o framework chama OnDraw com um contexto de dispositivo de impressora para realizar a impressão. Mais precisamente, o framework chama OnPrint com uma estrutura CPrintInfo e um contexto de dispositivo, e OnPrint passa o contexto de dispositivo para OnDraw. Substitua OnPrint para executar qualquer renderização que deve ser feita apenas durante a impressão e não para exibição na 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 a partir do override de OnPrint para realizar a renderização comum tanto à exibição no ecrã quanto à impressão.
O fato de OnDraw fazer a renderização para a 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 a criar 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 OnPrint, substitua a chamada para OnDraw por 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 do documento
Quando você se refere a números de página, às vezes é necessário distinguir entre o conceito de página da impressora e o conceito de página de um documento. Do ponto de vista da impressora, uma página é uma folha de papel. No entanto, uma folha de papel não equivale necessariamente a uma página do documento. Por exemplo, se estiver a imprimir uma newsletter, onde as folhas devem ser dobradas, uma folha de papel pode 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 as linhas 1 a 20, as colunas 6 a 10.
Todos os números de página na estrutura CPrintInfo referem-se a páginas de impressora. O framework chama OnPrepareDC e OnPrint uma vez para cada folha de papel que passará pela impressora. Quando você substitui 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 equivale a uma página de documento), então isso é fácil. Se, por outro lado, as páginas dos documentos e as páginas da impressora não corresponderem diretamente, deve traduzir entre elas. Por exemplo, considere imprimir uma planilha. Ao sobrecarregar OnPreparePrinting, deve-se calcular quantas folhas de papel serão necessárias para imprimir a planilha inteira e, em seguida, usar esse valor ao chamar a função membro de SetMaxPageCPrintInfo. Da mesma forma, ao substituir OnPrepareDC, deves traduzir m_nCurPage para o intervalo de linhas e colunas que aparecerão nessa planilha específica e, em seguida, ajustar a origem da janela de visualização de acordo.
Print-Time Paginação
Em algumas situações, a sua classe de visualização pode não saber com antecedência o comprimento do documento até que ele tenha sido efetivamente impresso. Por exemplo, suponha que seu aplicativo não é WYSIWYG, portanto, o comprimento de um documento na tela não corresponde ao seu comprimento quando impresso.
Isso causa um problema quando você substitui 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 de usar a caixa de diálogo Imprimir, a estrutura não saberá quando parar o loop de impressão. A única maneira de determinar quando parar o loop de impressão é imprimir o documento e ver quando ele termina. A sua classe de visualização deve verificar o final do documento enquanto está a ser impresso e, em seguida, informar o framework quando o final for atingido.
A estrutura depende da função OnPrepareDC da sua classe de exibição para dizer quando parar. Após cada chamada para OnPrepareDC, a estrutura verifica um membro da CPrintInfo estrutura chamada m_bContinuePrinting. Seu valor padrão é TRUE. Enquanto assim permanecer, a estrutura continua o ciclo de impressão. Se estiver definido como FALSE, a estrutura para. Para executar a paginação durante a impressão, substitua OnPrepareDC para verificar se o final do documento foi atingido e, quando for, defina m_bContinuePrinting para FALSO.
A implementação padrão de OnPrepareDC define 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 assume que o documento tem uma página. Uma consequência disso é que você deve ter cuidado se chamar a versão de classe base do OnPrepareDC. Não assuma que m_bContinuePrinting será TRUE depois de chamar a versão da classe base.