Partager via


TN030 : personnaliser l'impression et l'aperçu avant impression

[!REMARQUE]

La note technique suivante n'a pas été modifiée depuis si c'était première inclus dans la documentation en ligne.Par conséquent, certaines procédures et rubriques peuvent être obsolètes ou incorrects.Pour obtenir les informations les plus récentes, il est recommandé que vous trouviez la rubrique d'intérêt dans l'index de la documentation en ligne.

Cette remarque décrit le processus de personnalisation de l'impression et l'aperçu avant impression et décrit les objectifs des routines de rappel utilisées dans CView et les routines les fonctions membres et de rappel de CPreviewView.

Le problème

MFC fournit une solution complète pour la plupart des besoins d'impression et d'aperçu avant impression.Dans la plupart des cas, peu de code supplémentaire est requis pour avoir une vue peut imprimer et visionner.Toutefois, il existe des façons d'optimiser l'impression qui requièrent l'effort important sur la partie du développeur, et certaines applications doivent ajouter des éléments d'interface utilisateur spécifiques au mode d'aperçu avant impression.

Impression efficace

Lorsque les copies d'une application MFC à l'aide de les méthodes standard, windows exécute tous les appels (GDI) de sortie d'interface graphique GDI à un métafichier en mémoire.Lorsque EndPage est appelé, windows utilise le métafichier une fois pour chaque bande physique que l'imprimante a besoin pour imprimer une page.Pendant ce rendu, GDI interroge fréquemment la procédure d'arrêt pour déterminer si elle continue.En général la procédure d'arrêt permet de traiter les messages dans afin que l'utilisateur puisse interrompre le travail d'impression à l'aide d'une boîte de dialogue d'impression.

Malheureusement, cela peut entraîner une dégradation le processus d'impression.Si l'impression dans votre application doit être plus rapide que peut être obtenu à l'aide de la technique standard, vous devez implémenter la bande manuelle.

Bande d'impression

Afin de satisfaire manuellement, vous devez au sujet de implémenter la boucle d'impression de sorte qu' OnPrint est appelée plusieurs fois par page (une fois par bande).La boucle d'impression est implémentée dans la fonction d' OnFilePrint dans viewprnt.cpp.Dans votre CViewclasse dérivée de, vous surchargez cette fonction afin que l'entrée de la table des messages pour la gestion la commande d'impression appelle la fonction d'impression.Copiez la routine d' OnFilePrint et modifiez la boucle d'impression pour implémenter la bande.Vous voudrez probablement également passer le rectangle de bande à vos fonctions d'impression afin que vous puissiez optimiser le dessin en fonction de la section de la page est imprimée.

Ensuite, vous devez fréquemment appeler QueryAbort tout en dessinant la bande.Sinon, la procédure d'arrêt ne sera pas appelée et l'utilisateur n'est pas annuler le travail d'impression.

Aperçu avant impression : papier électronique avec l'interface utilisateur

Aperçu avant impression, essentiellement, tente pour transformer l'affichage en émulation d'une imprimante.Par défaut, la zone cliente de la fenêtre principale est utilisée pour afficher un ou deux pages entièrement dans la fenêtre.L'utilisateur peut pour effectuer un zoom avant sur une zone de la page la voir plus en détail.Avec la prise en charge supplémentaire, il peut même être autorisé à modifier le document en mode aperçu.

Personnaliser l'aperçu avant impression

Cette remarque traite uniquement un aspect de modifier l'aperçu avant impression : Ajout d'interface utilisateur au mode d'aperçu.D'autres modifications possibles, mais de ces modifications sont hors de portée de cette rubrique.

Pour ajouter l'interface utilisateur au mode d'aperçu

  1. Dérivez une classe d'affichage de CPreviewView.

  2. Ajoutez les gestionnaires de commandes pour les aspects d'interface utilisateur que vous souhaitez.

  3. Si vous ajoutez des aspects visuels à l'affichage, la substitution OnDraw et exécuter votre dessin après avoir appelé CPreviewView::OnDraw.

OnFilePrintPreview

