TN030: personalizando impressão e visualização de impressão
Dica
A nota técnica a seguir não foi atualizada desde que ela foi incluída pela primeira vez na documentação online.Como resultado, alguns procedimentos e tópicos podem estar incorretos ou expirados.Para obter as informações mais recentes, é recomendável que você procure o tópico de interesse no índice de documentação online.
Essa observação descreve o processo de personalizar a impressão e a visualização de impressão e descreve as finalidades de rotinas de retorno de chamada usadas em CView e as rotinas de retorno de chamada e as funções de membro de CPreviewView.
O problema
MFC O fornece uma solução completo para a maioria das necessidades de impressão e visualizar impressão. Na maioria dos casos, vez código adicional é necessária para ter uma exibição capaz de imprimir e visualizar. No entanto, há maneiras de otimizar a impressão de que exigem a tensão significativa da parte do desenvolvedor, e alguns aplicativos precisam adicionar elementos específicos da interface do usuário no modo de visualização da impressão.
Impressão eficiente
Quando um aplicativo MFC será impressa usando os métodos padrão, o windows direcionam todas as chamadas gráficos de saída de (GDI) da interface de dispositivo metarquivo de memória. Quando EndPage é chamado, o windows executam o metarquivo uma vez para cada físico a faixa da impressora requer para imprimir uma página. Durante a renderização, GDI consulta que frequência o procedimento de anulação para determinar se continuar. Normalmente o procedimento de anulação permite que as mensagens sejam processadas de forma que o usuário pode anular o trabalho de cópia usando uma caixa de diálogo de impressão.
Infelizmente, isso pode reduzir o processo de impressão. Se a impressão em seu aplicativo deve ser mais rápido do que pode ser obtida usando a técnica padrão, você deve implementar a borda manual.
A borda de cópia
Para unir-se manualmente, você deve com referência ao implementar o loop de cópia de modo que OnPrint for chamado várias vezes por página (uma vez por linha distribuída). O loop de impressão é implementado na função de OnFilePrint em viewprnt.cpp. No CView- classe derivada, você sobrecarregar essa função para que a entrada da mensagem para tratar o comando copiar chama a função de cópia. Copie a rotina de OnFilePrint e alterar o loop de cópia para implementar a borda. Você provavelmente também pode querer passe o retângulo de borda às funções de impressão de forma que você possa otimizar o desenho com base na seção da página que está sendo impressa.
Segundo, você normalmente deve chamar QueryAbort ao chamar a faixa. Caso contrário, o procedimento de anulação não será chamado e o usuário não poderá cancelar do trabalho de cópia.
Visualização de impressão: O papel eletrônico com a interface do usuário
Visualização de impressão, basicamente, o tenta transformar a exibição em uma emulação de uma impressora. Por padrão, a área do cliente da janela principal é usada para exibir totalmente uma ou duas páginas dentro da janela. O usuário pode ampliar em uma área da página para consulta com mais detalhes. Com suporte adicional, o mesmo usuário pode ser permitido editar o documento em modo de visualização.
Personalizando a visualização de impressão
Essa observe o trata apenas um aspecto de visualização da impressão de alteração: Adicionando interface do usuário para o modo de visualização. Outras alterações são possíveis, mas tais alterações estão fora do escopo desta discussão.
Para adicionar interface do usuário para o modo de visualização
Derivar uma classe de exibição de CPreviewView.
Adicionar manipuladores de comando para os aspectos de interface do usuário que você deseja.
Se você estiver adicionando aspectos visuais à exibição, a substituição OnDraw e executando o desenho depois de chamar CPreviewView::OnDraw.
OnFilePrintPreview
Este é o manipulador de comando para a 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. As barras de controle, como a barra de status, podem ser retidas especificando-os no membro>dedwStates de pState- (é um bitmask e os bits de barras de controle individuais são definidos por AFX_CONTROLBAR_MASKAFX_IDW_MYBAR ()). O pState-nIDMainPane >da janela é a janela que será oculta automaticamente e reshown. DoPrintPreview criará uma barra de botões para a visualização padrão interface do usuário. Se a manipulação especial da janela é necessária, como ocultar ou mostrar outras janelas, que devem ser feitas antes que DoPrintPreview ser chamado.
Por padrão, quando a visualização de impressão é concluída, retornará as barras de controle para seus estados original e ao painel principal a visível. Se a manipulação especial é necessária, deve ser feita em uma substituição de EndPrintPreview. Se DoPrintPreview falha, fornecer a manipulação especial.
DoPrintPreview é chamado com:
A ID do recurso do modelo da caixa de diálogo para a barra de ferramentas de visualização.
Um ponteiro para a exibição para executar a impressão para a visualização de impressão.
A classe de tempo de execução da classe da exibição visualização. Isso será criado dinamicamente em DoPrintPreview.
O ponteiro de CPrintPreviewState. Observe que a estrutura de CPrintPreviewState (ou a estrutura derivado se o aplicativo precisar de mais estado preservado) não devem ser criadas no quadro. DoPrintPreview é modeless e essa estrutura deve EndPrintPreview sobreviver até que seja chamado.
Dica
Se uma exibição ou uma classe separada de exibição são necessárias para imprimir o suporte, um ponteiro para o objeto deve ser passado como o segundo parâmetro.
EndPrintPreview
Isso é chamado para finalizar o modo de visualização da impressão. Geralmente é desejável mover para a página no documento que foi exibido na visualização de impressão. EndPrintPreview é a possibilidade de aplicativo para fazer isso. O membro>dem_nCurPage de pInfo- é a página que foi exibido (a mais à esquerda se duas páginas são exibidas), e o ponteiro é uma dica a respeito de onde na página o usuário está interessado. Desde que a estrutura de exibição de aplicativo é desconhecida à estrutura, você deve fornecer o código ao mover para o ponto selecionado.
Você deve executar a maioria das ações antes de chamar CView::EndPrintPreview. Essa chamada inverte os efeitos de DoPrintPreview e exclui o pView, o pDC, e o 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 de configuração de cópia. Na maioria dos casos, não é necessário substituir a implementação.
Nomenclatura de página
Outros tema que são de numeração e da ordem de página. Para aplicativos simples do tipo de processador de textos, esse é um problema simples. A maioria dos sistemas de visualização de impressão assumem que cada página impressa corresponde a uma página no documento.
Tente fornecer uma solução generalizada, há várias coisas a serem considerados. Imagine um sistema de CAD. O usuário tem um desenho que abrange várias folhas de E- tamanho. Em um plotador de E- tamanho (ou um secundário, dimensionado), a numeração de página seria como no caso simples. Mas em uma impressora a laser, imprimindo 16 páginas de um tamanho por folha, que a visualização de impressão considera uma página”? “
Como os estados introdutórios de parágrafo, a visualização de impressão está atuando como uma impressora. Em virtude disso, o usuário verá o que deixa da impressora específico que está selecionada. É responsabilidade a exibição para determinar quais imagem é impressa em cada página.
A cadeia de caracteres de descrição da página na estrutura de CPrintInfo fornece uma maneira de exibir o número da página ao usuário se pode ser representada como um número por página (como na página “1 " ou “nas páginas 1-2”). Essa cadeia de caracteres é usada pela implementação padrão de CPreviewView::OnDisplayPageNumber. Se uma exibição diferente for necessária, se pode substituir essa função virtual para fornecer, por exemplo, “Sheet1 seções, A, B”.