Share via


Documents multipages

Cet article décrit les fenêtres l'impression du protocole et explique comment imprimer des documents qui contiennent plusieurs pages.L'article aborde les rubriques suivantes :

  • Protocole d'impression

  • Substituer les fonctions de classe d'affichage

  • Pagination

  • Pages d'imprimante et.pages de document

  • Pagination de Copie-fois

Le protocole d'impression

Pour imprimer un document multipage, l'infrastructure et la vue interactifs de la manière suivante.d'abord l'infrastructure affiche la boîte de dialogue de Imprimer , crée un contexte de périphérique pour l'imprimante, et appelle la fonction membre de StartDoc de l'objet de CDC .Ensuite, chaque page du document, l'infrastructure implique la fonction membre de StartPage de l'objet d' CDC , demande à l'objet de vue d'imprimer la page, et appelle la fonction membre d' EndPage .Si le mode d'imprimante doit être modifié avant de démarrer la page particulière, la vue appelle ResetDC, qui met à jour la structure de DEVMODE contenant les nouvelles informations de mode d'imprimante.Lorsque le document entier a été imprimé, l'infrastructure appelle la fonction membre d' EndDoc .

Substituer les fonctions de classe d'affichage

La classe de CView définit plusieurs fonctions membres qui sont appelées par l'infrastructure pendant l'impression.En substituant ces fonctions dans votre classe d'affichage, vous fournissez des connexions la logique de l'impression entre la logique imprimante de l'infrastructure et de votre classe de vue.Le tableau suivant répertorie ces fonctions membres.

Les fonctions substituables CView pour l'impression

Nom

Raison de substitution

OnPreparePrinting

Pour insérer des valeurs dans la boîte de dialogue d'impression, notamment la longueur du document

OnBeginPrinting

Pour allouer les polices ou d'autres ressources GDI

OnPrepareDC

Pour ajuster les attributs du contexte de périphérique pour une page donnée, ou que la pagination de copie-fois

OnPrint

Pour imprimer une page donnée

OnEndPrinting

Pour libérer les ressources GDI

Vous pouvez effectuer le traitement impression-mis en relation dans d'autres fonctions également, mais ces fonctions sont celles qui pilotent le processus d'impression.

L'illustration suivante montre les étapes du processus d'impression et indique où chacune de fonctions membres de l'impression des CView est appelée.Le reste de cet article explique la plupart de ces étapes plus en détail.Les parties supplémentaires du processus d'impression sont décrites dans l'article allouer des ressources GDI.

La boucle d'impression

Procédure de boucle d'impression

Pagination

l'infrastructure stocke une grande partie des informations sur un travail d'impression dans une structure de CPrintInfo .Plusieurs des valeurs dans CPrintInfo concernent la pagination ; ces valeurs sont accessibles comme indiqué dans le tableau suivant.

Les informations de numéro de page stockées dans CPrintInfo

Variable membre ou

nom de fonction

Numéro de page référencé

GetMinPage/SetMinPage

Première page du document

GetMaxPage/SetMaxPage

Dernière page du document

GetFromPage

Première page du document

GetToPage

Dernière page à imprimer

m_nCurPage

Page actuellement imprimée

Les numéros de page de démarrage à 1, c. autrement dit., la première page est numérotée 1, et non 0.Pour plus d'informations sur ces éléments et d'autres membres de CPrintInfo, consultez MFC Reference.

Au début du processus d'impression, l'infrastructure appelle la fonction membre d' OnPreparePrinting de la vue, en passant un pointeur vers une structure d' CPrintInfo .L'Assistant Application fournit une implémentation d' OnPreparePrinting qui appelle DoPreparePrinting, une autre fonction membre d' CView.DoPreparePrinting est la fonction qui affiche la boîte de dialogue d'impression et crée un contexte de périphérique d'impression.

