Imprimir arquitetura de visualização

Este artigo explica como a estrutura MFC implementa a funcionalidade de visualização de impressão. Os tópicos abordados incluem:

A visualização de impressão é um pouco diferente da exibição e impressão da tela porque, em vez de desenhar diretamente uma imagem em um dispositivo, o aplicativo deve simular a impressora usando a tela. Para acomodar isso, a biblioteca Microsoft Foundation Class define uma classe especial (não documentada) derivada da classe CDC chamada CPreviewDC. Todos os objetos CDC contêm dois contextos de dispositivo, mas geralmente são idênticos. Em um objeto CPreviewDC, eles são diferentes: o primeiro representa a impressora que está sendo simulada e o segundo representa a tela na qual a saída é exibida de fato.

O processo de visualização de impressão

Quando o usuário seleciona o comando Visualizar Impressão no menu Arquivo, a estrutura cria um objeto CPreviewDC. Sempre que o aplicativo executa uma operação que define uma característica do contexto do dispositivo da impressora, a estrutura também executa uma operação semelhante no contexto do dispositivo de tela. Por exemplo, se o aplicativo selecionar uma fonte para impressão, a estrutura selecionará uma fonte para exibição de tela que simula a fonte da impressora. Sempre que o aplicativo enviar a saída para a impressora, a estrutura enviará a saída para a tela.

A visualização de impressão também difere da impressão na ordem em que cada uma desenha as páginas de um documento. Durante a impressão, a estrutura continua um loop de impressão até que um determinado intervalo de páginas tenha sido renderizado. Durante a visualização de impressão, uma ou duas páginas são exibidas em um determinado momento e, em seguida, o aplicativo aguarda. Nenhuma página adicional será exibida até que o usuário responda. Durante a visualização de impressão, o aplicativo também deve responder a mensagens WM_PAINT, assim como faz durante a exibição de tela comum.

A função CView::OnPreparePrinting é chamada quando o modo de visualização é invocado, da mesma forma como no início de um trabalho de impressão. A estrutura CPrintInfo Structure passada para a função contém vários membros cujos valores você pode definir para ajustar determinadas características da operação de visualização de impressão. Por exemplo, você pode definir o membro m_nNumPreviewPages para especificar se deseja visualizar o documento no modo de uma ou duas páginas.

Modificar a visualização de impressão

Você pode modificar facilmente o comportamento e a aparência da visualização de impressão de várias maneiras. Por exemplo, você pode, entre outras coisas:

  • Fazer com que a janela de visualização de impressão exiba uma barra de rolagem para facilitar o acesso a qualquer página do documento.

  • Fazer com que a visualização de impressão mantenha a posição do usuário no documento iniciando sua exibição na página atual.

  • Fazer com que uma inicialização diferente seja executada para visualizar a impressão e imprimir.

  • Fazer com que a visualização de impressão exiba números de página em seus próprios formatos.

Se você souber quantas páginas o documento tem e chamar SetMaxPage com o valor apropriado, a estrutura poderá usar essas informações no modo de visualização, bem como durante a impressão. Depois que a estrutura souber o número de páginas que tem o documento, ela poderá fornecer à janela de visualização uma barra de rolagem, permitindo que o usuário avance e retroceda as páginas no modo de visualização. Se você ainda não definiu o número de páginas do documento, a estrutura não poderá posicionar a caixa de rolagem para indicar a posição atual, e portanto, a estrutura não adicionará uma barra de rolagem. Nesse caso, o usuário deve usar os botões Página Seguinte e Página Anterior na barra de controle da janela de visualização para percorrer as páginas do documento.

Para visualização de impressão, você pode achar útil atribuir um valor ao membro m_nCurPage do CPrintInfo, mesmo que você nunca faça isso para a impressão comum. Durante a impressão comum, esse membro carrega informações da estrutura para sua classe de exibição. É dessa forma que a estrutura informa ao modo de exibição qual página deve ser impressa.

Por outro lado, quando o modo de visualização de impressão é iniciado, o membro m_nCurPage carrega informações na direção oposta: do modo de exibição para a estrutura. A estrutura usa o valor desse membro para determinar qual página deve ser visualizada primeiro. O valor padrão desse membro é 1, portanto, a primeira página do documento é exibida inicialmente. Você pode substituir OnPreparePrinting para definir esse membro como o número da página que está sendo exibida no momento em que o comando Visualizar Impressão foi invocado. Dessa forma, o aplicativo mantém a posição atual do usuário ao passar do modo de exibição normal para o modo de visualização de impressão.

Às vezes, você pode querer que OnPreparePrinting execute uma inicialização diferente dependendo se ele é chamado para um trabalho de impressão ou para visualização de impressão. Você pode determinar isso examinando a variável de membro m_bPreview na estrutura CPrintInfo. Esse membro é definido como TRUE quando a visualização de impressão é invocada.

A estrutura CPrintInfo também contém um membro chamado m_strPageDesc, que é usado para formatar as cadeias de caracteres exibidas na parte inferior da tela em modos de página única e de várias páginas. Por padrão, essas cadeias de caracteres são do formato "Página n" e "Páginas n - m", mas você pode modificar m_strPageDesc de dentro de OnPreparePrinting e definir as cadeias de caracteres como algo mais elaborado. Consulte a Estrutura CPrintInfo na Referência do MFC para obter mais informações.

Confira também

Impressão e visualização de impressão
Imprimindo
Classe CView
Classe CDC