TN030: Personalização de impressão e Visualizar impressão

Esta anotação descreve o processo de personalização de impressão e Visualizar impressão e descreve os efeitos das rotinas de retorno de chamada usados na CView e o retorno de chamada rotinas e funções de membro de CPreviewView.

O problema

MFC fornece uma solução completa para a maioria dos impressão e precisa de Visualizar de imprimir. Na maioria dos casos, pouco código adicional é necessário para ter uma visão capaz de imprimir e visualizar. No entanto, há maneiras de otimizar a impressão que exigem esforço significativo por parte do desenvolvedor, e alguns aplicativos precisam adicionar elementos de interface do usuário específico para o modo de visualização de impressão.

Impressão eficiente

Quando um aplicativo do MFC imprime usando os métodos padrão, o Windows direciona todas as chamadas de saída de Interface gráfica de dispositivo (GDI) para um metarquivo na memória. Quando EndPage é chamado, Windows joga o metarquivo uma vez para cada faixa físico que requer que a impressora para imprimir uma página. Durante esse processamento, GDI freqüentemente consulta o procedimento anular para determinar se ele deve continuar. Normalmente o procedimento de anular permite que mensagens a serem processadas para que o usuário pode anular o trabalho de impressão usando uma caixa de diálogo de impressão.

Infelizmente, isso pode diminuir o processo de impressão. Se a impressão em seu aplicativo deve ser mais rápida do que pode ser conseguido usando a técnica padrão, você deve implementar a faixa manual.

Imprimir faixas

A banda manualmente, você deve re implementar o loop de impressão de modo que OnPrint é chamado múltiplo vezes por página (uma vez por banda). O loop de impressão é implementado no OnFilePrint função em viewprnt. No seu CView-derivada de classe, você sobrecarregar esta função para que a entrada de mapa de mensagem para manipular o comando Imprimir chama sua função de impressão. Copiar OnFilePrint rotina e alterar o loop de impressão para implementar a faixa. Você provavelmente também deseja passar o Retangular de bandas para suas funções de impressão para que você possa otimizar o desenho com base na seção da página sendo impressa.

Em segundo lugar, você deve chamar freqüentemente QueryAbort ao desenho da banda. Caso contrário, o procedimento de anular não será chamado e o usuário não poderá cancelar o trabalho de impressão.

Imprimir Preview:   Papel eletrônico com Interface do usuário

Pré-visualizar, em essência, tenta ativar a exibição em uma emulação de uma impressora. Por padrão, a área cliente da janela principal é usada para exibir uma ou duas páginas totalmente dentro da janela. O usuário é capaz de aumentar o zoom em uma área da página para vê-lo mais detalhadamente. Com suporte adicional, o usuário ainda pode ser autorizado para editar o documento no modo de visualização.

Personalizando a visualização de impressão

Esta anotação apenas lida com um aspecto da modificação de Visualizar de imprimir: adição de interface do usuário para o modo de visualização. Outras modificações são possíveis, mas essas alterações são fora do escopo desta discussão.

Resumidamente, o processo de adição de interface do usuário para o modo de visualização é a:

  1. Derive uma classe de modo de exibição de CPreviewView.

  2. Adicionar manipuladores de comando para os aspectos da interface do usuário desejado.

  3. Se você estiver adicionando aspectos visuais para a exibir, substituir OnDraw e executar seu desenho depois chamada CPreviewView::OnDraw.

OnFilePrintPreview

Isso é o manipulador de comando Visualizar de imprimir. Sua implementação padrão é:

privatevoid CView::OnFilePrintPreview()
{
 nbsp;  / / Em classes derivadas, implementar manipulação de janela especial aqui
    / / &Não se esqueça de janela de quadro desenganchar fechar se agarrado.

/ / não deve criar isso no quadro. Devem sobreviver a esta função
    CPrintPreviewState * pState = CPrintPreviewState novo;

if (!.DoPrintPreview (AFX_IDD_PREVIEW_TOOLBAR, este,
                RUNTIME_CLASS(CPreviewView), pState))
    {
        / / Em classes derivadas, reverse manipulação de janela especial
        / / aqui para caso de falha de pré-visualização

TRACE0 ("erro: DoPrintPreview falhado");
        AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
        Excluir pState;      / / visualização falha ao inicializar, / / delete estado agora
    }
}