À ce stade l'application ne connaît pas le nombre de pages sont dans le document.Elle utilise les valeurs par défaut 1 et 0xFFFF pour les nombres de première et la dernière page du document.Si vous connaissez le nombre de pages votre document a, substituez OnPreparePrinting et l'appel SetMaxPage pour la structure d' CPrintInfo avant de l'envoyer à DoPreparePrinting.Cela vous permet de spécifier la longueur de votre document.

DoPreparePrinting affiche la boîte de dialogue d'impression.Lorsqu'elle retourne, la structure d' CPrintInfo contient les valeurs spécifiées par l'utilisateur.Si des souhaits d'utilisateur pour imprimer qu'une plage sélectionnée des pages, de lui ou de celle-ci peuvent spécifier les numéros de page démarrants et se terminants dans la boîte de dialogue d'impression.L'infrastructure extrait ces valeurs à l'aide de les fonctions d' GetFromPage et d' GetToPage de CPrintInfo.Si l'utilisateur ne spécifie pas une plage de page, l'infrastructure appelle GetMinPage et GetMaxPage et utilise les valeurs retournées pour imprimer le document entier.

Pour chaque page d'un document à imprimer, l'infrastructure appelle deux fonctions membres dans votre classe d'affichage, OnPrepareDC et OnPrint, et passe des paramètres de chaque fonction deux : un pointeur vers un objet CDC et un pointeur vers une structure d' CPrintInfo .Chaque fois que l'infrastructure appelle OnPrepareDC et OnPrint, elle passe une valeur différente dans le membre d' m_nCurPage de la structure d' CPrintInfo .De cette manière de l'infrastructure indique à la vue ce que la page doit être imprimée.

La fonction membre d' OnPrepareDC est également utilisée pour l'affichage sur écran.Elle effectue des réglages au contexte de périphérique avant que dessiner ait lieu.OnPrepareDC rend un rôle similaire dans l'impression, mais il existe certaines différences : tout d'abord, l'objet d' CDC représente un contexte de périphérique d'imprimante au lieu d'un contexte de périphérique, et en second lieu, un objet d' CPrintInfo est passé comme deuxième paramètre.(Ce paramètre est NULL lorsque OnPrepareDC est appelé pour l'écran.) Substituez OnPrepareDC pour ajuster le contexte de périphérique selon lequel la page s'affiche.Par exemple, vous pouvez déplacer l'origine de la fenêtre d'affichage et la région de découpage pour garantir que la partie appropriée du document est imprimée.

La fonction membre d' OnPrint exécute l'impression réelle de la page.L'article Comment avez par défaut l'impression est faite montre comment l'infrastructure appelle OnDraw à un contexte de périphérique d'impression pour effectuer l'impression.Plus précisément, les appels OnPrint d'infrastructure avec une structure d' CPrintInfo et un contexte de périphérique, et passe d' OnPrint le contexte de périphérique à OnDraw.Substituez OnPrint d'effectuer tout rendu qui doit être effectué uniquement pendant l'impression et pas pour l'écran.Par exemple, pour imprimer des en-têtes ou les pieds de page (consultez l'article En-têtes et pieds de page pour plus d'informations).Appelez ensuite OnDraw de la substitution d' OnPrint pour que le mot commun de rendu à l'écran et à l'impression.

Le fait qu' OnDraw effectue le rendu de l'écran et l'impression signifie que votre application est WYSIWYG : « Ce qui vous voyez est ce que vous obtenez ». Toutefois, supposez que vous n'écrivez pas une application WYSIWYG.Par exemple, considérez un éditeur de texte qui utilise une police de caractère grasse pour que les codes de contrôle d'accès d'impression mais un contrôle indiquent des caractères gras à l'écran.Dans ce cas, vous utilisez OnDraw strictement pour l'écran.Lorsque vous substituez OnPrint, substituez l'appel à OnDraw avec un appel à une fonction séparée de dessin.Que la fonction trace le document la façon dont il apparaît dans le papier, à l'aide de les attributs que vous n'affichez pas à l'écran.

Pages d'imprimante et.Pages de document

