2009-06-04 17 views
0

J'ai du code qui est utilisé pour créer par programme un document à envoyer à l'imprimante. Il va quelque chose comme ceci:Création de graphiques C#

private void pd_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs ev) 
{  
     ev.Graphics.DrawImage(pictureBox1.Image, 50, 100); 

     string drawToday="Date  : "+strToday; 
     string drawPolicyNo="Policy # : " + strPolicyNo; 
     string drawUser="User  : " + strUser; 
     Font drawFont=new Font("Arial",30); 
     SolidBrush drawBrush=new SolidBrush(Color.Black); 
     PointF drawPointToday=new Point(50,400); 
     PointF drawPointPolicyNo=new Point(50,450); 
     PointF drawPointUser=new Point(50,500); 
     ev.Graphics.DrawString(drawToday,drawFont,drawBrush,drawPointToday); 
     ev.Graphics.DrawString(drawPolicyNo,drawFont,drawBrush,drawPointPolicyNo); 
     ev.Graphics.DrawString(drawUser,drawFont,drawBrush,drawPointUser); 
} 

Son code efficace, mais maintenant je dois faire la même procédure mais écrire dans un fichier d'image afin qu'il puisse être envoyé à un navigateur et imprimé à partir de là. Il devrait être relativement simple de réutiliser ce code, mais je suis malheureusement bloqué sur la surface de dessin à utiliser en remplacement de PrintPageEventArgument.

Merci

Modifier: Merci, je reçois que je dois juste un autre objet Graphics, mais l'objet Graphics par lui-même ne dispose pas d'un constructeur public, donc ce que je cherche est une suggestion sur quel objet je besoin de se substituer pour pouvoir créer un objet Graphics sur lequel dessiner. Je pensais peut-être bitmap? Les bitmaps sont bien sûr basés sur des pixels au lieu d'être basés sur des points, donc je n'étais pas sûr que ce soit le meilleur moyen d'utiliser.

+0

Vous pouvez obtenir une carte graphique objet de nombreux endroits différents telles images et contrôles. Vous voudrez probablement regarder dans les propriétés DpiX, DpiY, PageScale et PageUnit (et peut-être quelques autres dont je ne me souviens pas maintenant), afin d'obtenir des objets graphiques de différentes sources à se comporter d'une manière similaire. Utilisez le débogueur pour rechercher les valeurs de l'objet graphique dans votre événement PrintPage afin d'obtenir un bon point de départ. –

Répondre

5

Si je vous comprends bien, vous pouvez simplement sortir le code de votre gestionnaire d'événements dans une autre méthode d'accepter un objet Graphics en tant que paramètre:

private void Print(Graphics g) 
{ 
    g.DrawImage(pictureBox1.Image, 50, 100); 

    string drawToday="Date  : "+strToday; 
    string drawPolicyNo="Policy # : " + strPolicyNo; 
    string drawUser="User  : " + strUser; 
    Font drawFont=new Font("Arial",30); 
    SolidBrush drawBrush=new SolidBrush(Color.Black); 
    PointF drawPointToday=new Point(50,400); 
    PointF drawPointPolicyNo=new Point(50,450); 
    PointF drawPointUser=new Point(50,500); 
    g.DrawString(drawToday,drawFont,drawBrush,drawPointToday); 
    g.DrawString(drawPolicyNo,drawFont,drawBrush,drawPointPolicyNo); 
    g.DrawString(drawUser,drawFont,drawBrush,drawPointUser); 
} 

Et puis appeler cette méthode à partir de votre gestionnaire d'événements:

private void pd_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs ev) 
{  
     Print(ev.Graphics); 
} 

Ensuite, vous pouvez réutiliser la même méthode pour l'impression de la sortie à une autre instance graphique:

using (Bitmap img = new Bitmap(width, height)) 
using (Graphics g = Graphics.FromImage(img)) 
{ 
    Print(g); 
    img.Save(fileName); 
} 
+0

Merci Fredrik, un peu ce que je pensais. Bitmap serait le moyen de continuer. –

+0

Vous êtes les bienvenus. Notez également la réponse de heavyd sur les formats d'image, au cas où vous voulez plus de contrôle sur le format, la profondeur de couleur et autres. –

2

Pour écrire votre objet graphique à un fichier image que vous pouvez faire quelque chose comme ceci:

public void SaveImage(Graphics surface) 
{ 
    Bitmap bmp = new Bitmap(50, 100, surface); 
    bmp.Save("filename.png", ImageFormat.Png); 
} 

Vous pouvez choisir d'autres formats de la classe ImageFormat tels que JPG, BMP, etc.

Questions connexes