TN030: Personalizando a impressão e visualização de 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.sistema autônomo resultado, alguns procedimentos e tópicos podem estar desatualizado ou incorreto.Para obter informações mais recentes, é recomendável que você procurar o tópico de interesse no índice de documentação online. |
Esta nota descreve o processo de personalizar a visualização de impressão e de impressão e descreve a finalidade das rotinas de retorno de chamada usadas em CView e 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 visualização de impressão precisa.Na maioria dos casos, é necessário para ter uma visão capaz de imprimir e visualizar pouco código adicional.No entanto, existem maneiras de otimizar a impressão que exigem um trabalho considerável por parte do desenvolvedor, e alguns aplicativos precisam adicionar elementos da interface do usuário específico 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 de memória.Quando EndPage é chamado, o Windows reproduz o metarquivo de uma vez para cada banda física que requer a impressora para imprimir uma página. Durante esse renderização GDI freqüentemente consulta o procedimento Abort para determinar se deve continuar.Normalmente o procedimento de anulação permite que mensagens a serem processadas para que o usuário poderá 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 alcançado usando a técnica padrão, você deve implementar manual faixas.
Imprimir faixas
Para banda manualmente, você deve re implementar o loop de impressão tal que OnPrint é chamado várias vezes por página (uma vez por banda). O loop de impressão é implementado no OnFilePrint função em viewprnt.cpp.No seu CView-derivada da classe, sobrecarregar esta função para que a entrada de mapeamento de mensagem para lidar com o comando de impressão chama sua função de impressão. Copie o OnFilePrint rotina e alterar o loop de impressão para implementar a formação de bandas.Você irá provavelmente também deseja passar o retângulo de faixas para funções de impressão para que você pode otimizar o desenho com base na seção da página que está sendo impressa.
Em segundo lugar, você deve chamar freqüentemente QueryAbort enquanto desenha a banda. Caso contrário, o procedimento de anulação não será chamado e o usuário não poderá cancelar o trabalho de impressão.
visualização de impressão: Papel Eletrônica com interface de usuário
visualização de impressão, em essência, tenta ativar a exibição em uma emulação de uma impressora.Por padrão, a área de cliente da janela principal é usada para exibir uma ou duas páginas totalmente dentro da janela.O usuário é capaz de aumentar o aplicar aplicar zoom uma área da página para ver mais detalhes.Com o suporte adicional, o usuário ainda pode ter permissão para edição o documento no modo de visualização.
Personalizar visualização
Esta nota apenas lida com um aspecto da modificação de visualização de impressão: Adicionando interface de usuário para o modo de visualização.Outros modificações são possíveis, mas essas alterações estão fora do escopo desta discussão.
Para adicionar UI para o modo de visualização
Derivar uma classe de modo de exibição de CPreviewView.
Adicione manipuladores de comandos para os aspectos da interface do usuário desejado.
Se você estiver adicionando aspectos visuais para o vídeo, substituir OnDraw e execute seu desenho depois de chamada CPreviewView::OnDraw.
OnFilePrintPreview
Isso é o manipulador de comando visualização de impressão.A 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, sistema autônomo a BAR de status podem ser retidas, especificando-sistema autônomo na pState->dwStates membro (isto é uma máscara de bit e sistema autônomo bit para barras de controle individuais são definidas por AFX_CONTROLBAR_MASK(AFX_IDW_MYBAR)).A janela pState->nIDMainPane é a janela que será oculto e reshown automaticamente.DoPrintPreview irá criar uma BAR de botões para a interface do usuário padrão de visualização.Se a manipulação de janela especial é necessária, como sistema autônomo para ocultar ou mostrar outras janelas, que devem ser feitas antes de DoPrintPreview é chamado.
Por padrão, quando termina a visualização de impressão, retorna as barras de controle de seus estados originais e o painel principal para visível.Se houver necessidade de tratamento especial, ele deve ser concluído de uma substituir de EndPrintPreview. If DoPrintPreview falhar, também fornecem um tratamento especial.
DoPrintPreview é chamado com:
A ID de recurso do modelo de barra de ferramentas da visualização da caixa de diálogo.
Um ponteiro para o modo de exibição para executar a impressão para a visualização de impressão.
A classe de time de execução da classe exibição visualização.Isso será criado dinamicamente em DoPrintPreview.
O ponteiro CPrintPreviewState.Observe que a estrutura CPrintPreviewState (ou a estrutura derivada se o aplicativo precisa de mais estado preservado) deve não ser criado no quadro.DoPrintPreview é sem janela restrita e essa estrutura deve sobreviver até EndPrintPreview é chamado.
Observação: Se um modo de exibição separado ou modo de exibição de classe é necessária para suporte a impressão, um ponteiro para o objeto deve ser passado sistema autônomo o segundo parâmetro.
EndPrintPreview
Isso é chamado para terminar o modo de visualização de impressão.Muitas vezes é desejável para ir até a página no documento que foi exibida pela última vez na visualização de impressão.EndPrintPreview é a chance do aplicativo de fazer isso.PInfo->m_nCurPage membro é exibir a página último (mais à 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 de modo de exibição do aplicativo é desconhecida para a estrutura, você deve fornecer o código para mover para ponto escolhido.
Você deve executar a maioria das ações antes de chamar CView::EndPrintPreview.Essa telefonar reverte os efeitos de DoPrintPreview e exclui pView, controlador de domínio primário 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.
Página Nomenclature
Outro problema é de numeração de página e a ordem.Para simples palavra aplicativos do tipo de processador, essa é uma questão 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 maneiras para considerar.Imagine um sistema de CAD.O usuário tem um desenho que abrange várias folhas E dimensionar.Em um dimensionar E (ou em escala menor,) plotadora, numeração de páginas seria sistema autônomo no caso simples.Mas em uma impressora a laser, imprimindo A dimensionar 16 páginas por folha, que visualização de impressão consideram uma "página"?
sistema autônomo informa o parágrafo introdutório, visualizar impressão está atuando sistema autônomo uma impressora.Portanto, o usuário verá o que seria vêm 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 caracteres de descrição de página no CPrintInfoestrutura fornece uma maneira de exibir o número de página para o usuário se ele pode ser representado sistema autônomo um número por página (sistema autônomo em "Página 1" ou "páginas" 1-2). Essa seqüência de caracteres é usada pela implementação do padrão de CPreviewView::OnDisplayPageNumber.Se for necessária uma exibição diferente, um pode substituir essa função virtual para oferecer, por exemplo, "Plan1, Sections A, B".