Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article décrit le protocole d’impression Windows et explique comment imprimer des documents contenant plusieurs pages. L’article traite des rubriques suivantes :
Protocole d’impression
Pour imprimer un document multipage, l’infrastructure et l’affichage interagissent de la manière suivante. Tout d’abord, l’infrastructure affiche la boîte de dialogue Imprimer , crée un contexte d’appareil pour l’imprimante et appelle la fonction membre StartDoc de l’objet CDC . Ensuite, pour chaque page du document, l’infrastructure appelle la fonction membre StartPage de l’objet CDC , indique à l’objet d’affichage d’imprimer la page et appelle la fonction membre EndPage . Si le mode imprimante doit être modifié avant de démarrer une page particulière, l’affichage appelle ResetDC, qui met à jour la structure DEVMODE contenant les nouvelles informations du mode imprimante. Lorsque l’intégralité du document a été imprimée, l’infrastructure appelle la fonction membre EndDoc .
Substitution des fonctions de classe View
La classe CView définit plusieurs fonctions membres appelées par l’infrastructure lors de l’impression. En substituant ces fonctions dans votre classe d’affichage, vous fournissez les connexions entre la logique d’impression du framework et la logique d’impression de votre classe d’affichage. Le tableau suivant répertorie ces fonctions membres.
Fonctions substituables de CView pour l’impression
| Nom | Raison de la substitution |
|---|---|
| OnPreparePrinting | Pour insérer des valeurs dans la boîte de dialogue Imprimer, en particulier la longueur du document |
| OnBeginPrinting | Pour allouer des polices ou d’autres ressources GDI |
| OnPrepareDC | Pour ajuster les attributs du contexte de l’appareil pour une page donnée ou pour effectuer une pagination au moment de l’impression |
| OnPrint | Pour imprimer une page donnée |
| OnEndPrinting | Pour libérer des ressources GDI |
Vous pouvez également effectuer un traitement lié à l’impression dans d’autres fonctions, mais ces fonctions sont celles qui pilotent le processus d’impression.
La figure suivante illustre les étapes impliquées dans le processus d’impression et montre où chacune des fonctions membres CViewd’impression est appelée. Le reste de cet article explique plus en détail la plupart de ces étapes. Des parties supplémentaires du processus d’impression sont décrites dans l’article Allocation de ressources GDI.
Boucle d’impression
Numérotation des pages
L’infrastructure stocke une grande partie des informations relatives à un travail d’impression dans une structure CPrintInfo . Plusieurs des valeurs CPrintInfo relatives à la pagination ; ces valeurs sont accessibles, comme indiqué dans le tableau suivant.
Informations de numéro de page stockées dans CPrintInfo
| Variable membre ou nom(s) 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 à imprimer |
GetToPage |
Dernière page à imprimer |
m_nCurPage |
Page en cours d’impression |
Les numéros de page commencent à 1, autrement dit, la première page est numérotée 1, et non 0. Pour plus d’informations sur ces membres et d’autres membres de CPrintInfo, consultez la référence MFC.
Au début du processus d’impression, l’infrastructure appelle la fonction membre OnPreparePrinting de la vue, en passant un pointeur vers une CPrintInfo structure. L’Assistant Application fournit une implémentation de OnPreparePrinting ce qui appelle DoPreparePrinting, une autre fonction membre de CView.
DoPreparePrinting est la fonction qui affiche la boîte de dialogue Imprimer et crée un contexte d’appareil d’imprimante.
À ce stade, l’application ne sait pas combien de pages se trouvent dans le document. Il utilise les valeurs par défaut 1 et 0xFFFF pour les nombres de la première et dernière page du document. Si vous savez combien de pages votre document contient, remplacez OnPreparePrinting et appelez [SetMaxPage]--brokenlink--(reference/cprintinfo-class.md#setmaxpage) pour la CPrintInfo structure avant de l’envoyer DoPreparePrinting. Cela vous permet de spécifier la longueur de votre document.
DoPreparePrinting affiche ensuite la boîte de dialogue Imprimer. Lorsqu’elle est retournée, la CPrintInfo structure contient les valeurs spécifiées par l’utilisateur. Si l’utilisateur souhaite imprimer uniquement une plage de pages sélectionnée, il peut spécifier les numéros de page de début et de fin dans la boîte de dialogue Imprimer. L’infrastructure récupère ces valeurs à l’aide des fonctions et GetToPage des GetFromPage fonctions de CPrintInfo. Si l’utilisateur ne spécifie pas de plage de pages, l’infrastructure appelle GetMinPage et GetMaxPage utilise les valeurs retournées pour imprimer l’intégralité du document.
Pour chaque page d’un document à imprimer, l’infrastructure appelle deux fonctions membres dans votre classe d’affichage, OnPrepareDC et OnPrint, et transmet chaque fonction deux paramètres : un pointeur vers un objet CDC et un pointeur vers une CPrintInfo structure. Chaque fois que l’infrastructure appelle OnPrepareDC et OnPrintqu’elle transmet une valeur différente dans le membre m_nCurPage de la CPrintInfo structure. De cette façon, l’infrastructure indique l’affichage de la page à imprimer.
La fonction membre OnPrepareDC est également utilisée pour l’affichage de l’écran. Il effectue des ajustements dans le contexte de l’appareil avant le dessin.
OnPrepareDC joue un rôle similaire dans l’impression, mais il existe quelques différences : tout d’abord, l’objet CDC représente un contexte d’appareil d’imprimante au lieu d’un contexte d’appareil d’écran, puis un CPrintInfo objet est passé en tant que deuxième paramètre. (Ce paramètre est NULL lorsqu’il OnPrepareDC est appelé pour l’affichage de l’écran.) Remplacez OnPrepareDC la modification du contexte de l’appareil en fonction de la page imprimée. Par exemple, vous pouvez déplacer l’origine de la fenêtre d’affichage et la région de découpage pour vous assurer que la partie appropriée du document est imprimée.
La fonction membre OnPrint effectue l’impression réelle de la page. L’article How Default Printing Is Done montre comment l’infrastructure appelle OnDraw avec un contexte d’appareil d’imprimante pour effectuer l’impression. Plus précisément, l’infrastructure appelle OnPrint avec une CPrintInfo structure et un contexte d’appareil, et OnPrint transmet le contexte de l’appareil à OnDraw. Remplacez OnPrint l’exécution d’un rendu qui doit être effectué uniquement pendant l’impression et non pour l’affichage de l’écran. Par exemple, pour imprimer des en-têtes ou des pieds de page (consultez l’article En-têtes et pieds de page pour plus d’informations). Ensuite, appelez OnDraw à partir du remplacement de OnPrint pour effectuer le rendu commun à l’affichage d’écran et à l’impression.
Le fait que OnDraw le rendu pour l’affichage d’écran et l’impression signifie que votre application est WYSIWYG : « Ce que vous voyez est ce que vous obtenez ». Toutefois, supposons que vous n’écrivez pas d’application WYSIWYG. Par exemple, considérez un éditeur de texte qui utilise une police en gras pour l’impression, mais affiche des codes de contrôle pour indiquer du texte en gras à l’écran. Dans une telle situation, vous utilisez OnDraw strictement pour l’affichage de l’écran. Lorsque vous remplacez OnPrint, remplacez l’appel par OnDraw un appel à une fonction de dessin distincte. Cette fonction dessine le document comme il apparaît sur papier, en utilisant les attributs que vous n’affichez pas à l’écran.
Pages d’imprimante et pages de document
Lorsque vous faites référence à des numéros de page, il est parfois nécessaire de faire la distinction entre le concept d’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’est pas nécessairement égale à 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ères et les dernières pages du document, côte à côte. De même, si vous imprimez une feuille de calcul, le document ne se compose pas de pages du tout. Au lieu de cela, une feuille de papier peut contenir des lignes 1 à 20, colonnes 6 à 10.
Tous les numéros de page de la structure CPrintInfo font référence aux pages d’imprimante. L’infrastructure appelle OnPrepareDC et OnPrint une fois pour chaque feuille de papier qui passera par l’imprimante. Lorsque vous remplacez la fonction OnPreparePrinting pour spécifier la longueur du document, vous devez utiliser des pages d’imprimante. S’il existe une correspondance un-à-un (c’est-à-dire qu’une page d’imprimante est égale à une page de document), cela est facile. Si, d’autre part, les pages de document et les pages d’imprimante ne correspondent pas directement, vous devez les traduire entre elles. Par exemple, envisagez d’imprimer une feuille de calcul. En cas de OnPreparePrintingsubstitution, vous devez calculer le nombre de feuilles de papier nécessaires pour imprimer l’intégralité de la feuille de calcul, puis utiliser cette valeur lors de l’appel de la SetMaxPage fonction membre de CPrintInfo. De même, en cas de OnPrepareDCsubstitution, vous devez traduire m_nCurPage dans la plage de lignes et de colonnes qui apparaîtront sur cette feuille particulière, puis ajuster l’origine de la fenêtre d’affichage en conséquence.
pagination Print-Time
Dans certaines situations, votre classe d’affichage peut ne pas savoir à l’avance combien de temps le document est jusqu’à ce qu’il ait été imprimé. Par exemple, supposons que votre application n’est pas WYSIWYG. Par conséquent, la longueur d’un document à l’écran ne correspond pas à sa longueur lors de l’impression.
Cela provoque un problème lorsque vous remplacez OnPreparePrinting pour votre classe d’affichage : vous ne pouvez pas passer une valeur à la SetMaxPage fonction de la structure CPrintInfo , car vous ne connaissez pas la longueur d’un document. Si l’utilisateur ne spécifie pas de numéro de page à arrêter à l’aide de la boîte de dialogue Imprimer, l’infrastructure ne sait pas quand arrêter la boucle d’impression. La seule façon de déterminer quand arrêter la boucle d’impression consiste à imprimer le document et à voir quand il se termine. Votre classe d’affichage doit vérifier la fin du document pendant son impression, puis informer l’infrastructure lorsque la fin est atteinte.
L’infrastructure s’appuie sur la fonction OnPrepareDC de votre classe d’affichage pour lui indiquer quand arrêter. Après chaque appel, OnPrepareDCl’infrastructure vérifie un membre de la CPrintInfo structure appelée m_bContinuePrinting. Sa valeur par défaut est TRUE. Tant qu’il reste ainsi, l’infrastructure continue la boucle d’impression. S’il est défini sur FALSE, l’infrastructure s’arrête. Pour effectuer la pagination au moment de l’impression, remplacez-la OnPrepareDC pour vérifier si la fin du document a été atteinte et définissez m_bContinuePrinting sur FALSE lorsqu’il a.
L’implémentation par défaut des OnPrepareDC jeux m_bContinuePrinting sur FALSE si la page active est supérieure à 1. Cela signifie que si la longueur du document n’a pas été spécifiée, l’infrastructure suppose que le document est long d’une page. L’une des conséquences est que vous devez être prudent si vous appelez la version de classe de base de OnPrepareDC. Ne supposez pas que m_bContinuePrinting sera TRUE après avoir appelé la version de la classe de base.