DoPrintPreview ocultará o painel principal do aplicativo. Barras de controle, tais como a barra de status, podem ser retidas, especificando-os na pState-gt;Membro de dwStates (este é uma máscara de bits e bits para barras de Controlarar individual são definidas pelo AFX_CONTROLBAR_MASK(AFX_IDW_MYBAR)). A janela pState - >nIDMainPane é a janela que irá ser automaticamente oculta e reshown. DoPrintPreview , em seguida, irá criar uma barra de botões para o interface do usuário visualização padrão. Se for necessária a manipulação de janela especial, tal como para ocultar ou mostrar outras janelas, que devem ser feitas antes de DoPrintPreview é chamado.

Por padrão, quando termina de Visualizar de imprimir, ele retorna as barras de Controlarar para seus Estados originais e o painel principal para visível. Se manipulação especial é necessária, deve ser feito em uma Substituir do EndPrintPreview. Se DoPrintPreview falhar, também fornecer manipulação especial.

DoPrintPreview é chamado com:

EndPrintPreview

Isso é chamado para encerrar o modo de Visualizar de imprimir. Muitas vezes é desejável para mover para a pá&gina no documento que última foi exibida na visualização de impressão. EndPrintPreview é chance do aplicativo para fazer isso. O pInfo-gt;membro m_nCurPage é a página que foi exibida (mais à esquerda se duas páginas foram exibidas), e o ponteiro é uma dica para onde o usuário estava interessado na página. Uma vez que a estrutura do modo de exibição do aplicativo é desconhecida para o quadro, o que você deve fornecer o código para mover para o ponto escolhido.

Você deve executar a maioria das ações antes de chamar CView::EndPrintPreview. Essa chamada inverte os efeitos de DoPrintPreview e exclui pView, pDC e pInfo.

/ / Qualquer limpeza adicional deve ser feita aqui.
CView::EndPrintPreview (pDC, pInfo, ponto, pView)

CWinApp::OnFilePrintSetup

Isso deve ser mapeado para o item de menu Configurar impressão. Na maioria dos casos, não é necessário substituir a implementação.

Nomenclatura de página

Outra questão é a de numeração de página e a ordem. Para aplicações do tipo processador de texto simples, esta é uma questão simples. A maioria dos sistemas de visualização de impressão assumir que cada página impressa corresponde a uma página do documento.

Na tentativa de fornecer uma solução generalizada, há várias coisas a considerar. Imagine um sistema de CAD. O usuário tem um desenho que abrange várias folhas de E-tamanho. Em um E-tamanho (ou em escala menor,) plotadora, numeração de páginas seria como no maiúscminúsc simples. Mas em uma impressora a laser, impressão de 16 páginas tamanho por folha, o que de visualização de impressão considerar uma "página"?

Como afirma o parágrafo introdutório, visualização de impressão está agindo como uma impressora. Portanto, o usuário verá o que viria da impressora específica que está seleccionada. É até o modo de exibição para determinar que imagem é impressa em cada página.

A Cadeia de caracteres de descrição de página da estrutura de CPrintInfo fornece um meio de exibir o número de página para o usuário, se ele pode ser representado como um número por página (como em "Página 1" ou "páginas 1-2"). Essa Cadeia de caracteres é usada pela implementação padrão de CPreviewView::OnDisplayPageNumber. Se uma exibição diferente for necessário, um pode substituir essa função virtual para fornecer, por exemplo, "Plan1, seções A, B".

Técnico anotações por número |nbsp; &Notas técnicas por categoria

Index