Cette note décrit le processus de personnalisation impression et aperçu avant impression et décrit l'application de la routine de rappel utilisée dans CView et routines de rappel et de fonctions membres de CPreviewView.
Le problème
MFC fournit une solution complète pour la plupart d'impression et aperçu avant impression des besoins. Dans la plupart des cas, peu de code supplémentaire est requis d'avoir une vue capable d'imprimer et afficher un aperçu. Cependant, il existe des moyens pour optimiser l'impression qui exigent un effort important de la part du développeur, et certaines applications ont besoin d'ajouter des éléments d'interface utilisateur spécifique pour le mode Aperçu avant impression.
Impression efficace
Lorsqu'une application MFC imprime en utilisant les méthodes standards, Windows dirige tous les appels de sortie d'Interface de périphérique graphique (GDI) à un métafichier en mémoire. Lorsqu'il est appelé EndPage , Windows joue le métafichier une fois pour chaque bande physique qui nécessite de l'imprimante pour imprimer une seule page. Au cours de ce rendu, GDI interroge fréquemment la procédure Abort pour déterminer s'il devrait continuer. Généralement, la procédure d'abandon permet aux messages d'être traitées pour que l'utilisateur peut interrompre le travail 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 peuvent être obtenus en utilisant la technique standard, vous devez implémenter un cerclage Manuel.
Imprimer des bandes
À bande manuellement, vous devez re implémenter la boucle d'impression tels que OnPrint est appelée plusieurs fois par page (une fois par la bande). La boucle d'impression est mis en œuvre dans la fonction OnFilePrint dans viewprnt.cpp. Dans votre classe CView-dérivée de la classe, vous surchargez cette fonction afin que l'entrée de la carte de message pour le traitement de la commande d'impression appelle votre fonction d'impression. Copiez la routine OnFilePrint et changer la boucle d'impression à mettre en œuvre des bandes. Vous aurez probablement aussi veulent passer le rectangle de baguage à vos fonctions d'impression, afin que vous pouvez optimiser le dessin basé sur la section de la page à imprimer.
Deuxièmement, vous devez appeler fréquemment QueryAbort tout en tirant la bande. Par ailleurs, la procédure d'avortement ne sera pas appelée et l'utilisateur sera incapable d'annuler le travail d'impression.
Aperçu ava&nt impression : nbsp ; Papier électronique avec Interface utilisateur
Apertu, essentiellement, tente d'activer l'affichage en une é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 est capable de zoomer sur une zone de la page pour la voir plus en détail. Avec un soutien supplémentaire, l'utilisateur peut même être autorisé pour modifier le document en mode Aperçu.
Personnalisation d'aperçu avant impression
Cette note porte seulement sur un aspect de modifier l'aperçu avant impression : ajout de l'interface utilisateur de mode de prévisualisation. Autres modifications sont possibles, mais ces changements sont hors de la portée de cette discussion.
En bref, le processus d'ajout de l'interface utilisateur pour le mode Aperçu est à:
OnFilePrintPreview
C'est le gestionnaire de commandes pour l'aperçu avant impression. Sa mise en œuvre de la valeur par défaut est:
vOID CView::OnFilePrintPreview()
{
nbsp ; / / Dans les classes dérivées, mettre en oeuvre fenêtre spécial manutention ici
/ / Veillez à décrocher fenêtre Frame près si accro.
/ / ne doit pas créer ce sur le cadre. Doit survivre cette fonction
CPrintPreviewState * pState = new CPrintPreviewState ;
if (!.DoPrintPreview (AFX_IDD_PREVIEW_TOOLBAR, ce,
RU&NTIME_CLASS(CPreviewView), pState))
{
Et dans les classes dérivées, de manipulation de fenêtre spéciale inverse
/ / ici pour cause de panne aperçu
TRACE0 ("erreur : DoPrintPreview a échoué") ;
AfxMessageBox(AFX_IDP_COMMAND_FAILURE) ;
supprimer pState ; / / visualisation impossible d'initialiser, / / supprimer État maintenant
}
}
DoPrintPreview permet de masquer le volet principal de l'application. Barres de contrôles, tels que la barre d'État, peuvent être conservés en les spécifiant dans la pState-gt ;membre de dwStates (c'est un masque de bits et les bits pour les barres de contrôles individuels sont définies par AFX_CONTROLBAR_MASK(AFX_IDW_MYBAR)). La fenêtre pState - >nIDMainPane est la fenêtre qui sera automatiquement cachée et reshown. DoPrintPreview va ensuite créer une barre de boutons pour l'interface utilisateur la prévisualisation standard. Si la manipulation de la fenêtre spéciale est nécessaire, à masquer ou afficher les autres fenêtres, ce qui devraient être faites avant DoPrintPreview est appelée.
Par défaut, lorsque l'aperçu avant impression se termine, elle renvoie les barres de contrôle à leur état initial et dans le volet principal visible. Si un traitement spécial est nécessaire, il doit être fait dans une substitution de EndPrintPreview. Si DoPrintPreview échoue, également fournir une gestion particulière.
DoPrintPreview est appelé avec:
&Notenbsp ; Si une vue distincte ou une classe d'affichage est nécessaire pour le support d'impression, un pointeur vers cet objet devrait être transmis comme deuxième paramètre.
EndPrintPreview
Cela s'appelle mettre le mode Aperçu avant impression. Il est souvent souhaitable de passer à la pa&ge dans le document qui était dernière affichée en aperçu avant impression. EndPrintPreview est l'occasion de l'application de le faire. PInfo-gt ;membre m_nCurPage est la page qui a été le dernier affichée (gauche si deux pages ont été affichées), et le pointeur est un indice quant à où sur la page, l'utilisateur était intéressé. Étant donné que la structure du point de vue de l'application est inconnue pour le cadre, la vous devez fournir le code pour déplacer vers le point choisi.
Vous devez effectuer la plupart des actions avant d'appeler CView::EndPrintPreview. Cet appel annule les effets de la DoPrintPreview et supprime pView, pDC et pInfo.
/ / Tout autre nettoyage devrait être fait en l'espèce.
CView::EndPrintPreview (pDC, pInfo, point, pView)
CWinApp::OnFilePrintSetup
Cela doit être mappé à l'élément de menu de configuration de l'impression. Dans la plupart des cas, il n'est pas nécessaire de substituer la mise en œuvre.
Page Nomenclature
Une autre question est celle de la numérotation des pages et l'ordre. Pour les applications de type traitement de texte simple, c'est une question simple. La plupart des systèmes 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, il y a plusieurs choses à considérer. Imaginez un système de CAO. L'utilisateur a un dessin qui couvre plusieurs feuilles d'E-taille. Sur une E-taille (ou une plus petite échelle) traceur, la numérotation des pages serait comme dans le cas simple. Mais sur une imprimante laser, impression A-taille 16 pages par feuille, ce qui aperçu avant impression considère une « page »?
Comme l'indique le paragraphe d'introduction, aperçu avant impression agit comme une imprimante. Par conséquent, l'utilisateur verra ce qui viendrait de l'imprimante particulière qui est sélectionné. C'est à la vue afin de déterminer quelle image est imprimée sur chaque page.
La chaîne de description de page dans l'objet CPrintInfo fournit un moyen d'afficher le numéro de page à l'utilisateur si il peut être représenté 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, on peut substituer cette fonction virtuelle de fournir, par exemple, « Sheet1, Sections A, B ».
&Notes techniques par le numéro |nbsp ; Notes techniques par catégorie