Il s'agit du gestionnaire de commandes pour l'aperçu avant impression.Son implémentation par défaut est :

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 masquer le volet principal de l'application.Les barres de contrôles, telles que la barre d'état, peuvent être conservées en les spécifiant dans le membre dedwStates de pState-> (il s'agit d'un masque de bits et les bits pour les barres de contrôles sont définis par AFX_CONTROLBAR_MASK(AFX_IDW_MYBAR)).Le pState->nIDMainPane de fenêtre est la fenêtre qui sera automatiquement masquée et reshown.DoPrintPreview crée ensuite une barre d'icônes pour l'aperçu interface utilisateur standard.Si spécial la gestion de fenêtre est nécessaire, par exemple pour masquer ou afficher d'autres fenêtres, si doit être effectuée avant que DoPrintPreview ne soit appelée.

Par défaut, lorsque l'aperçu avant impression se termine, il retourne les barres de contrôles à leur état d'origine et au volet principal à visible.Si une gestion spéciale est nécessaire, elle doit être effectuée dans une substitution d' EndPrintPreview. Si DoPrintPreview échoue, fournissez également la gestion spéciale.

DoPrintPreview est appelé avec :

  • L'ID de ressource du modèle de boîte de dialogue de la barre d'outils d'aperçu.

  • Un pointeur vers la vue pour effectuer l'impression pour l'aperçu avant impression.

  • La classe d'exécution de la classe d'affichage d'aperçu.Ce sera créé dynamiquement dans DoPrintPreview.

  • Le pointeur de CPrintPreviewState.Notez que la structure de CPrintPreviewState (ou la structure dérivée si l'application a besoin de plus d'état conservé) ne doit pas être créée sur le frame.DoPrintPreview est non modale et cette structure doivent survivre jusqu'à ce qu'EndPrintPreview ne soit appelée.

    [!REMARQUE]

    Si une vue ou une classe d'affichage séparée est nécessaire pour imprimer la prise en charge, un pointeur vers cet objet doit être passé comme deuxième paramètre.

EndPrintPreview

Cela est appelé pour terminer le mode d'aperçu avant impression.Il est souvent souhaitable de passer à la page dans le document qui a été pour la dernière fois affiché dans l'aperçu avant impression.EndPrintPreview est l'opportunité de l'application de le faire.Le membre d'm_nCurPage de pInfo-> est la page qui a été en dernier affichée (situé le plus à gauche si deux pages sont affichées), et le pointeur est un indicateur quant à où sur la page l'utilisateur a intéressent.Comme la structure de la vue de l'application est inconnue à l'infrastructure, vous devez fournir du code pour passer au point choisi.

Vous devez exécuter la plupart des actions avant d'appeler CView::EndPrintPreview.Cet appel annule les effets de DoPrintPreview et supprime le pView, le pDC, et le pInfo.

// Any further cleanup should be done here.
CView::EndPrintPreview(pDC, pInfo, point, pView);

CWinApp::OnFilePrintSetup

Cela doit être mappé pour l'élément de menu de configuration de l'impression.Dans la plupart des cas, il n'est pas nécessaire de substituer l'implémentation.

La page nomenclature

L'autre rubrique est celui de la numérotation et de la commande page.Pour les applications simples de type de traitement de texte, il s'agit d'un problème simple.La plupart des systèmes d'aperçu avant impression supposent que chaque page imprimée correspond à une page dans le document.

En essayant de fournir une solution généralisée, plusieurs points sont à prendre en compte.Imaginez un système de CAO.l'utilisateur a un dessin qui couvre plusieurs feuilles d'E-taille.Sur un traceur d'E-taille (ou un plus petit, mis à l'échelle), la numérotation de page sera comme dans le cas le plus simple.Mais sur une imprimante laser, l'impression 16 pages d'Un-taille par feuille, que l'aperçu avant impression considère-il une « page » ?

Comme rapports d'introduction de paragraphe, l'aperçu avant impression agit comme une imprimante.Par conséquent, l'utilisateur voit s'afficher ce qui sortirait de l'imprimante particulière qui est sélectionnée.Il appartient à la vue pour déterminer l'image est imprimée sur chaque page.

La chaîne de description de page dans la structure d' CPrintInfo fournit un moyen d'afficher le numéro de page à l'utilisateur si elle peut être représentée comme un nombre par page (comme dans « page 1 " ou « pages 1-2 »).Cette chaîne est utilisée par l'implémentation par défaut de CPreviewView::OnDisplayPageNumber.Si un affichage différent est nécessaire, vous pouvez remplacer cette fonction virtuelle pour fournir, par exemple, « Sheet1, les sections A, B ».

Voir aussi

Autres ressources

Notes techniques de nombres

Notes techniques de catégorie