2009-09-15 7 views
1

Mon application dessine des graphiques dans un métafichier Windows. Les utilisateurs doivent être en mesure d'imprimer les graphiques bien centrés sur la page. Réduction rapide du code d'impression:Pourquoi ne puis-je pas centrer une image sur une page pour l'imprimer dans VB.NET?

Private Sub PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs) 
    Dim header As Imaging.MetafileHeader = metafile.GetMetafileHeader() 
    Dim sz As New SizeF(100 * header.Bounds.Width/header.DpiX, 100 * header.Bounds.Height/header.DpiY) 
    Dim p As New PointF((e.PageBounds.Width - sz.Width)/2, (e.PageBounds.Height - sz.Height)/2) 

    e.Graphics.DrawImage(metafile, p) 
End Sub 

Si j'imprime sur un document PDF, cela semble parfait. Mais si j'imprime sur une imprimante réelle, elle est décentrée, à environ 1/8 de pouce vers le bas et vers la droite. Je l'ai fait une expérience rapide pour voir où les PageBounds étaient en faisant

e.Graphics.DrawRectangle(Pens.Red, e.PageBounds) 

et les résultats étaient les mêmes, légèrement décentré. Sur le PDF, cela dessine un rectangle sur le bord même de la page. Pour ce que ça vaut, j'ai testé sur un Toshiba e-Studio 3510c et un HP LaserJet 4000 avec les mêmes résultats. Toute aide est appréciée, cela me tourmente depuis des semaines.

Mise à jour:

J'ai fini à l'aide e.PageSettings.PrintableArea, mais il semble que e.Graphics.VisibleClipBounds vous obtient les mêmes valeurs que par la réponse de xpda.

Répondre

2

Au lieu d'utiliser e.pagebounds pour la zone de délimitation, essayez d'utiliser e.graphics.VisibleClipBounds. Certains pilotes d'imprimantes sont peu fiables avec les e.pagebounds, et les visibleclipbounds semblent plus précis.

0

Je pense que c'est un problème de l'imprimante ayant des marges différentes de tous les côtés de la page. Au lieu de positionner votre diagramme par rapport à la Bounds, essayez de le positionner par rapport à la véritable frontière de la page en utilisant ces propriétés:

e.PageSettings.PaperSize.Width 
e.PageSettings.PaperSize.Height 

Le problème ne se pose probablement pas avec le pdf parce que vous pouvez imprimer sur toute la zone de la page (c'est-à-dire Bounds.Width et Bounds.Height = 0, ce qui revient à utiliser la propriété PaperSize).

0

Ci-dessous le code:

Private Sub PrintPage(ByVal sender As Object, ByVal e As PrintPageEventArgs) 

Dim header As Imaging.MetafileHeader = metafile.GetMetafileHeader() 
    Dim sz As New SizeF(100 * header.Bounds.Width/header.DpiX, 100 * header.Bounds.Height/header.DpiY) 

Dim LeftMargin, TopMargin As Single 

LeftMargin = ((e.Graphics.VisibleClipBounds.Width - sz.width)/2) + (e.Graphics.VisibleClipBounds.Left/2) 

TopMargin = ((e.Graphics.VisibleClipBounds.Height- sz.Height)/2) + (e.Graphics.VisibleClipBounds.Top/ 2) 


    e.Graphics.DrawImage(metafile, LeftMargin , TopMargin, sz) 

End Sub 
Questions connexes