Lorsque vous faites référence aux numéros de page, il est parfois nécessaire de faire la distinction entre le concept de l'imprimante d'une page et le concept d'un document d'une page.Du point de vue de l'imprimante, une page est une feuille de papier.Toutefois, une feuille de papier n'a pas nécessairement une page du document.Par exemple, si vous imprimez un bulletin d'information, où les feuilles doivent être pliées, une feuille de papier peut contenir à la fois les première et la dernière page du document, côte à côte.De même, si vous mettez une feuille de calcul, le document ne comprend pas les pages du tout.À la place, une feuille de papier peut contenir des lignes 1 à 20, les colonnes 6 à 10.

Tous les numéros de page dans la structure de CPrintInfo font référence à des pages d'imprimante.l'infrastructure appelle OnPrepareDC et OnPrint une fois pour chaque feuille de papier qui traversera l'imprimante.Lorsque vous substituez la fonction d' OnPreparePrinting pour spécifier la longueur de le document, vous devez utiliser des pages d'imprimante.S'il existe une correspondance (autrement dit, une page d'imprimante atteint une page de le document), alors il est facile.Si, en revanche, les pages de documents et des pages d'imprimante ne correspondent pas directement, vous devrez traduire entre elles.Par exemple, envisagez d'impression d'une feuille de calcul.En substituant OnPreparePrinting, vous devez calculer le nombre de feuilles de papier requises pour imprimer la feuille de calcul entière puis utiliser cette valeur lorsque appelant la fonction membre d' SetMaxPage d' CPrintInfo.De même, en substituant OnPrepareDC, vous devrez traduire m_nCurPage en plage des lignes et des colonnes qui apparaissent dans cette feuille particulière puis s'ajustent l'origine de la fenêtre d'affichage en conséquence.

Pagination de Copie-Fois

Dans certains cas, votre classe d'affichage peut ne pas savoir à l'avance le temps le document est jusqu'à ce qu'il a été imprimé réellement.Par exemple, supposons que votre application n'est pas WYSIWYG, une longueur document sur l'écran ne correspond pas à sa longueur à l'impression.

Cela pose un problème lorsque vous substituez OnPreparePrinting pour votre classe d'affichage : vous ne pouvez pas passer une valeur à la fonction d' SetMaxPage de la structure de CPrintInfo , car vous ne connaissez pas la longueur d'un document.Si l'utilisateur ne spécifie pas de numéro de page pour arrêter à utiliser la boîte de dialogue d'impression, l'infrastructure ne sait pas arrêter lorsque la boucle d'impression.La seule manière de déterminer quand arrêter la boucle d'impression est d'imprimer le document et afficher lorsqu'elle se termine.Votre classe d'affichage doit vérifier la fin du document pendant qu'elle est imprimée, puis informer l'infrastructure lorsque l'extrémité est atteinte.

L'infrastructure utilise la fonction d' OnPrepareDC de votre classe de vue pour indiquer quand arrêter.Après chaque appel à OnPrepareDC, l'infrastructure active un membre de la structure d' CPrintInfo appelée m_bContinuePrinting.Sa valeur par défaut est TRUE. Tant qu'elle reste donc, l'infrastructure continue la boucle d'impression.Si elle est définie à FALSE, l'infrastructure arrête.Pour effectuer la pagination de copie-fois, la substitution OnPrepareDC pour vérifier si la fin du document a été atteinte, et l'ensemble m_bContinuePrinting à FALSE lorsqu'il a.

L'implémentation par défaut d' OnPrepareDC définit m_bContinuePrinting à FALSE si la page actuelle est supérieure à 1.Cela signifie que si la longueur du document n'était pas spécifiée, l'infrastructure suppose que le document est une page longtemps.Une il s'ensuit que vous devez faire attention lorsque vous appelez la version de classe de base d' OnPrepareDC.Ne supposez pas qu' m_bContinuePrinting sera TRUE après avoir appelé la version de classe de base.

w7wzay73.collapse_all(fr-fr,VS.110).gifSur quels éléments souhaitez-vous obtenir des informations supplémentaires ?

Voir aussi

Référence

Impression

CView, classe

CDC, classe