TN030 : personnalisation de l'impression et de l'aperçu avant impression
Remarque
La note technique suivante n'a pas été mise à jour depuis son inclusion initiale dans la documentation en ligne. Par conséquent, certaines procédures et rubriques peuvent être obsolètes ou incorrectes. Pour obtenir les informations les plus récentes, il est recommandé de rechercher l'objet qui vous intéresse dans l'index de la documentation en ligne.
Cette note décrit le processus de personnalisation de l’impression et de l’aperçu avant impression et décrit les objectifs des routines de rappel utilisées dans CView
et les routines de rappel et les fonctions membres 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 nécessaire pour que l’affichage soit en mesure d’imprimer et d’afficher un aperçu. Toutefois, il existe des façons d’optimiser l’impression qui nécessitent un effort significatif du développeur, et certaines applications doivent ajouter des éléments d’interface utilisateur spécifiques au mode aperçu avant impression.
Impression efficace
Lorsqu’une application MFC s’imprime à l’aide des méthodes standard, Windows dirige tous les appels de sortie GDI (Graphics Device Interface) vers un métafichier en mémoire. Lorsqu’il EndPage
est appelé, Windows lit le métafichier une fois pour chaque bande physique requise par l’imprimante pour imprimer une page. Pendant ce rendu, GDI interroge fréquemment la procédure d’abandon pour déterminer s’il doit continuer. En règle générale, la procédure d’abandon permet le traitement des messages afin que l’utilisateur puisse abandonner la tâche d’impression à l’aide d’une boîte de dialogue d’impression.
Malheureusement, cela peut ralentir le processus d’impression. Si l’impression dans votre application doit être plus rapide que possible à l’aide de la technique standard, vous devez implémenter une bande manuelle.
Bande d’impression
Pour effectuer une bande manuelle, vous devez implémenter à nouveau la boucle d’impression telle qu’elle OnPrint
est appelée plusieurs fois par page (une fois par bande). La boucle d’impression est implémentée dans la OnFilePrint
fonction dans viewprnt.cpp. Dans votre CView
classe dérivée, vous surchargez cette fonction afin que l’entrée de carte de messages pour la gestion de la commande d’impression appelle votre fonction d’impression. Copiez la routine et modifiez la OnFilePrint
boucle d’impression pour implémenter la bande. Vous souhaiterez probablement également passer le rectangle de bandes à vos fonctions d’impression afin de pouvoir optimiser le dessin en fonction de la section de la page en cours d’impression.
Ensuite, vous devez fréquemment appeler QueryAbort
lors du dessin de la bande. Sinon, la procédure d’abandon n’est pas appelée et l’utilisateur ne peut pas annuler la tâche d’impression.
Aperçu avant impression : Papier électronique avec interface utilisateur
Aperçu avant impression, en essence, tente de transformer l’affichage en émulation d’une imprimante. Par défaut, la zone cliente de la fenêtre principale est utilisée pour afficher une ou deux pages entièrement dans la fenêtre. L’utilisateur peut effectuer un zoom avant sur une zone de la page pour le voir plus en détail. Avec une prise en charge supplémentaire, l’utilisateur peut même être autorisé à modifier le document en mode aperçu.
Personnalisation de l’aperçu avant impression
Cette note traite uniquement d’un aspect de la modification de l’aperçu avant impression : ajout de l’interface utilisateur en mode aperçu. D’autres modifications sont possibles, mais ces modifications ne sont pas dans l’étendue de cette discussion.
Pour ajouter l’interface utilisateur au mode d’aperçu
Dériver une classe d’affichage de
CPreviewView
.Ajoutez des gestionnaires de commandes pour les aspects de l’interface utilisateur souhaités.
Si vous ajoutez des aspects visuels à l’affichage, remplacez
OnDraw
et effectuez votre dessin après l’appelCPreviewView::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
masque le volet principal de l’application. Les barres de contrôle, telles que la barre d’état, peuvent être conservées en les spécifiant dans le membre pState-dwStates> (il s’agit d’un masque de bits et les bits des barres de contrôle individuelles sont définies par AFX_CONTROLBAR_MASK( AFX_IDW_MYBAR)). La fenêtre pState-nIDMainPane> est la fenêtre qui sera automatiquement masquée et reshown. DoPrintPreview
crée ensuite une barre de boutons pour l’interface utilisateur d’aperçu standard. Si une gestion spéciale des fenêtres est nécessaire, par exemple pour masquer ou afficher d’autres fenêtres, cette opération doit être effectuée avant DoPrintPreview
d’être appelée.
Par défaut, lorsque l’aperçu avant impression se termine, il renvoie les barres de contrôle à leurs états d’origine et le volet principal à afficher. Si une gestion spéciale est nécessaire, elle doit être effectuée dans un remplacement de EndPrintPreview
. En DoPrintPreview
cas d’échec, fournissez également une gestion spéciale.
DoPrintPreview est appelé avec :
ID de ressource du modèle de boîte de dialogue de la barre d’outils d’aperçu.
Pointeur vers l’affichage pour effectuer l’impression de l’aperçu avant impression.
Classe d’exécution de la classe Preview View. Cette opération sera créée dynamiquement dans DoPrintPreview.
Pointeur CPrintPreviewState. Notez que la structure CPrintPreviewState (ou la structure dérivée si l’application a besoin d’un état plus préservé) ne doit pas être créée sur le frame. DoPrintPreview est sans mode et cette structure doit survivre jusqu’à ce que EndPrintPreview soit appelé.
Remarque
Si une classe d’affichage ou d’affichage distincte est nécessaire pour la prise en charge de l’impression, un pointeur vers cet objet doit être passé en tant que deuxième paramètre.
EndPrintPreview
Cette opération est appelée pour mettre fin au mode aperçu avant impression. Il est souvent souhaitable de passer à la page du document qui a été affichée en dernier dans l’aperçu avant impression. EndPrintPreview
est la chance de l’application de le faire. Le membre pInfo-m_nCurPage> est la page qui a été affichée pour la dernière fois (la plus à gauche si deux pages ont été affichées), et le pointeur est un indicateur quant à l’emplacement où l’utilisateur a été intéressé. Étant donné que la structure de la vue de l’application est inconnue de l’infrastructure, vous devez fournir le code pour passer au point choisi.
Vous devez effectuer la plupart des actions avant d’appeler CView::EndPrintPreview
. Cet appel inverse les effets et DoPrintPreview
supprime pView, pDC et 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 Configuration d’impression. Dans la plupart des cas, il n’est pas nécessaire de remplacer l’implémentation.
Page Nomenclature
Un autre problème est celui de la numérotation et de l’ordre des pages. Pour les applications de type de traitement de texte simples, 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 du document.
En essayant de fournir une solution généralisée, il existe plusieurs éléments à prendre en compte. Imaginez un système CAO. L’utilisateur a un dessin qui couvre plusieurs feuilles de taille E. Sur un tracé de taille E (ou plus petit, mis à l’échelle), la numérotation des pages serait comme dans le cas simple. Mais sur une imprimante laser, l’impression de 16 pages de taille A par feuille, ce que l’aperçu d’impression considère comme une « page »
Comme l’indique le paragraphe d’introduction, l’aperçu avant impression agit comme une imprimante. Par conséquent, l’utilisateur verra ce qui sortirait de l’imprimante spécifique sélectionnée. Il incombe à la vue de déterminer l’image imprimée sur chaque page.
La chaîne de description de page de la CPrintInfo
structure fournit un moyen d’afficher le numéro de page à l’utilisateur s’il peut être représenté sous la forme d’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 autre affichage est nécessaire, il est possible de remplacer cette fonction virtuelle pour fournir, par exemple, « Sheet1, Sections A, B ».