TN030: Personalização de impressão e visualizar impressão
Observação |
---|
A seguinte nota técnica não foi atualizada desde que foi incluída pela primeira vez na documentação online.Como resultado, alguns procedimentos e tópicos podem estar desatualizado ou incorreto.As informações mais recentes, é recomendável que você procure o tópico de interesse no índice de documentação on-line. |
Esta nota descreve o processo de personalizar a visualização de impressão e de impressão e as finalidades das rotinas de retorno de chamada usadas em CView e as rotinas de retorno de chamada e funções de membro CPreviewView.
O problema
MFC fornece uma solução completa para a maioria dos impressão e visualização de impressão precisa.Na maioria dos casos, pouco código adicional é necessário ter uma visão capaz de imprimir e visualizar.No entanto, existem maneiras de otimizar a impressão que exigem esforço significativo por parte do desenvolvedor e alguns aplicativos precisam adicionar elementos de interface de usuário específica para o modo de visualização de impressão.
Impressão eficiente
Quando um aplicativo 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, o Windows reproduz 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 deve continuar.Normalmente o procedimento de anulação permite 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 tornar mais lento o processo de impressão.Se a impressão em seu aplicativo deve ser mais rápida do que pode ser obtida usando a técnica padrão, você deve implementar faixas manual.
Imprimir faixas
A banda manualmente, você deve re implementar o loop de impressão que OnPrint é chamado várias vezes por página (uma vez por banda).O loop de impressão é implementado a OnFilePrint função em viewprnt.cpp.No seu CView-derivado classe, sobrecarregar esta função para que a entrada de mapa de mensagem para manipular o comando Imprimir chama sua função de impressão.Cópia de OnFilePrint de rotina e alterar o loop de impressão para implementar a faixa.Você provavelmente também deseja passar o retângulo de faixa para funções de impressão para que você pode otimizar o desenho com base na seção da página sendo impressa.
Segundo, você deve chamar freqüentemente QueryAbort enquanto a banda de desenho.Caso contrário, o procedimento de anulação não será chamado e o usuário não poderá cancelar a impressão.
Visualização de impressão: Papel eletrônico com Interface de usuário
Visualizar impressão, 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 ver mais detalhes.Com suporte adicional, o usuário ainda poderão 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 visualização de impressão: adicionando a interface do usuário para o modo de visualização.Outras modificações são possíveis, mas essas alterações estão fora do escopo desta discussão.
Para adicionar a interface do usuário para o modo de visualização
Derivar uma classe de modo de exibição de CPreviewView.
Adicione manipuladores de comando para os aspectos da interface do usuário desejado.
Se você estiver adicionando aspectos visual para a exibição, substituir OnDraw e executar seu desenho depois de chamar o CPreviewView::OnDraw.
OnFilePrintPreview
Este é o manipulador de comando para visualização de impressão.Sua implementação padrão é:
void CView::OnFilePrintPreview()
{
// In derived classes, implement special window handling here
// Be sure to Unhook Frame Window close if hooked.
// must not create this on the frame. Must outlive this function
CPrintPreviewState* pState = new CPrintPreviewState;
if (!DoPrintPreview(AFX_IDD_PREVIEW_TOOLBAR, this,
RUNTIME_CLASS(CPreviewView), pState))
{
// In derived classes, reverse special window handling
// here for Preview failure case
TRACE0("Error: DoPrintPreview failed");
AfxMessageBox(AFX_IDP_COMMAND_FAILURE);
delete pState; // preview failed to initialize,
// delete State now
}
}
DoPrintPreview ocultará o painel principal do aplicativo.Barras de controle, como a barra de status podem ser retidas, especificando-os na pState - >dwStates membro (Esta é uma máscara de bits e bits de barras de controle individuais são definidos pelo AFX_CONTROLBAR_MASK(AFX_IDW_MYBAR)).Janela pState - >nIDMainPane é a janela que será automaticamente ocultada e reshown.DoPrintPreview irá criar uma barra de botões para a interface de visualização padrão.Se for necessária a manipulação de janela especial, como para ocultar ou mostrar outras janelas, o que devem ser feitas antes de DoPrintPreview é chamado.
Por padrão, quando termina a visualização de impressão, retorna as barras de controle para seus estados originais e o painel principal para visível.Se for necessário um tratamento especial, deve ser feito em uma substituição do EndPrintPreview. Se DoPrintPreview falhar, também fornecem um tratamento especial.
DoPrintPreview é chamado com:
A identificação de recurso do modelo de diálogo para a barra de ferramentas de visualização.
Um ponteiro para o modo de exibição para realizar a impressão para a visualização de impressão.
A classe de tempo de execução da classe de visualização.Isso será criado dinamicamente em DoPrintPreview.
O ponteiro CPrintPreviewState.Observe a estrutura CPrintPreviewState (ou a estrutura derivada se o aplicativo precisar de mais estado preservado) deve não ser criados no quadro.DoPrintPreview é sem janela restrita e essa estrutura deve sobreviver até que EndPrintPreview seja chamado.
Observação Se uma classe de modo de exibição ou exibição separada é necessária para suporte a impressão, um ponteiro para o objeto deve ser passado como o segundo parâmetro.
EndPrintPreview
Isso é chamado para encerrar o modo de visualização de impressão.Muitas vezes é desejável para mover para a página no documento que última foi exibida na visualização de impressão.EndPrintPreview é a chance do aplicativo para fazer isso.PInfo - >m_nCurPage membro é a página que foi exibida pela última vez (extrema esquerda se duas páginas foram exibidas) e o ponteiro é uma dica para onde na página o usuário estava interessado.Como a estrutura do modo de exibição do aplicativo é desconhecida para o framework, 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.
// Any further cleanup should be done here.
CView::EndPrintPreview(pDC, pInfo, point, 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
Outro problema é que a numeração de página e a ordem.Para aplicativos do tipo de processador de texto simples, este é um problema simples.A maioria dos sistemas de visualização de impressão presumem 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 e tamanho.Em um tamanho de E (ou menor, dimensionada) plotadora, numeração de páginas seria como no caso simple.Mas em uma impressora a laser, imprimindo páginas de um tamanho de 16 por folha, que visualização de impressão consideram uma "página"?
Como afirma o parágrafo introdutório, visualizar impressão está atuando como uma impressora.Portanto, o usuário verá o que venha da impressora específica que está selecionada.Ele é o modo de exibição para determinar qual imagem é impressa em cada página.
A seqüência de descrição de página no CPrintInfo estrutura fornece uma maneira de exibir o número da página para o usuário se ele pode ser representado como um número por página (como "Página 1" ou "páginas" 1-2).Essa seqüência é 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".